Files
nutzwerte_fi4/app/Filament/Resources/Projektes/Tables/ProjektesTable.php
T
2026-06-23 08:46:48 +02:00

106 lines
4.4 KiB
PHP

<?php
namespace App\Filament\Resources\Projektes\Tables;
use App\Enums\ProjektStatus;
use App\Models\Auftraggeber;
use App\Models\Gutachter;
use App\Models\Projekte;
use App\Models\ProjektUser;
use Filament\Actions\Action;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Toggle;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn;
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\HtmlString;
use Illuminate\Database\Eloquent\Builder;
class ProjektesTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('id'),
ToggleColumn::make('meine')
->state(fn($record) => ProjektUser::where('user_id', auth()->user()->id)->where('projekte_id', $record->id)->count())
->beforeStateUpdated(function ($record, $state) {
if($state){
ProjektUser::create(['user_id' => auth()->user()->id, 'projekte_id' => $record->id]);
}else{
ProjektUser::where('user_id', auth()->user()->id)->where('projekte_id', $record->id)->delete();
}
}),
TextColumn::make('interner_name')
->tooltip(fn($record): HtmlString => new HtmlString($record->beschreibung))
->label('Interner Name')
->color('primary')
->wrap()
->searchable(),
TextColumn::make('offizieller_name')
->wrap()
->searchable()
->label('Offizieller Name'),
TextColumn::make('gutachter.company'),
TextColumn::make('auftraggeber.company'),
// TextColumn::make('ort'),
TextColumn::make('erstellung')->sortable(),
])
->striped()
->defaultSort('erstellung', direction: 'desc')
->persistSortInSession()
->persistFiltersInSession()
->filters([
Filter::make('meine')
->schema([
Toggle::make('meine')->label('Meine Projekte')
])->query(function (Builder $query, array $data): Builder {
return $query->when(
$data['meine'],
function (Builder $query, $meine) {
$query->whereHas('projekt_users', function ($query) {
$query->where('projekt_users.user_id', auth()->user()->id);
});
}
);
}),
SelectFilter::make('status')
->options(ProjektStatus::class),
SelectFilter::make('gutachter_id')
->label('Gutachter')
->preload()
->options(function () {
$res = Projekte::where('konto_id', Auth::user()->konto_id)
->groupBy('gutachter_id')
->pluck('gutachter_id')->toArray();
return Gutachter::query()->whereIn('id', $res)->orderBy('company')->pluck('company', 'id');
}),
SelectFilter::make('auftraggeber_id')
->label('Auftraggeber')
->preload()
->options(function () {
$res = Projekte::where('konto_id', Auth::user()->konto_id)
->groupBy('auftraggeber_id')
->pluck('auftraggeber_id')->toArray();
return Auftraggeber::query()->whereIn('id', $res)->orderBy('company')->pluck('company', 'id');
}),
], FiltersLayout::AboveContent)
->deferFilters(false)
->recordActions([
EditAction::make()->iconButton(),
Action::make('dokument_klonen')
->action(fn(Projekte $record) => $record->duplicate())
->iconButton()
->icon('phosphor-copy')
->requiresConfirmation(),
]);
}
}