diff --git a/app/Livewire/MapperLeft.php b/app/Livewire/MapperLeft.php index 53086f8f..30c80b46 100644 --- a/app/Livewire/MapperLeft.php +++ b/app/Livewire/MapperLeft.php @@ -3,19 +3,23 @@ namespace App\Livewire; use App\Filament\Tables\Columns\MapperLeftColumn; +use App\Models\CompetitionGroup; +use App\Models\Country; use App\Models\Event; use App\Models\Mapper; use Carbon\Carbon; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\Select; +use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Concerns\InteractsWithSchemas; use Filament\Schemas\Contracts\HasSchemas; use Filament\Support\Enums\Alignment; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; use Filament\Tables\Enums\FiltersLayout; -use Filament\Tables\Filters\SelectFilter; +use Filament\Tables\Filters\Filter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Livewire\Component; @@ -37,38 +41,71 @@ class MapperLeft extends Component implements HasActions, HasSchemas, HasTable ->columns([ MapperLeftColumn::make('left')->label(''), ]) - ->searchable(['competition_group.name', 'home.name', 'away.name']) + ->searchable(['home.name', 'away.name']) ->defaultPaginationPageOption(5) ->filters([ - SelectFilter::make('country_id') - ->relationship('country', 'name') - ->options( - fn (Builder $query) => $query->where('countries.tx_id', 'events.country_id')->where('events.betradar_id', 0)->where('events.starttime', '>', Carbon::now()) - ) - ->searchable() - ->preload() - ->multiple() - ->placeholder('Country') - ->label('Countries'), - SelectFilter::make('competition_group_id') - ->options(function () { - $res = Event::with('country')->with('competition_group')->where('starttime', '>', Carbon::now())->groupBy('competition_group_id')->get(); - $arr = []; - foreach ($res as $val) { - $arr[$val->competition_group_id] = $val->country?->name.' '.$val->competition_group->name; - } - asort($arr); + Filter::make('events') + ->schema([ + Select::make('country_id') + ->placeholder('Country') + ->hiddenLabel() + ->multiple() + ->label('') + ->columnSpan(2) + ->searchable() + ->preload() + ->options(function () { + $res = Event::query()->where('betradar_id', 0)->where('starttime', '>', Carbon::now())->groupBy('country_id')->pluck('country_id')->toArray(); - return $arr; + return Country::query()->whereIn('tx_id', $res)->pluck('name', 'tx_id'); + }) + ->live() + ->reactive() + ->afterStateUpdated(function (callable $set) { + $set('competition_group_id', null); + }), + Select::make('competition_group_id') + ->placeholder('League') + ->hiddenLabel() + ->label('') + ->columnSpan(2) + ->multiple() + ->searchable() + ->options(function (Get $get) { + if ($get('country_id')) { + $res = Event::query()->where('betradar_id', 0)->where('starttime', '>', Carbon::now())->where('country_id', $get('country_id'))->groupBy('competition_group_id')->pluck('competition_group_id')->toArray(); + } else { + $res = Event::query()->where('betradar_id', 0)->where('starttime', '>', Carbon::now())->groupBy('competition_group_id')->pluck('competition_group_id')->toArray(); + } + + $comps = CompetitionGroup::with('country')->whereIn('id', $res)->get(); + + $arr = []; + foreach ($comps as $val) { + if (isset($val->country->name)) { + $arr[$val->id] = $val->country->name.' - '.$val->name; + } else { + $arr[$val->id] = $val->name; + } + } + asort($arr); + + return $arr; + }) + ->live(), + ]) + ->query(function (Builder $query, array $data): Builder { + return $query + ->when( + $data['country_id'], + fn (Builder $query, $country_id) => $query->where('country_id', $country_id) + )->when( + $data['competition_group_id'], + fn (Builder $query, $competition_group_id) => $query->whereIn('competition_group_id', $competition_group_id) + ); }) - ->columnSpan(2) - ->searchable() - ->preload() - ->multiple() - ->placeholder('League') - ->label('Leagues'), + ->columns(4)->columnSpan(4), ], layout: FiltersLayout::AboveContent) - // ->hiddenFilterIndicators() ->filtersFormColumns(3) ->deferFilters(false) ->toolbarActions([ diff --git a/app/Livewire/MapperRight.php b/app/Livewire/MapperRight.php index 8b9a637e..a94ff967 100644 --- a/app/Livewire/MapperRight.php +++ b/app/Livewire/MapperRight.php @@ -8,14 +8,16 @@ use App\Models\Mapper; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\Select; use Filament\Schemas\Concerns\InteractsWithSchemas; use Filament\Schemas\Contracts\HasSchemas; use Filament\Support\Enums\Alignment; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; use Filament\Tables\Enums\FiltersLayout; -use Filament\Tables\Filters\SelectFilter; +use Filament\Tables\Filters\Filter; use Filament\Tables\Table; +use Illuminate\Database\Eloquent\Builder; use Livewire\Component; class MapperRight extends Component implements HasActions, HasSchemas, HasTable @@ -34,24 +36,48 @@ class MapperRight extends Component implements HasActions, HasSchemas, HasTable ->query(Mapper::query()) ->columns([ MapperRightColumn::make('right')->label(''), - ])->searchable(['group', 'home', 'away']) + ])->searchable(['home', 'away']) ->defaultPaginationPageOption(5) ->filters([ - SelectFilter::make('group_cc') - ->relationship('country_betsapi', 'name') - ->searchable() - ->preload() - ->multiple() - ->placeholder('Country') - ->label('Countries'), - SelectFilter::make('group_id') - ->options(fn () => Mapper::groupBy('group_id')->pluck('group', 'group_id')) - ->columnSpan(2) - ->searchable() - ->preload() - ->multiple() - ->placeholder('League') - ->label('Leagues'), + Filter::make('events') + ->schema([ + Select::make('group_cc') + ->placeholder('Country') + ->hiddenLabel() + ->label('') + ->relationship('country_betsapi', 'name') + ->searchable() + ->preload() + ->multiple() + ->columnSpan(2) + ->live() + ->reactive() + ->placeholder('Country') + ->label('Countries'), + Select::make('group_id') + ->placeholder('League') + ->hiddenLabel() + ->label('') + ->options(fn () => Mapper::groupBy('group_id')->pluck('group', 'group_id')) + ->columnSpan(2) + ->searchable() + ->preload() + ->multiple() + ->live() + ->placeholder('League') + ->label('Leagues'), + ]) + ->query(function (Builder $query, array $data): Builder { + return $query + ->when( + $data['group_cc'], + fn (Builder $query, $group_cc) => $query->where('group_cc', $group_cc) + )->when( + $data['group_id'], + fn (Builder $query, $group_id) => $query->whereIn('group_id', $group_id) + ); + }) + ->columns(4)->columnSpan(4), ], layout: FiltersLayout::AboveContent) // ->hiddenFilterIndicators() ->filtersFormColumns(3) diff --git a/app/Models/CompetitionGroup.php b/app/Models/CompetitionGroup.php index 9710e60e..cf285d78 100644 --- a/app/Models/CompetitionGroup.php +++ b/app/Models/CompetitionGroup.php @@ -20,6 +20,6 @@ class CompetitionGroup extends Model public function country() { - return $this->belongsTo(Country::class); + return $this->belongsTo(Country::class, 'country_id', 'tx_id')->where('disabled', 0)->where('is_country', 1); } }