components([ TextInput::make('title') ->label('Judul Pengumuman') ->placeholder('Pencairan Dana Kerja Sama Media') ->autocomplete(false) ->autofocus() ->required() ->columnSpanFull(), RichEditor::make('content') ->label('Isi Pengumuman') ->placeholder('Tuliskan detail pengumuman di sini...') ->required() ->columnSpanFull(), Radio::make('type') ->label('Tipe Pengumuman') ->options(AnnouncementType::class) ->required() ->default(AnnouncementType::PUBLIC->value) ->live() ->inline(), CheckboxList::make('partnerMedia') ->label('Penerima Khusus') ->relationship('partnerMedia', 'name', fn (Builder $query): Builder => $query->verified()) ->visible(fn (Get $get): bool => in_array($get('type'), [AnnouncementType::COMPANY, AnnouncementType::COMPANY->value])) ->required(fn (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 ->columns([ ...RowIndexColumn::make(), 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') ->label('Penerima') ->getStateUsing( fn ($record) => $record->partnerMedia->pluck('name')->toArray() ) ->listWithLineBreaks() ->limitList(3) ->expandableLimitedList() ->badge() ->placeholder( fn (Announcement $record) => $record->type === AnnouncementType::PUBLIC ? 'Publik' : 'Tidak ada penerima' ), ...TimestampColumns::make(), ]) ->filters([ SelectFilter::make('type') ->label('Tipe') ->options(AnnouncementType::class) ->native(false), TrashedFilter::make() ->native(false) ->visible(fn () => auth()->user()?->hasRole(RoleEnum::DEVELOPER->value)), ]) ->recordActions([ EditAction::make() ->modalWidth(Width::FiveExtraLarge) ->visible(fn (Announcement $record): bool => $record->type === AnnouncementType::PUBLIC), DeleteAction::make(), ForceDeleteAction::make(), RestoreAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('Pengumuman'), ]), ]) ->emptyStateIcon(Heroicon::OutlinedMegaphone) ->emptyStateDescription('Setelah Anda membuat data pertama, maka akan muncul disini.') ->defaultSort('created_at', 'desc') ->deferFilters(false) ->paginated([25, 50, 100, 'all']) ->deferLoading(); } public static function getPages(): array { return [ 'index' => ManageAnnouncements::route('/'), ]; } public static function getRecordRouteBindingEloquentQuery(): Builder { return parent::getRecordRouteBindingEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } }