components(static::getForm()); } public static function getForm(): array { return [ Tabs::make('Main') ->tabs([ Tab::make(__('filament::resources.tabs.Home')) ->icon('heroicon-o-home') ->schema([ TextInput::make('title') ->label(__('filament::resources.inputs.title')) ->required() ->autocomplete() ->maxLength(255) ->columnSpan('full'), TextInput::make('short_story') ->label(__('filament::resources.inputs.description')) ->required() ->maxLength(255) ->autocomplete() ->columnSpan('full'), FileUpload::make('image') ->label(__('filament::resources.inputs.image')) ->directory('website_news_images') ->visibility('public'), RichEditor::make('full_story') ->label(__('filament::resources.inputs.content')) ->required() ->columnSpan('full'), Hidden::make('user_id') ->default(Auth::id() ?? 0), ]), Tab::make(__('filament::resources.tabs.Configurations')) ->icon('heroicon-o-cog') ->schema([ Toggle::make('is_visible') ->label(__('filament::resources.inputs.visible')) ->onIcon('heroicon-s-check') ->offIcon('heroicon-s-x-mark') ->default(true) ->live() ->afterStateUpdated(function (string $operation, $state, $record) { /** @var WebsiteArticle $record */ if ($operation !== 'edit' || ! $record instanceof WebsiteArticle) { return; } try { if ($state) { $record->restore(); } else { $record->delete(); } } catch (Exception $e) { report($e); } }) ->formatStateUsing(function ($record) { if (is_null($record)) { return true; } return is_null($record->deleted_at); }), Toggle::make('can_comment') ->onIcon('heroicon-s-check') ->label(__('filament::resources.inputs.allow_comments')) ->default(true) ->offIcon('heroicon-s-x-mark'), ]), ])->columnSpanFull(), ]; } #[\Override] public static function table(Table $table): Table { return $table ->defaultSort('id', 'desc') ->poll('60s') ->columns(static::getTable()) ->filters([ TrashedFilter::make(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), DeleteAction::make(), RestoreAction::make(), ForceDeleteAction::make(), ]) ->toolbarActions([ DeleteBulkAction::make(), RestoreBulkAction::make(), ForceDeleteBulkAction::make(), ]); } public static function getTable(): array { return [ TextColumn::make('id') ->label(__('filament::resources.columns.id')), ImageColumn::make('image') ->circular() ->extraAttributes(['style' => 'image-rendering: pixelated']) ->size(50) ->label(__('filament::resources.columns.image')), TextColumn::make('title') ->label(__('filament::resources.columns.title')) ->searchable() ->limit(50), TextColumn::make('user.username') ->searchable() ->label(__('filament::resources.columns.by')), ToggleColumn::make('is_visible') ->label(__('filament::resources.columns.visible')) ->onIcon('heroicon-s-check') ->toggleable() ->state(fn ($record) => is_null($record->deleted_at)) ->disabled(), ToggleColumn::make('allow_comments') ->label(__('filament::resources.columns.allow_comments')) ->onIcon('heroicon-s-check') ->toggleable() ->disabled(), ]; } #[\Override] public static function getEloquentQuery(): Builder { return parent::getEloquentQuery()->withoutGlobalScopes([ SoftDeletingScope::class, ]); } #[\Override] public static function getRelations(): array { return [ TagsRelationManager::class, ]; } #[\Override] public static function getPages(): array { return [ 'index' => ListArticles::route('/'), 'create' => CreateArticle::route('/create'), 'view' => ViewArticle::route('/{record}'), 'edit' => EditArticle::route('/{record}/edit'), ]; } #[\Override] public static function getGlobalSearchEloquentQuery(): Builder { return parent::getGlobalSearchEloquentQuery()->withTrashed(); } }