simedkom/app/Filament/Resources/Publication/News/Schemas/NewsForm.php

121 lines
5.2 KiB
PHP

<?php
namespace App\Filament\Resources\Publication\News\Schemas;
use App\Enums\NewsStatus;
use App\Models\News;
use Filament\Forms\Components\Hidden;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\SpatieMediaLibraryFileUpload;
use Filament\Forms\Components\TagsInput;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Schema;
use Illuminate\Database\Eloquent\Builder;
class NewsForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Hidden::make('author_id')
->default(auth()->id()),
Section::make('Konten Berita ✍️')
->description('Tuliskan judul, ringkasan, dan isi lengkap berita Anda.')
->icon('heroicon-o-pencil-square')
->schema([
TextInput::make('title')
->label('Judul Berita')
->placeholder('Berita Purwakarta Hari Ini')
->autocomplete(false)
->autofocus()
->required()
->maxLength(200),
RichEditor::make('excerpt')
->label('Ringkasan (Excerpt)')
->placeholder('Berikan ringkasan singkat berita...')
->required()
->columnSpanFull(),
RichEditor::make('content')
->label('Isi Lengkap Berita')
->placeholder('Tuliskan konten berita secara mendetail...')
->required()
->columnSpanFull(),
])->columnSpan(2),
Section::make('Kategori & Publikasi 🏷️')
->description('Tentukan kategori, tautan media, dan status publikasi.')
->icon('heroicon-o-tag')
->schema([
TextInput::make('link')
->label('Tautan Media (Opsional)')
->placeholder('https://www.pwknews.com')
->autocomplete(false)
->nullable()
->maxLength(255)
->url(),
Select::make('categories')
->label('Kategori')
->relationship('categories', 'name', function (Builder $query): Builder {
return $query->active();
})
->native(false)
->multiple()
->preload()
->required(),
TagsInput::make('tags')
->label('Tag Berita')
->reactive()
->afterStateHydrated(function ($component, $state, $record): void {
if (! $record) {
return;
}
$component->state(
$record->tags->pluck('name')->toArray()
);
})
->helperText('Tekan enter untuk menambahkan tag.'),
Radio::make('status')
->label('Status Publikasi')
->required()
->options(NewsStatus::options())
->default(NewsStatus::PUBLISHED->value)
->inline()
->live()
->afterStateUpdated(function (Set $set, ?string $state, ?News $news): void {
if ($state == NewsStatus::PUBLISHED->value && ! $news?->published_at) {
$set('published_at', now());
} elseif ($state != NewsStatus::PUBLISHED->value && ! $news) {
$set('published_at', null);
}
})
->rules(['in:'.implode(',', NewsStatus::values())]),
SpatieMediaLibraryFileUpload::make('thumbnail')
->label('Thumbnail Utama')
->disk(config('filesystems.default'))
->acceptedFileTypes(['image/*'])
->maxSize(1024 * 3)
->collection('news')
->customProperties(fn (): array => [
'feature' => 'news',
'date' => now()->toDateString(),
])
->image()
->required(),
])->columnSpan(1),
])
->columns(3);
}
}