111 lines
4.7 KiB
PHP
111 lines
4.7 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\Projektes\Tables;
|
|
|
|
use App\Actions\Cloning\CloneProjekt;
|
|
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\Database\Eloquent\Builder;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\HtmlString;
|
|
|
|
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')
|
|
->badge()
|
|
->tooltip(fn ($record): HtmlString => new HtmlString($record->beschreibung))
|
|
->label('Interner Name')
|
|
->color(fn ($record): string => match ($record->status) {
|
|
'entwurf' => 'primary',
|
|
'endfassung' => 'success',
|
|
'klone' => 'danger',
|
|
})
|
|
->wrap()
|
|
->searchable(),
|
|
TextColumn::make('offizieller_name')
|
|
->wrap()
|
|
->searchable()
|
|
->label('Offizieller Name'),
|
|
TextColumn::make('gutachter.company'),
|
|
TextColumn::make('auftraggeber.company'),
|
|
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) => CloneProjekt::clone($record))
|
|
->iconButton()
|
|
->icon('phosphor-copy')
|
|
->requiresConfirmation(),
|
|
]);
|
|
}
|
|
}
|