components([ Hidden::make('author_id') ->default(auth()->id()), Section::make(CheerfulNotification::getMessage('Konten Berita ✍️', 'Konten Berita')) ->description(CheerfulNotification::getMessage('Yuk, tuliskan judul, ringkasan, dan isi lengkap berita Anda biar makin menarik! 🚀😊', 'Silakan tuliskan judul, ringkasan, dan isi lengkap berita Anda.')) ->icon(CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-pencil-square' : null) ->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(CheerfulNotification::getMessage('Kategori & Publikasi 🏷️', 'Kategori & Publikasi')) ->description(CheerfulNotification::getMessage('Tentukan kategori, tautan media, dan status publikasi biar berita kita gampang dicari! 🏷️✨', 'Tentukan kategori, tautan media, dan status publikasi.')) ->icon(CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-tag' : null) ->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); } }