Add dynamic template system: Implemented header, footer, and section templates with corresponding models, migrations, and Filament resources. Enhanced Page model to support dynamic templates and updated localization files for new terms. Added TemplateService for managing template data and rendering. Comprehensive documentation included for usage and best practices.

This commit is contained in:
Ümit Tunç
2025-10-31 14:53:34 -03:00
parent 0f78292c46
commit c042cb5114
46 changed files with 2709 additions and 0 deletions
@@ -0,0 +1,86 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates;
use App\Filament\Admin\Resources\FooterTemplates\Pages\CreateFooterTemplate;
use App\Filament\Admin\Resources\FooterTemplates\Pages\EditFooterTemplate;
use App\Filament\Admin\Resources\FooterTemplates\Pages\ListFooterTemplates;
use App\Filament\Admin\Resources\FooterTemplates\Pages\ViewFooterTemplate;
use App\Filament\Admin\Resources\FooterTemplates\Schemas\FooterTemplateForm;
use App\Filament\Admin\Resources\FooterTemplates\Schemas\FooterTemplateInfolist;
use App\Filament\Admin\Resources\FooterTemplates\Tables\FooterTemplatesTable;
use App\Models\FooterTemplate;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class FooterTemplateResource extends Resource
{
protected static ?string $model = FooterTemplate::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack;
public static function getNavigationGroup(): string
{
return __('footer-templates.navigation_group');
}
public static function getNavigationLabel(): string
{
return __('footer-templates.navigation_label');
}
public static function getModelLabel(): string
{
return __('footer-templates.model_label');
}
public static function getPluralModelLabel(): string
{
return __('footer-templates.plural_model_label');
}
public static function form(Schema $schema): Schema
{
return FooterTemplateForm::configure($schema);
}
public static function infolist(Schema $schema): Schema
{
return FooterTemplateInfolist::configure($schema);
}
public static function table(Table $table): Table
{
return FooterTemplatesTable::configure($table);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListFooterTemplates::route('/'),
'create' => CreateFooterTemplate::route('/create'),
'view' => ViewFooterTemplate::route('/{record}'),
'edit' => EditFooterTemplate::route('/{record}/edit'),
];
}
public static function getRecordRouteBindingEloquentQuery(): Builder
{
return parent::getRecordRouteBindingEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates\Pages;
use App\Filament\Admin\Resources\FooterTemplates\FooterTemplateResource;
use Filament\Resources\Pages\CreateRecord;
class CreateFooterTemplate extends CreateRecord
{
protected static string $resource = FooterTemplateResource::class;
}
@@ -0,0 +1,25 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates\Pages;
use App\Filament\Admin\Resources\FooterTemplates\FooterTemplateResource;
use Filament\Actions\DeleteAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Actions\ViewAction;
use Filament\Resources\Pages\EditRecord;
class EditFooterTemplate extends EditRecord
{
protected static string $resource = FooterTemplateResource::class;
protected function getHeaderActions(): array
{
return [
ViewAction::make(),
DeleteAction::make(),
ForceDeleteAction::make(),
RestoreAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates\Pages;
use App\Filament\Admin\Resources\FooterTemplates\FooterTemplateResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListFooterTemplates extends ListRecords
{
protected static string $resource = FooterTemplateResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates\Pages;
use App\Filament\Admin\Resources\FooterTemplates\FooterTemplateResource;
use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord;
class ViewFooterTemplate extends ViewRecord
{
protected static string $resource = FooterTemplateResource::class;
protected function getHeaderActions(): array
{
return [
EditAction::make(),
];
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates\Schemas;
use Filament\Forms\Components\CodeEditor;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
class FooterTemplateForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Section::make(__('footer-templates.section_general'))
->schema([
TextInput::make('title')
->label(__('footer-templates.field_title'))
->required()
->maxLength(255)
->columnSpanFull(),
CodeEditor::make('html_content')
->label(__('footer-templates.field_html_content'))
->required()
->lineNumbers()
->columnSpanFull()
->helperText(__('footer-templates.field_html_content_help')),
Toggle::make('is_active')
->label(__('footer-templates.field_is_active'))
->default(true)
->inline(false),
])
->columns(2),
]);
}
}
@@ -0,0 +1,16 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates\Schemas;
use Filament\Schemas\Schema;
class FooterTemplateInfolist
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
//
]);
}
}
@@ -0,0 +1,70 @@
<?php
namespace App\Filament\Admin\Resources\FooterTemplates\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Actions\ViewAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
class FooterTemplatesTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('title')
->label(__('footer-templates.column_title'))
->searchable()
->sortable(),
IconColumn::make('is_active')
->label(__('footer-templates.column_is_active'))
->boolean()
->sortable(),
TextColumn::make('pages_count')
->label(__('footer-templates.column_pages_count'))
->counts('pages')
->sortable(),
TextColumn::make('created_at')
->label(__('footer-templates.column_created_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->label(__('footer-templates.column_updated_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('deleted_at')
->label(__('footer-templates.column_deleted_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
TrashedFilter::make(),
])
->recordActions([
ViewAction::make(),
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
ForceDeleteBulkAction::make(),
RestoreBulkAction::make(),
]),
]);
}
}
@@ -0,0 +1,86 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates;
use App\Filament\Admin\Resources\HeaderTemplates\Pages\CreateHeaderTemplate;
use App\Filament\Admin\Resources\HeaderTemplates\Pages\EditHeaderTemplate;
use App\Filament\Admin\Resources\HeaderTemplates\Pages\ListHeaderTemplates;
use App\Filament\Admin\Resources\HeaderTemplates\Pages\ViewHeaderTemplate;
use App\Filament\Admin\Resources\HeaderTemplates\Schemas\HeaderTemplateForm;
use App\Filament\Admin\Resources\HeaderTemplates\Schemas\HeaderTemplateInfolist;
use App\Filament\Admin\Resources\HeaderTemplates\Tables\HeaderTemplatesTable;
use App\Models\HeaderTemplate;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class HeaderTemplateResource extends Resource
{
protected static ?string $model = HeaderTemplate::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack;
public static function getNavigationGroup(): string
{
return __('header-templates.navigation_group');
}
public static function getNavigationLabel(): string
{
return __('header-templates.navigation_label');
}
public static function getModelLabel(): string
{
return __('header-templates.model_label');
}
public static function getPluralModelLabel(): string
{
return __('header-templates.plural_model_label');
}
public static function form(Schema $schema): Schema
{
return HeaderTemplateForm::configure($schema);
}
public static function infolist(Schema $schema): Schema
{
return HeaderTemplateInfolist::configure($schema);
}
public static function table(Table $table): Table
{
return HeaderTemplatesTable::configure($table);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListHeaderTemplates::route('/'),
'create' => CreateHeaderTemplate::route('/create'),
'view' => ViewHeaderTemplate::route('/{record}'),
'edit' => EditHeaderTemplate::route('/{record}/edit'),
];
}
public static function getRecordRouteBindingEloquentQuery(): Builder
{
return parent::getRecordRouteBindingEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates\Pages;
use App\Filament\Admin\Resources\HeaderTemplates\HeaderTemplateResource;
use Filament\Resources\Pages\CreateRecord;
class CreateHeaderTemplate extends CreateRecord
{
protected static string $resource = HeaderTemplateResource::class;
}
@@ -0,0 +1,25 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates\Pages;
use App\Filament\Admin\Resources\HeaderTemplates\HeaderTemplateResource;
use Filament\Actions\DeleteAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Actions\ViewAction;
use Filament\Resources\Pages\EditRecord;
class EditHeaderTemplate extends EditRecord
{
protected static string $resource = HeaderTemplateResource::class;
protected function getHeaderActions(): array
{
return [
ViewAction::make(),
DeleteAction::make(),
ForceDeleteAction::make(),
RestoreAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates\Pages;
use App\Filament\Admin\Resources\HeaderTemplates\HeaderTemplateResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListHeaderTemplates extends ListRecords
{
protected static string $resource = HeaderTemplateResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates\Pages;
use App\Filament\Admin\Resources\HeaderTemplates\HeaderTemplateResource;
use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord;
class ViewHeaderTemplate extends ViewRecord
{
protected static string $resource = HeaderTemplateResource::class;
protected function getHeaderActions(): array
{
return [
EditAction::make(),
];
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates\Schemas;
use Filament\Forms\Components\CodeEditor;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
class HeaderTemplateForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Section::make(__('header-templates.section_general'))
->schema([
TextInput::make('title')
->label(__('header-templates.field_title'))
->required()
->maxLength(255)
->columnSpanFull(),
CodeEditor::make('html_content')
->label(__('header-templates.field_html_content'))
->required()
->lineNumbers()
->columnSpanFull()
->helperText(__('header-templates.field_html_content_help')),
Toggle::make('is_active')
->label(__('header-templates.field_is_active'))
->default(true)
->inline(false),
])
->columns(2),
]);
}
}
@@ -0,0 +1,16 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates\Schemas;
use Filament\Schemas\Schema;
class HeaderTemplateInfolist
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
//
]);
}
}
@@ -0,0 +1,70 @@
<?php
namespace App\Filament\Admin\Resources\HeaderTemplates\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Actions\ViewAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
class HeaderTemplatesTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('title')
->label(__('header-templates.column_title'))
->searchable()
->sortable(),
IconColumn::make('is_active')
->label(__('header-templates.column_is_active'))
->boolean()
->sortable(),
TextColumn::make('pages_count')
->label(__('header-templates.column_pages_count'))
->counts('pages')
->sortable(),
TextColumn::make('created_at')
->label(__('header-templates.column_created_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->label(__('header-templates.column_updated_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('deleted_at')
->label(__('header-templates.column_deleted_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
TrashedFilter::make(),
])
->recordActions([
ViewAction::make(),
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
ForceDeleteBulkAction::make(),
RestoreBulkAction::make(),
]),
]);
}
}
@@ -3,6 +3,10 @@
namespace App\Filament\Admin\Resources\Pages\Schemas;
use App\Filament\Admin\Resources\Components\TranslationTabs;
use App\Models\HeaderTemplate;
use App\Models\SectionTemplate;
use App\Models\FooterTemplate;
use App\Services\TemplateService;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\CodeEditor;
use Filament\Forms\Components\CodeEditor\Enums\Language;
@@ -19,7 +23,9 @@ use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Group;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Schema;
class PageForm
@@ -527,6 +533,88 @@ class PageForm
->collapsible(true)
->collapsed(false),
// Dynamic Template System
Section::make(__('pages.form_section_header_template'))
->description(__('pages.form_section_header_template_desc'))
->schema([
Select::make('header_template_id')
->label(__('pages.header_template_field'))
->options(HeaderTemplate::where('is_active', true)->pluck('title', 'id'))
->searchable()
->live()
->afterStateUpdated(fn (Set $set) => $set('header_data', []))
->columnSpanFull(),
Group::make()
->schema(fn (Get $get): array => TemplateService::generateDynamicFields(
HeaderTemplate::find($get('header_template_id')),
'header_data'
))
->visible(fn (Get $get): bool => filled($get('header_template_id')))
->columnSpanFull(),
])
->columnSpanFull()
->collapsible(true)
->collapsed(true),
Section::make(__('pages.form_section_template_sections'))
->description(__('pages.form_section_template_sections_desc'))
->schema([
Repeater::make('sections_data')
->label(__('pages.template_sections_field'))
->schema([
Select::make('section_template_id')
->label(__('pages.section_template_field'))
->options(SectionTemplate::where('is_active', true)->pluck('title', 'id'))
->searchable()
->live()
->required()
->columnSpanFull(),
Group::make()
->schema(fn (Get $get): array => TemplateService::generateDynamicFields(
SectionTemplate::find($get('section_template_id')),
'section_data'
))
->visible(fn (Get $get): bool => filled($get('section_template_id')))
->columnSpanFull(),
])
->defaultItems(0)
->addActionLabel(__('pages.add_template_section'))
->reorderable()
->collapsible()
->itemLabel(fn (array $state): ?string =>
SectionTemplate::find($state['section_template_id'] ?? null)?->title ?? __('pages.template_section')
)
->columnSpanFull(),
])
->columnSpanFull()
->collapsible(true)
->collapsed(true),
Section::make(__('pages.form_section_footer_template'))
->description(__('pages.form_section_footer_template_desc'))
->schema([
Select::make('footer_template_id')
->label(__('pages.footer_template_field'))
->options(FooterTemplate::where('is_active', true)->pluck('title', 'id'))
->searchable()
->live()
->afterStateUpdated(fn (Set $set) => $set('footer_data', []))
->columnSpanFull(),
Group::make()
->schema(fn (Get $get): array => TemplateService::generateDynamicFields(
FooterTemplate::find($get('footer_template_id')),
'footer_data'
))
->visible(fn (Get $get): bool => filled($get('footer_template_id')))
->columnSpanFull(),
])
->columnSpanFull()
->collapsible(true)
->collapsed(true),
// Çeviri Sekmesi
Section::make('🌍 ' . __('pages.translations_section'))
->schema([
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates\Pages;
use App\Filament\Admin\Resources\SectionTemplates\SectionTemplateResource;
use Filament\Resources\Pages\CreateRecord;
class CreateSectionTemplate extends CreateRecord
{
protected static string $resource = SectionTemplateResource::class;
}
@@ -0,0 +1,25 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates\Pages;
use App\Filament\Admin\Resources\SectionTemplates\SectionTemplateResource;
use Filament\Actions\DeleteAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Actions\ViewAction;
use Filament\Resources\Pages\EditRecord;
class EditSectionTemplate extends EditRecord
{
protected static string $resource = SectionTemplateResource::class;
protected function getHeaderActions(): array
{
return [
ViewAction::make(),
DeleteAction::make(),
ForceDeleteAction::make(),
RestoreAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates\Pages;
use App\Filament\Admin\Resources\SectionTemplates\SectionTemplateResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListSectionTemplates extends ListRecords
{
protected static string $resource = SectionTemplateResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates\Pages;
use App\Filament\Admin\Resources\SectionTemplates\SectionTemplateResource;
use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord;
class ViewSectionTemplate extends ViewRecord
{
protected static string $resource = SectionTemplateResource::class;
protected function getHeaderActions(): array
{
return [
EditAction::make(),
];
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates\Schemas;
use Filament\Forms\Components\CodeEditor;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
class SectionTemplateForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Section::make(__('section-templates.section_general'))
->schema([
TextInput::make('title')
->label(__('section-templates.field_title'))
->required()
->maxLength(255)
->columnSpanFull(),
CodeEditor::make('html_content')
->label(__('section-templates.field_html_content'))
->required()
->lineNumbers()
->columnSpanFull()
->helperText(__('section-templates.field_html_content_help')),
Toggle::make('is_active')
->label(__('section-templates.field_is_active'))
->default(true)
->inline(false),
])
->columns(2),
]);
}
}
@@ -0,0 +1,16 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates\Schemas;
use Filament\Schemas\Schema;
class SectionTemplateInfolist
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
//
]);
}
}
@@ -0,0 +1,86 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates;
use App\Filament\Admin\Resources\SectionTemplates\Pages\CreateSectionTemplate;
use App\Filament\Admin\Resources\SectionTemplates\Pages\EditSectionTemplate;
use App\Filament\Admin\Resources\SectionTemplates\Pages\ListSectionTemplates;
use App\Filament\Admin\Resources\SectionTemplates\Pages\ViewSectionTemplate;
use App\Filament\Admin\Resources\SectionTemplates\Schemas\SectionTemplateForm;
use App\Filament\Admin\Resources\SectionTemplates\Schemas\SectionTemplateInfolist;
use App\Filament\Admin\Resources\SectionTemplates\Tables\SectionTemplatesTable;
use App\Models\SectionTemplate;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class SectionTemplateResource extends Resource
{
protected static ?string $model = SectionTemplate::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack;
public static function getNavigationGroup(): string
{
return __('section-templates.navigation_group');
}
public static function getNavigationLabel(): string
{
return __('section-templates.navigation_label');
}
public static function getModelLabel(): string
{
return __('section-templates.model_label');
}
public static function getPluralModelLabel(): string
{
return __('section-templates.plural_model_label');
}
public static function form(Schema $schema): Schema
{
return SectionTemplateForm::configure($schema);
}
public static function infolist(Schema $schema): Schema
{
return SectionTemplateInfolist::configure($schema);
}
public static function table(Table $table): Table
{
return SectionTemplatesTable::configure($table);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListSectionTemplates::route('/'),
'create' => CreateSectionTemplate::route('/create'),
'view' => ViewSectionTemplate::route('/{record}'),
'edit' => EditSectionTemplate::route('/{record}/edit'),
];
}
public static function getRecordRouteBindingEloquentQuery(): Builder
{
return parent::getRecordRouteBindingEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}
@@ -0,0 +1,65 @@
<?php
namespace App\Filament\Admin\Resources\SectionTemplates\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Actions\ViewAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
class SectionTemplatesTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('title')
->label(__('section-templates.column_title'))
->searchable()
->sortable(),
IconColumn::make('is_active')
->label(__('section-templates.column_is_active'))
->boolean()
->sortable(),
TextColumn::make('created_at')
->label(__('section-templates.column_created_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->label(__('section-templates.column_updated_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('deleted_at')
->label(__('section-templates.column_deleted_at'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
TrashedFilter::make(),
])
->recordActions([
ViewAction::make(),
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
ForceDeleteBulkAction::make(),
RestoreBulkAction::make(),
]),
]);
}
}