count(); } public static function infolist(Schema $schema): Schema { return $schema ->schema([ Section::make(fn () => CheerfulNotification::getMessage('Informasi Pengirim ๐Ÿ“ง', 'Informasi Pengirim')) ->description(fn () => CheerfulNotification::getMessage('Cek detail identitas pengirim pesan biar makin kenal! ๐Ÿ“งโœจ', 'Detail mengenai identitas pengirim pesan.')) ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-user' : null) ->schema([ Grid::make(4) ->schema([ TextEntry::make('name') ->label('Nama Pengirim') ->icon('heroicon-o-user'), TextEntry::make('email') ->label('Alamat Surel') ->icon('heroicon-o-envelope'), TextEntry::make('subject') ->label('Subyek Pesan') ->icon('heroicon-o-tag'), TextEntry::make('created_at') ->label('Diterima Pada') ->date('l, d F Y H:i') ->icon('heroicon-o-calendar'), ]), ]) ->columnSpanFull(), Section::make(fn () => CheerfulNotification::getMessage('Isi Pesan ๐Ÿ’ฌ', 'Isi Pesan')) ->description(fn () => CheerfulNotification::getMessage('Yuk, baca pesan lengkap yang dikirimkan oleh pengguna! ๐Ÿ’ฌโœจ', 'Pesan lengkap yang dikirimkan oleh pengguna.')) ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-chat-bubble-left-right' : null) ->schema([ TextEntry::make('message') ->label('Konten Pesan') ->columnSpanFull(), ]) ->columnSpanFull(), Section::make(fn () => CheerfulNotification::getMessage('Riwayat Balasan ๐Ÿ“ค', 'Riwayat Balasan')) ->description(fn () => CheerfulNotification::getMessage('Lihat detail tanggapan yang sudah Admin berikan sebelumnya! ๐Ÿ“คโœจ', 'Detail mengenai tanggapan yang telah diberikan.')) ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-paper-airplane' : null) ->schema([ TextEntry::make('repliedBy.name') ->label('Dibalas Oleh') ->placeholder('Belum dibalas') ->icon('heroicon-o-user-circle'), TextEntry::make('replied_at') ->label('Waktu Balasan') ->date('l, d F Y H:i') ->placeholder('Belum dibalas') ->icon('heroicon-o-clock'), TextEntry::make('reply_message') ->label('Isi Balasan') ->placeholder('Belum dibalas') ->columnSpanFull(), ]) ->columnSpanFull() ->visible(fn (Contact $record): bool => $record->replied_at !== null), ]) ->columns(2); } public static function table(Table $table): Table { return $table ->columns([ ...RowIndexColumn::make(), TextColumn::make('name') ->label('Nama') ->searchable(), TextColumn::make('email') ->label('Email') ->searchable(), TextColumn::make('subject') ->label('Subyek') ->limit(30), IconColumn::make('replied_at') ->label('Dibalas') ->boolean() ->getStateUsing(fn (Contact $record): bool => $record->replied_at !== null), TextColumn::make('repliedBy.name') ->label('Dibalas Oleh') ->badge() ->placeholder('Belum dibalas') ->sortable(), TextColumn::make('created_at') ->label('Diterima pada') ->date('l, d F Y H:i') ->sortable(), ]) ->filters([ TernaryFilter::make('replied_at') ->label('Status Balasan') ->placeholder('Semua Pesan') ->trueLabel('Sudah Dibalas') ->falseLabel('Belum Dibalas') ->queries( true: fn ($query) => $query->whereNotNull('replied_at'), false: fn ($query) => $query->whereNull('replied_at'), ) ->native(false), ]) ->recordActions([ ViewAction::make() ->label('Lihat'), ReplyAction::make('reply'), DeleteAction::make() ->label('Hapus'), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('Kontak'), ]), ]) ->emptyStateIcon(Heroicon::OutlinedEnvelope) ->emptyStateDescription(fn () => CheerfulNotification::getMessage('Belum ada kontak atau pesan masuk nih! Santai dulu yuk. โœจโœ…', 'Belum ada kontak atau pesan masuk yang tersedia.')) ->defaultSort('created_at', 'desc') ->deferFilters(false) ->paginated([25, 50, 100, 'all']) ->deferLoading(); } public static function getPages(): array { return [ 'index' => ManageContacts::route('/'), ]; } }