diff --git a/app/Filament/Resources/ActivityResource.php b/app/Filament/Resources/ActivityResource.php index d5d1c751..0e712316 100644 --- a/app/Filament/Resources/ActivityResource.php +++ b/app/Filament/Resources/ActivityResource.php @@ -9,6 +9,8 @@ use Blumilk\Website\Models\Activity; use Exception; use Filament\Forms; +use Filament\Forms\Components\Section; +use Filament\Forms\Components\Split; use Filament\Forms\Form; use Filament\Resources\Concerns\Translatable; use Filament\Resources\Resource; @@ -32,37 +34,43 @@ public static function form(Form $form): Form { return $form ->schema([ - TranslatableContainer::make( - Forms\Components\TextInput::make("title") - ->label("Tytuł") - ->required() - ->maxLength(255), - )->requiredLocales(config("app.translatable_locales")), - TranslatableContainer::make( - Forms\Components\TextInput::make("subtitle") - ->label("Podtytuł") - ->maxLength(255), - )->requiredLocales(config("app.translatable_locales")), - Forms\Components\Checkbox::make("published") - ->label("Opublikowane"), - Forms\Components\DateTimePicker::make("published_at") - ->format(DateFormats::DATE_DISPLAY) - ->time(false) - ->required() - ->label("Data publikacji"), - Forms\Components\FileUpload::make("photo") - ->label("Zdjęcie") - ->required() - ->directory(Activity::PHOTOS_DIRECTORY) - ->multiple(false) - ->maxSize(1000), - TranslatableContainer::make( - Forms\Components\Textarea::make("description") - ->label("Opis") - ->required() - ->maxLength(65000), - )->requiredLocales(config("app.translatable_locales")), - ]); + Split::make([ + Section::make([ + TranslatableContainer::make( + Forms\Components\TextInput::make("title") + ->label("Tytuł") + ->required() + ->maxLength(255), + )->requiredLocales(config("app.translatable_locales")), + TranslatableContainer::make( + Forms\Components\TextInput::make("subtitle") + ->label("Podtytuł") + ->maxLength(255), + )->requiredLocales(config("app.translatable_locales")), + Forms\Components\Checkbox::make("published") + ->label("Opublikowane"), + Forms\Components\DateTimePicker::make("published_at") + ->format(DateFormats::DATE_DISPLAY) + ->time(false) + ->requiredUnless("published", true) + ->label("Data publikacji"), + ]), + Section::make([ + TranslatableContainer::make( + Forms\Components\Textarea::make("description") + ->label("Opis") + ->required() + ->maxLength(65000), + )->requiredLocales(config("app.translatable_locales")), + Forms\Components\FileUpload::make("photo") + ->label("Zdjęcie") + ->required() + ->directory(Activity::PHOTOS_DIRECTORY) + ->multiple(false) + ->maxSize(1000), + ]), + ])->from("lg"), + ])->columns(1); } /** diff --git a/app/Filament/Resources/ActivityResource/Pages/EditActivity.php b/app/Filament/Resources/ActivityResource/Pages/EditActivity.php index 84d6ad03..80657700 100644 --- a/app/Filament/Resources/ActivityResource/Pages/EditActivity.php +++ b/app/Filament/Resources/ActivityResource/Pages/EditActivity.php @@ -5,9 +5,17 @@ namespace Blumilk\Website\Filament\Resources\ActivityResource\Pages; use Blumilk\Website\Filament\Resources\ActivityResource; -use Filament\Resources\Pages\EditRecord; +use Blumilk\Website\Filament\Resources\BaseResource\Pages\BaseEditRecord; +use Filament\Actions; -class EditActivity extends EditRecord +class EditActivity extends BaseEditRecord { protected static string $resource = ActivityResource::class; + + protected function getHeaderActions(): array + { + return [ + Actions\DeleteAction::make(), + ]; + } } diff --git a/app/Filament/Resources/ActivityResource/Pages/ListActivities.php b/app/Filament/Resources/ActivityResource/Pages/ListActivities.php index 088832e6..a66fd748 100644 --- a/app/Filament/Resources/ActivityResource/Pages/ListActivities.php +++ b/app/Filament/Resources/ActivityResource/Pages/ListActivities.php @@ -5,17 +5,9 @@ namespace Blumilk\Website\Filament\Resources\ActivityResource\Pages; use Blumilk\Website\Filament\Resources\ActivityResource; -use Filament\Actions; -use Filament\Resources\Pages\ListRecords; +use Blumilk\Website\Filament\Resources\BaseResource\Pages\BaseListRecord; -class ListActivities extends ListRecords +class ListActivities extends BaseListRecord { protected static string $resource = ActivityResource::class; - - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make(), - ]; - } } diff --git a/app/Filament/Resources/BaseResource/Pages/BaseEditRecord.php b/app/Filament/Resources/BaseResource/Pages/BaseEditRecord.php new file mode 100644 index 00000000..6f91bd31 --- /dev/null +++ b/app/Filament/Resources/BaseResource/Pages/BaseEditRecord.php @@ -0,0 +1,15 @@ +previousUrl ?? $this->getResource()::getUrl("index"); + } +} diff --git a/app/Filament/Resources/BaseResource/Pages/BaseListRecord.php b/app/Filament/Resources/BaseResource/Pages/BaseListRecord.php new file mode 100644 index 00000000..5ca71c6a --- /dev/null +++ b/app/Filament/Resources/BaseResource/Pages/BaseListRecord.php @@ -0,0 +1,18 @@ +schema([ + Split::make([ + Section::make([ + TranslatableContainer::make( + Forms\Components\TextInput::make("name") + ->label("Nazwa realizacji") + ->required() + ->maxLength(255), + )->requiredLocales(config("app.translatable_locales")), + Forms\Components\TextInput::make("company") + ->label("Firma") + ->required() + ->maxLength(255), + Forms\Components\TextInput::make("slug") + ->label("Slug") + ->required() + ->unique(ignoreRecord: true) + ->alphaDash() + ->maxLength(255), + Forms\Components\Select::make("template") + ->label("Szablon") + ->options(fn(): array => self::getTemplateOptions()) + ->native(false), + Forms\Components\Checkbox::make("published") + ->label("Opublikowane"), + ]), + Section::make([ + TranslatableContainer::make( + Forms\Components\Textarea::make("description") + ->label("Opis") + ->required() + ->maxLength(65000), + )->requiredLocales(config("app.translatable_locales")), + Forms\Components\FileUpload::make("photo") + ->label("Zdjęcie") + ->directory(CaseStudy::PHOTOS_DIRECTORY) + ->imageEditor() + ->rules(["mimes:jpeg,png,webp"]) + ->required() + ->multiple(false) + ->maxSize(1000), + ]), + ])->from("lg"), + ])->columns(1); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make("name") + ->label("Nazwa realizacji") + ->searchable(), + Tables\Columns\TextColumn::make("template") + ->getStateUsing(fn(CaseStudy $record): string => $record->template ?: "-") + ->label("Szablon"), + Tables\Columns\CheckboxColumn::make("published") + ->label("Opublikowane"), + ]) + ->filters([ + TernaryFilter::make("published") + ->label("Status publikacji") + ->placeholder("Wszystkie") + ->trueLabel("Opublikowane") + ->falseLabel("Nieopublikowane"), + ]) + ->actions([ + Tables\Actions\ViewAction::make(), + Tables\Actions\EditAction::make(), + Tables\Actions\DeleteAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getPages(): array + { + return [ + "index" => Pages\ListCaseStudies::route("/"), + "create" => Pages\CreateCaseStudy::route("/create"), + "edit" => Pages\EditCaseStudy::route("/{record}/edit"), + ]; + } + + protected static function getTemplateOptions(): array + { + $files = scandir(resource_path("views/case-studies")); + $options = []; + + foreach ($files as $file) { + if (str_ends_with($file, ".blade.php")) { + $options[$file] = $file; + } + } + + return $options; + } +} diff --git a/app/Filament/Resources/CaseStudyResource/Pages/CreateCaseStudy.php b/app/Filament/Resources/CaseStudyResource/Pages/CreateCaseStudy.php new file mode 100644 index 00000000..e493e678 --- /dev/null +++ b/app/Filament/Resources/CaseStudyResource/Pages/CreateCaseStudy.php @@ -0,0 +1,13 @@ + "array", + "description" => "array", + "published" => "boolean", + ]; +} diff --git a/database/factories/CaseStudyFactory.php b/database/factories/CaseStudyFactory.php new file mode 100644 index 00000000..65c2f874 --- /dev/null +++ b/database/factories/CaseStudyFactory.php @@ -0,0 +1,29 @@ + + */ +class CaseStudyFactory extends Factory +{ + public function definition(): array + { + $locales = config("app.translatable_locales"); + + return [ + "name" => $this->translations($locales, $this->faker->sentence), + "description" => $this->translations($locales, $this->faker->paragraph), + "photo" => sprintf("%s/%s", Activity::PHOTOS_DIRECTORY, $this->faker->image("public/storage/activities", width: 240, height: 240, fullPath: false)), + "published" => $this->faker->boolean, + "company" => $this->faker->company, + "slug" => $this->faker->slug, + "template" => "example-template.blade.php", + ]; + } +} diff --git a/database/migrations/2024_04_19_091339_create_case_studies_table.php b/database/migrations/2024_04_19_091339_create_case_studies_table.php new file mode 100644 index 00000000..1658dff5 --- /dev/null +++ b/database/migrations/2024_04_19_091339_create_case_studies_table.php @@ -0,0 +1,29 @@ +id(); + $table->string("photo"); + $table->string("company"); + $table->string("slug"); + $table->string("template")->nullable(); + $table->json("name"); + $table->json("description"); + $table->boolean("published")->default(false); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists("case_studies"); + } +}; diff --git a/database/seeders/LocalEnvironmentSeeder.php b/database/seeders/LocalEnvironmentSeeder.php index 4c405477..06b2a4d1 100644 --- a/database/seeders/LocalEnvironmentSeeder.php +++ b/database/seeders/LocalEnvironmentSeeder.php @@ -5,6 +5,7 @@ namespace Database\Seeders; use Blumilk\Website\Models\Activity; +use Blumilk\Website\Models\CaseStudy; use Blumilk\Website\Models\User; use Illuminate\Database\Seeder; @@ -18,5 +19,6 @@ public function run(): void User::factory()->create(["email" => "admin@example.com"]); Activity::factory()->count(12)->create(); + CaseStudy::factory()->count(12)->create(); } } diff --git a/resources/views/case-studies/example-template.blade.php b/resources/views/case-studies/example-template.blade.php new file mode 100644 index 00000000..cfa94431 --- /dev/null +++ b/resources/views/case-studies/example-template.blade.php @@ -0,0 +1,3 @@ +