schema([ SchemaTabs::make('Übersetzungen') ->tabs([ SchemaTab::make('Deutsch') ->schema([ TextInput::make('title_de') ->label('Titel') ->required() ->maxLength(255) ->live() ->afterStateUpdated(function (Get $get, Set $set, ?string $old, ?string $state) { if (($get('slug') ?? '') !== Str::slug($state)) { return; } $set('slug', Str::slug($state)); }), MarkdownEditor::make('content_de') ->label('Inhalt') ->required() ->columnSpanFull(), TextInput::make('excerpt_de') ->label('Auszug') ->maxLength(255), TextInput::make('meta_title_de') ->label('Meta-Titel') ->maxLength(255), Textarea::make('meta_description_de') ->label('Meta-Beschreibung') ->maxLength(65535) ->columnSpanFull(), ]) ->columns(2), SchemaTab::make('Englisch') ->schema([ TextInput::make('title_en') ->label('Titel') ->maxLength(255), MarkdownEditor::make('content_en') ->label('Inhalt') ->columnSpanFull(), TextInput::make('excerpt_en') ->label('Auszug') ->maxLength(255), TextInput::make('meta_title_en') ->label('Meta-Titel') ->maxLength(255), Textarea::make('meta_description_en') ->label('Meta-Beschreibung') ->maxLength(65535) ->columnSpanFull(), ]) ->columns(2), ]), TextInput::make('slug') ->label('Slug') ->required() ->unique(BlogPost::class, 'slug', ignoreRecord: true) ->maxLength(255), Section::make('Bild und Kategorie') ->schema([ FileUpload::make('featured_image') ->label('Featured Image') ->image() ->directory('blog') ->visibility('public'), Select::make('category_id') ->label('Kategorie') ->relationship('category', 'name_de') ->required() ->preload() ->createOptionForm([ TextInput::make('name_de') ->label('Name (DE)') ->required() ->maxLength(255) ->afterStateUpdated(fn (Set $set, $state) => $set('name_en', $state)), TextInput::make('slug') ->label('Slug') ->required() ->unique(\App\Models\BlogCategory::class, 'slug', ignoreRecord: true) ->maxLength(255), ]), ]) ->columns(2), Section::make('Veröffentlichung') ->schema([ Toggle::make('is_published') ->label('Veröffentlicht'), DateTimePicker::make('published_at') ->label('Veröffentlicht am') ->displayFormat('Y-m-d H:i:s') ->default(now()), ]), ]); } public static function mutateFormDataBeforeCreate(array $data): array { $data['translations'] = [ 'title' => [ 'de' => $data['title_de'] ?? '', 'en' => $data['title_en'] ?? '', ], 'content' => [ 'de' => $data['content_de'] ?? '', 'en' => $data['content_en'] ?? '', ], 'excerpt' => [ 'de' => $data['excerpt_de'] ?? '', 'en' => $data['excerpt_en'] ?? '', ], 'meta_title' => [ 'de' => $data['meta_title_de'] ?? '', 'en' => $data['meta_title_en'] ?? '', ], 'meta_description' => [ 'de' => $data['meta_description_de'] ?? '', 'en' => $data['meta_description_en'] ?? '', ], ]; unset($data['title_de'], $data['title_en'], $data['content_de'], $data['content_en'], $data['excerpt_de'], $data['excerpt_en'], $data['meta_title_de'], $data['meta_title_en'], $data['meta_description_de'], $data['meta_description_en']); return $data; } public static function mutateFormDataBeforeFill(array $data): array { $record = static::getModel()::find(request()?->route()?->parameter('record') ?? request()?->input('record_id') ?? null); if (!$record) { return $data; } $data['title_de'] = $record->getTranslation('title', 'de'); $data['title_en'] = $record->getTranslation('title', 'en'); $data['content_de'] = $record->getTranslation('content', 'de'); $data['content_en'] = $record->getTranslation('content', 'en'); $data['excerpt_de'] = $record->getTranslation('excerpt', 'de'); $data['excerpt_en'] = $record->getTranslation('excerpt', 'en'); $data['meta_title_de'] = $record->getTranslation('meta_title', 'de'); $data['meta_title_en'] = $record->getTranslation('meta_title', 'en'); $data['meta_description_de'] = $record->getTranslation('meta_description', 'de'); $data['meta_description_en'] = $record->getTranslation('meta_description', 'en'); return $data; } public static function mutateFormDataBeforeSave(array $data): array { $data['translations'] = [ 'title' => [ 'de' => $data['title_de'] ?? '', 'en' => $data['title_en'] ?? '', ], 'content' => [ 'de' => $data['content_de'] ?? '', 'en' => $data['content_en'] ?? '', ], 'excerpt' => [ 'de' => $data['excerpt_de'] ?? '', 'en' => $data['excerpt_en'] ?? '', ], 'meta_title' => [ 'de' => $data['meta_title_de'] ?? '', 'en' => $data['meta_title_en'] ?? '', ], 'meta_description' => [ 'de' => $data['meta_description_de'] ?? '', 'en' => $data['meta_description_en'] ?? '', ], ]; unset($data['title_de'], $data['title_en'], $data['content_de'], $data['content_en'], $data['excerpt_de'], $data['excerpt_en'], $data['meta_title_de'], $data['meta_title_en'], $data['meta_description_de'], $data['meta_description_en']); return $data; } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('title') ->label('Titel (DE)') ->getStateUsing(fn ($record) => $record->getTranslation('title', 'de')) ->searchable() ->sortable(), TextColumn::make('category.name_de') ->label('Kategorie') ->badge() ->color('primary'), IconColumn::make('is_published') ->label('Veröffentlicht') ->boolean() ->trueIcon('heroicon-o-check-circle') ->falseIcon('heroicon-o-x-circle'), TextColumn::make('published_at') ->label('Veröffentlicht am') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('created_at') ->label('Erstellt am') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ TernaryFilter::make('is_published') ->label('Veröffentlicht'), ]) ->actions([ ViewAction::make(), EditAction::make(), DeleteAction::make(), ]) ->bulkActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => Pages\ListPosts::route('/'), 'create' => Pages\CreatePost::route('/create'), 'view' => Pages\ViewPost::route('/{record}'), 'edit' => Pages\EditPost::route('/{record}/edit'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } }