columns([ TextColumn::make('title') ->label(__('proposal.table_title')) ->searchable() ->sortable() ->limit(40), TextColumn::make('client_name') ->label(__('proposal.table_client')) ->searchable() ->sortable() ->limit(30), TextColumn::make('total_price') ->label(__('proposal.table_price')) ->money(fn ($record) => $record->currency) ->sortable(), TextColumn::make('status') ->label(__('proposal.table_status')) ->badge() ->color(fn (string $state): string => match ($state) { 'draft' => 'gray', 'sent' => 'info', 'accepted' => 'success', 'rejected' => 'danger', 'revised' => 'warning', default => 'gray', }) ->formatStateUsing(fn (string $state): string => match ($state) { 'draft' => __('proposal.status_draft'), 'sent' => __('proposal.status_sent'), 'accepted' => __('proposal.status_accepted'), 'rejected' => __('proposal.status_rejected'), 'revised' => __('proposal.status_revised'), default => $state, }), TextColumn::make('slug') ->label(__('proposal.table_slug')) ->searchable() ->copyable() ->copyMessage(__('proposal.link_copied')) ->icon('heroicon-o-document-duplicate') ->limit(25), TextColumn::make('valid_until') ->label(__('proposal.table_valid_until')) ->date('d.m.Y') ->sortable(), TextColumn::make('views_count') ->label(__('proposal.table_views')) ->sortable() ->alignCenter(), TextColumn::make('created_at') ->label(__('proposal.table_created_at')) ->dateTime('d.m.Y H:i') ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ SelectFilter::make('status') ->label(__('proposal.status_field')) ->options([ 'draft' => __('proposal.status_draft'), 'sent' => __('proposal.status_sent'), 'accepted' => __('proposal.status_accepted'), 'rejected' => __('proposal.status_rejected'), 'revised' => __('proposal.status_revised'), ]), ]) ->recordActions([ EditAction::make() ->label(__('proposal.edit')), ]) ->actions([ Action::make('view_proposal') ->label(__('proposal.preview')) ->icon('heroicon-o-eye') ->url(fn ($record) => route('proposals.show', $record->slug)) ->openUrlInNewTab(), ]) ->bulkActions([ BulkActionGroup::make([ DeleteBulkAction::make() ->label(__('proposal.delete')), ]), ]) ->defaultSort('created_at', 'desc'); } }