components([ TextInput::make('title') ->label('Judul') ->placeholder('Pencairan Dana Kerja Sama Media') ->autocomplete(false) ->autofocus() ->required() ->maxLength(200) ->columnSpanFull(), RichEditor::make('content') ->label('Konten') ->placeholder('...') ->required() ->columnSpanFull(), Radio::make('type') ->label('Tipe') ->options(AnnouncementType::class) ->required() ->default(AnnouncementType::PUBLIC->value) ->live() ->inline(), CheckboxList::make('partnerMedia') ->label('Kirim Kepada') ->relationship('partnerMedia', 'name', fn (Builder $query): Builder => $query->verified()) ->visible(fn (\Filament\Schemas\Components\Utilities\Get $get): bool => in_array($get('type'), [AnnouncementType::COMPANY, AnnouncementType::COMPANY->value])) ->required(fn (\Filament\Schemas\Components\Utilities\Get $get): bool => in_array($get('type'), [AnnouncementType::COMPANY, AnnouncementType::COMPANY->value])) ->searchable() ->noSearchResultsMessage('Tidak ada media yang ditemukan.') ->helperText('Pilih media yang akan menerima pengumuman ini') ->columnSpanFull() ->bulkToggleable() ->selectAllAction( fn (Action $action): Action => $action->label('Pilih Semua Media'), ) ->dehydrated(), ]) ->columns(1); } public static function table(Table $table): Table { return $table ->recordTitleAttribute('content') ->columns([ TextColumn::make('title') ->label('Judul') ->searchable() ->sortable() ->wrap(), TextColumn::make('content') ->label('Konten') ->searchable() ->sortable() ->wrap() ->limit(100) ->html() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('type') ->label('Tipe') ->badge() ->sortable(), TextColumn::make('partnerMedia.name') ->label('Penerima') ->listWithLineBreaks() ->limitList(3) ->expandableLimitedList() ->placeholder(fn (Announcement $record): string => $record->type === AnnouncementType::PUBLIC ? 'Publik' : 'Tidak ada penerima'), ...TimestampColumns::make(), ]) ->filters([ TrashedFilter::make()->native(false), ]) ->recordActions([ EditAction::make() ->modalWidth(Width::TwoExtraLarge) ->visible(fn (Announcement $record): bool => $record->type === AnnouncementType::PUBLIC), DeleteAction::make(), ForceDeleteAction::make(), RestoreAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('Pengumuman'), ]), ]) ->emptyStateIcon(Heroicon::Megaphone) ->emptyStateDescription('Setelah Anda membuat data pertama, maka akan muncul disini.') ->defaultSort('created_at', 'desc') ->deferFilters(false); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => ManageAnnouncements::route('/'), ]; } public static function getRecordRouteBindingEloquentQuery(): Builder { return parent::getRecordRouteBindingEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } }