From 26052c6cfd9463e88e5560716b3ef1219a3476fc Mon Sep 17 00:00:00 2001 From: salam Date: Sun, 13 Sep 2026 15:40:30 +0200 Subject: [PATCH] wip --- .../Clusters/Grapper/GrapperCluster.php | 2 +- app/Filament/Pages/EventMapper.php | 22 +- app/Filament/Pages/PlayerProps.php | 283 ++++++++++++++++++ app/Filament/Pages/Statistic.php | 59 ++-- .../Resources/Events/EventResource.php | 2 + app/Filament/Widgets/PlayerPropsDrop.php | 16 + app/Filament/Widgets/PlayerPropsTable.php | 144 +++++++++ app/Filament/Widgets/StatsMedianAverage.php | 3 +- app/Livewire/PlayerCalculator.php | 15 +- app/Providers/Filament/AdminPanelProvider.php | 4 +- composer.lock | 18 +- public/images/soccerfield-af3.jpg | Bin 0 -> 70716 bytes resources/css/filament/admin/theme.css | 17 ++ .../filament/pages/player-props.blade.php | 3 + .../livewire/player-props-drop.blade.php | 68 +++++ 15 files changed, 594 insertions(+), 62 deletions(-) create mode 100644 app/Filament/Pages/PlayerProps.php create mode 100644 app/Filament/Widgets/PlayerPropsDrop.php create mode 100644 app/Filament/Widgets/PlayerPropsTable.php create mode 100644 public/images/soccerfield-af3.jpg create mode 100644 resources/views/filament/pages/player-props.blade.php create mode 100644 resources/views/livewire/player-props-drop.blade.php diff --git a/app/Filament/Clusters/Grapper/GrapperCluster.php b/app/Filament/Clusters/Grapper/GrapperCluster.php index 071ac452..a77d2b07 100644 --- a/app/Filament/Clusters/Grapper/GrapperCluster.php +++ b/app/Filament/Clusters/Grapper/GrapperCluster.php @@ -9,5 +9,5 @@ class GrapperCluster extends Cluster { protected static string|BackedEnum|null $navigationIcon = 'phosphor-rss'; - protected static ?int $navigationSort = 3; + protected static ?int $navigationSort = 5; } diff --git a/app/Filament/Pages/EventMapper.php b/app/Filament/Pages/EventMapper.php index b3f5805b..2ed6b7c0 100644 --- a/app/Filament/Pages/EventMapper.php +++ b/app/Filament/Pages/EventMapper.php @@ -26,7 +26,7 @@ class EventMapper extends Page protected ?string $heading = ''; - protected static ?int $navigationSort = 3; // Smaller number = higher up + protected static ?int $navigationSort = 4; // Smaller number = higher up // protected static ?int $navigationSort = 100; @@ -36,7 +36,7 @@ class EventMapper extends Page ActionGroup::make([ Action::make('bet365') ->extraAttributes(['x-on:click' => 'toggle']) - ->visible(fn(): bool => auth()->user()->provider_id != 2) + ->visible(fn (): bool => auth()->user()->provider_id != 2) ->action(function ($livewire) { User::where('id', auth()->user()->id)->update(['provider_id' => 2]); @@ -49,8 +49,8 @@ class EventMapper extends Page Action::make('magloo_nigeria') ->label('MAGLOO NIGERIA') ->extraAttributes(['x-on:click' => 'toggle']) - ->visible(fn(): bool => in_array(auth()->user()->provider_id, [2, 4])) - ->hidden(fn(): bool => ! in_array(auth()->user()->bookmaker_id, [10, 16])) + ->visible(fn (): bool => in_array(auth()->user()->provider_id, [2, 4])) + ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [10, 16])) ->action(function ($livewire) { User::where('id', auth()->user()->id)->update(['provider_id' => 3]); $livewire->dispatch('refresh'); @@ -63,8 +63,8 @@ class EventMapper extends Page Action::make('magloo_kenia') ->label('MAGLOO KENIA') ->extraAttributes(['x-on:click' => 'toggle']) - ->visible(fn(): bool => in_array(auth()->user()->provider_id, [2, 3])) - ->hidden(fn(): bool => ! in_array(auth()->user()->bookmaker_id, [10, 16])) + ->visible(fn (): bool => in_array(auth()->user()->provider_id, [2, 3])) + ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [10, 16])) ->action(function ($livewire) { User::where('id', auth()->user()->id)->update(['provider_id' => 4]); $livewire->dispatch('refresh'); @@ -77,8 +77,8 @@ class EventMapper extends Page Action::make('logifuture_nigeria') ->label('LOGIFUTURE NIGERA') ->extraAttributes(['x-on:click' => 'toggle']) - ->visible(fn(): bool => auth()->user()->provider_id == 6) - ->hidden(fn(): bool => ! in_array(auth()->user()->bookmaker_id, [35, 36])) + ->visible(fn (): bool => auth()->user()->provider_id == 6) + ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [35, 36])) ->action(function ($livewire) { User::where('id', auth()->user()->id)->update(['provider_id' => 5]); @@ -92,8 +92,8 @@ class EventMapper extends Page Action::make('logifuture_colombia') ->label('LOGIFUTURE COLOMBIA') ->extraAttributes(['x-on:click' => 'toggle']) - ->visible(fn(): bool => auth()->user()->provider_id == 5) - ->hidden(fn(): bool => ! in_array(auth()->user()->bookmaker_id, [35, 36])) + ->visible(fn (): bool => auth()->user()->provider_id == 5) + ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [35, 36])) ->action(function ($livewire) { User::where('id', auth()->user()->id)->update(['provider_id' => 6]); @@ -107,7 +107,7 @@ class EventMapper extends Page ]) ->label('Swop Bookmaker') ->icon('phosphor-dots-three-vertical') - ->visible(fn(): bool => auth()->user()->hasRole('mapper_source_betsapi')) + ->visible(fn (): bool => auth()->user()->hasRole('mapper_source_betsapi')) ->color('primary') ->button(), ]; diff --git a/app/Filament/Pages/PlayerProps.php b/app/Filament/Pages/PlayerProps.php new file mode 100644 index 00000000..21d293b0 --- /dev/null +++ b/app/Filament/Pages/PlayerProps.php @@ -0,0 +1,283 @@ +form->fill(); + + $this->activeBoxes = $this->boxNames(); + $this->lineUpMap = $this->linUpMap(); + $this->lineUpOptinos = $this->lineUpOptinos(); + $this->lineup = $this->lineUpMap[$this->lineupActive]; + + for ($i = 1; $i <= 35; $i++) { + $this->boxes[$i] = []; + if (isset($this->activeBoxes[$i])) { + $this->beschriftung[$i] = $this->activeBoxes[$i]; + } else { + $this->beschriftung[$i] = ''; + } + } + } + + public function getWidgetData(): array + { + return [ + 'beschriftung' => $this->beschriftung, + 'lineup' => $this->lineup, + 'boxes' => $this->boxes, + ]; + } + + public function form(Schema $schema): Schema + { + return $schema + ->columns(4) + ->components([ + Select::make('cid') + ->live() + ->preload() + ->searchable(false) + ->prefixIconColor(fn (Get $get): string => $get('cid') ? 'success' : 'danger') + ->prefixIcon('phosphor-globe-fill') + ->hiddenLabel() + ->options(fn () => LoadSofaScoreCategory::load()) + ->placeholder('Country') + ->afterStateUpdated(function (callable $set, $state) { + $set('lid', null); + $set('mid', null); + $set('tid', null); + }), + Select::make('lid') + ->live() + ->preload() + ->prefixIconColor(fn (Get $get): string => $get('lid') ? 'success' : 'danger') + ->prefixIcon('phosphor-trophy-fill') + ->hiddenLabel() + ->options(fn (Get $get) => LoadStatisticFixturesLeaguesOptions::load($get('cid'))) + ->placeholder('League') + ->afterStateUpdated(function (callable $set) { + $set('mid', null); + $set('tid', null); + }), + Select::make('mid') + ->live() + ->hiddenLabel() + ->prefixIconColor(fn (Get $get): string => $get('mid') ? 'success' : 'danger') + ->prefixIcon('phosphor-calendar-check-fill') + ->options(function (Get $get) { + return LoadStatisticFixturesMatchOptions::load($get('lid')); + }) + ->afterStateUpdated(function (callable $set) { + $set('tid', null); + }) + ->placeholder('Events'), + + Select::make('tid') + ->live() + ->hiddenLabel() + ->prefixIconColor(fn (Get $get): string => $get('tid') ? 'success' : 'danger') + ->prefixIcon('phosphor-users-three-fill') + ->options(function (Get $get) { + if ($get('mid')) { + $res = StatisticFixtures::where('id', $get('mid'))->first(); + + $arr = []; + if ($res) { + $arr[$res->home_id] = SofaScoreRosa::query()->where('ss_team_id', $res->home_id)->value('ss_team_name'); + $arr[$res->away_id] = SofaScoreRosa::query()->where('ss_team_id', $res->away_id)->value('ss_team_name'); + } + + return $arr; + } + }) + ->placeholder('Team')->afterStateUpdated(function ($state) { + // Speichert das ausgewählte Team direkt in der Session + // session(['player_props_filter_team' => $state]); + + // Widget informieren + $this->dispatch('refreshFilters', team_id: $state); + }), + ])->statePath('filterData'); + } + + protected function getFooterWidgets(): array + { + return [ + PlayerPropsTable::class, + PlayerPropsDrop::class, + ]; + } + + public function getFooterWidgetsColumns(): int|array + { + return 5; + } + + private function boxNames(): array + { + return [2 => 'DR', 4 => 'MR', 6 => 'LW', 9 => 'DC', 10 => 'DM', 11 => 'MC', 12 => 'AM', 15 => 'SW', 16 => 'DC', 17 => 'DM', 18 => 'MC', 19 => 'AM', 20 => 'SM', 21 => 'ST', 23 => 'DC', 24 => 'DM', 25 => 'MC', 26 => 'AM', 30 => 'DL', 32 => 'ML', 34 => 'RW']; + } + + private function lineUpOptinos(): array + { + return [ + '3313' => '3313', + '3331' => '3331', + '3331-' => '3331-', + '3331+' => '3331+', + '3412-' => '3412-', + '3412+' => '3412+', + '3421-' => '3421-', + '3421+' => '3421+', + '343-' => '343-', + '343+' => '343+', + '3511' => '3511', + '3511-' => '3511-', + '3511+' => '3511+', + '352' => '352', + '352-' => '352-', + '352+' => '352+', + '4132' => '4132', + '4213-' => '4213-', + '4213+' => '4213+', + '4222' => '4222', + '4231' => '4231', + '424' => '424', + '4312' => '4312', + '4312-' => '4312-', + '4312+' => '4312+', + '4321' => '4321', + '4321-' => '4321-', + '4321+' => '4321+', + '433' => '433', + '433-' => '433-', + '433+' => '433+', + '4411-' => '4411-', + '4411+' => '4411+', + '442' => '442', + '442-' => '442-', + '442+' => '442+', + '451' => '451', + '451-' => '451-', + '451+' => '451+', + '523-' => '523-', + '523+' => '523+', + '5311' => '5311', + '5311-' => '5311-', + '5311+' => '5311+', + '532' => '532', + '532-' => '532-', + '532+' => '532+', + '541-' => '541-', + '541+' => '541+', + ]; + } + + private function linUpMap(): array + { + return [ + '3313' => [9, 16, 23, 11, 18, 25, 19, 6, 34, 21], + '3331' => [9, 16, 23, 17, 11, 25, 12, 19, 26, 21], + '3331-' => [9, 16, 23, 10, 18, 24, 12, 19, 26, 21], + '3331+' => [9, 16, 23, 11, 18, 25, 12, 19, 26, 21], + '3412-' => [9, 16, 23, 4, 10, 24, 32, 19, 20, 21], + '3412+' => [9, 16, 23, 4, 11, 25, 32, 19, 20, 21], + '3421-' => [9, 16, 23, 4, 10, 24, 32, 12, 26, 21], + '3421+' => [9, 16, 23, 4, 11, 25, 32, 12, 26, 21], + '343-' => [9, 16, 23, 4, 10, 24, 32, 6, 34, 21], + '343+' => [9, 16, 23, 4, 11, 25, 32, 6, 34, 21], + '3511' => [9, 16, 23, 4, 11, 17, 25, 32, 19, 21], + '3511-' => [9, 16, 23, 4, 10, 18, 24, 32, 19, 21], + '3511+' => [9, 16, 23, 4, 11, 18, 25, 32, 19, 21], + '352' => [9, 16, 23, 4, 11, 17, 25, 32, 20, 21], + '352-' => [9, 16, 23, 4, 10, 18, 24, 32, 20, 21], + '352+' => [9, 16, 23, 4, 11, 18, 25, 32, 20, 21], + '4132' => [2, 9, 23, 30, 17, 12, 19, 26, 20, 21], + '4213-' => [2, 9, 23, 30, 10, 24, 19, 6, 34, 21], + '4213+' => [2, 9, 23, 30, 11, 25, 19, 6, 34, 21], + '4222' => [2, 9, 23, 30, 10, 24, 12, 26, 20, 21], + '4231' => [2, 9, 23, 30, 10, 24, 12, 19, 26, 21], + '424' => [2, 9, 23, 30, 10, 24, 6, 34, 20, 21], + '4312' => [2, 9, 23, 30, 17, 11, 25, 19, 20, 21], + '4312-' => [2, 9, 23, 30, 10, 18, 24, 19, 20, 21], + '4312+' => [2, 9, 23, 30, 11, 18, 25, 19, 20, 21], + '4321' => [2, 9, 23, 30, 17, 11, 25, 12, 26, 21], + '4321-' => [2, 9, 23, 30, 10, 18, 24, 12, 26, 21], + '4321+' => [2, 9, 23, 30, 11, 18, 25, 12, 26, 21], + '433' => [2, 9, 23, 30, 17, 11, 25, 6, 34, 21], + '433-' => [2, 9, 23, 30, 10, 18, 24, 6, 34, 21], + '433+' => [2, 9, 23, 30, 11, 18, 25, 6, 34, 21], + '4411-' => [2, 9, 23, 30, 4, 10, 24, 32, 19, 21], + '4411+' => [2, 9, 23, 30, 4, 11, 25, 32, 19, 21], + '442' => [2, 9, 23, 30, 4, 17, 18, 32, 20, 21], + '442-' => [2, 9, 23, 30, 4, 10, 24, 32, 20, 21], + '442+' => [2, 9, 23, 30, 4, 11, 25, 32, 20, 21], + '451' => [2, 9, 23, 30, 4, 17, 11, 25, 32, 21], + '451-' => [2, 9, 23, 30, 4, 10, 18, 24, 32, 21], + '451+' => [2, 9, 23, 30, 4, 11, 18, 25, 32, 21], + '523-' => [2, 9, 16, 23, 30, 10, 24, 6, 34, 21], + '523+' => [2, 9, 16, 23, 30, 11, 25, 6, 34, 21], + '5311' => [2, 9, 16, 23, 30, 17, 11, 25, 19, 21], + '5311-' => [2, 9, 16, 23, 30, 10, 18, 24, 19, 21], + '5311+' => [2, 9, 16, 23, 30, 11, 18, 25, 19, 21], + '532' => [2, 9, 16, 23, 30, 17, 11, 25, 20, 21], + '532-' => [2, 9, 16, 23, 30, 10, 18, 24, 20, 21], + '532+' => [2, 9, 16, 23, 30, 11, 18, 25, 20, 21], + '541-' => [2, 9, 16, 23, 30, 4, 10, 24, 32, 21], + '541+' => [2, 9, 16, 23, 30, 4, 11, 25, 32, 21], + ]; + } +} diff --git a/app/Filament/Pages/Statistic.php b/app/Filament/Pages/Statistic.php index 0af81863..d9dc653b 100644 --- a/app/Filament/Pages/Statistic.php +++ b/app/Filament/Pages/Statistic.php @@ -23,8 +23,8 @@ use Filament\Schemas\Components\Grid; use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Schema; -use Filament\Support\Enums\SlideOverPosition; -use Filament\Support\Enums\Width; +// use Filament\Support\Enums\SlideOverPosition; +// use Filament\Support\Enums\Width; use Filament\Support\RawJs; use Illuminate\Contracts\Support\Htmlable; use Illuminate\Contracts\View\View; @@ -42,6 +42,8 @@ class Statistic extends BaseDashboard protected static ?string $title = 'Statistiko'; + protected static ?int $navigationSort = 1; + protected int|string|array $columnSpan = [ 'md' => 2, 'xl' => 3, @@ -79,29 +81,29 @@ class Statistic extends BaseDashboard return ''; } - protected function getHeaderActions(): array - { - return [ - Action::make('esc') - ->label('Reset') - ->icon('phosphor-x-circle') - ->color('gray') - ->keyBindings(['esc']) - ->action('resetFilters'), - Action::make('openDispatcherBoard') - ->modalHeading('') - ->label('Calculate') - ->icon('icon-player') - ->color(fn (): string => $this->filters['team_id'] ? 'primary' : 'gray') - ->disabled(fn (): string => $this->filters['team_id'] ? false : true) - ->slideOver() - ->slideOverPosition(SlideOverPosition::Start) - ->modalWidth(Width::Screen) - ->modalSubmitAction(false) - ->modalCancelAction(false) - ->modalContent(fn (): View => view('livewire.board-dispatcher-modal-wrapper', ['filters' => $this->filters])), - ]; - } + // protected function getHeaderActions(): array + // { + // return [ + // Action::make('esc') + // ->label('Reset') + // ->icon('phosphor-x-circle') + // ->color('gray') + // ->keyBindings(['esc']) + // ->action('resetFilters'), + // Action::make('openDispatcherBoard') + // ->modalHeading('') + // ->label('Calculate') + // ->icon('icon-player') + // ->color(fn (): string => $this->filters['team_id'] ? 'primary' : 'gray') + // ->disabled(fn (): string => $this->filters['team_id'] ? false : true) + // ->slideOver() + // ->slideOverPosition(SlideOverPosition::Start) + // ->modalWidth(Width::Screen) + // ->modalSubmitAction(false) + // ->modalCancelAction(false) + // ->modalContent(fn (): View => view('livewire.board-dispatcher-modal-wrapper', ['filters' => $this->filters])), + // ]; + // } public function filtersForm(Schema $schema): Schema { @@ -460,6 +462,13 @@ class Statistic extends BaseDashboard ->color('gray') ->action(fn (Set $set) => $set('end_date', null)) ), + Action::make('esc') + ->hiddenLabel() + ->tooltip('Clear all (esc)') + ->icon('phosphor-x-circle') + ->color('gray') + ->keyBindings(['esc']) + ->action('resetFilters'), ]); } diff --git a/app/Filament/Resources/Events/EventResource.php b/app/Filament/Resources/Events/EventResource.php index f0a8d4f6..990fc714 100644 --- a/app/Filament/Resources/Events/EventResource.php +++ b/app/Filament/Resources/Events/EventResource.php @@ -21,6 +21,8 @@ class EventResource extends Resource protected static string|\BackedEnum|null $navigationIcon = 'phosphor-monitor'; + protected static ?int $navigationSort = 3; + protected static ?string $navigationLabel = 'Monitor'; protected static ?string $modelLabel = 'Monitor'; diff --git a/app/Filament/Widgets/PlayerPropsDrop.php b/app/Filament/Widgets/PlayerPropsDrop.php new file mode 100644 index 00000000..92f6e611 --- /dev/null +++ b/app/Filament/Widgets/PlayerPropsDrop.php @@ -0,0 +1,16 @@ +team_name = SofaScoreRosa::where('ss_team_id', $team_id)->value('ss_team_name'); + $this->sourceRecords = PlayerCalculator::load($team_id); + $this->resetTable(); + } + } + + public function getHeadingTable(): HtmlString + { + return new HtmlString('
+
Gls
+
Fls
+
Ofs
+
Snt
+
Tsh
+
Crd
+
Foot
+
Evt
+
Min Ø
+
'); + } + + public function table(Table $table): Table + { + return $table + ->headerActions([ + Action::make('esc') + ->hiddenLabel() + ->tooltip('Clear all (esc)') + ->icon('phosphor-x-circle') + ->color('gray') + ->keyBindings(['esc']) + ->action(fn () => $this->resetFilters()), + Action::make('lineups') + ->tooltip('Lineups explanation') + ->color('success') + ->hiddenLabel() + ->icon('phosphor-question-mark') + ->slideOver() + ->slideOverPosition(SlideOverPosition::Start) + ->modalWidth(Width::ExtraLarge) + ->modalSubmitAction(false) + ->modalCancelAction(false) + ->modalContent(fn () => view('filament.modals.position-abbreviation')), + Action::make('reset') + ->hiddenLabel() + ->tooltip('Remove all') + ->icon('phosphor-arrows-clockwise') + ->action(fn () => $this->clearResultTable()), + Action::make('calculate') + ->tooltip('Calculate') + ->hiddenLabel() + ->icon('phosphor-calculator') + ->action(fn () => $this->calculateAspg()), + Action::make('copy_results') + ->tooltip('Copy results for pasting into a spread sheet') + ->hiddenLabel() + ->icon('phosphor-copy') + ->action(fn () => $this->copyResult()), + Action::make('copy_development') + ->tooltip('Copy calculation variables') + ->hiddenLabel() + ->hidden(fn () => ! in_array(Auth::user()->id, [1, 2])) + ->color('warning') + ->icon('phosphor-copy') + ->action(fn () => $this->copyDevelopment()), + ]) + ->heading($this->team_name) + ->query(User::query()->whereRaw('1 = 0')) // Verhindert DB-Abfragen + ->striped() + ->defaultSort('name') + ->emptyStateHeading('No team selected') + ->columns([ + ViewColumn::make('drag_card') + ->label(fn () => $this->getHeadingTable()) + ->view('filament.tables.columns.drag-card'), + ])->extraAttributes([ + 'id' => 'playerdragtable', + ]) + ->filters([ + SelectFilter::make('area') + ->columnSpanFull() + ->native(false) + ->options([ + 'attack' => 'Attack', + 'midfield' => 'Midfield', + 'defence' => 'Defence', + 'goalkeeper' => 'Goalkeeper', + ])->modifyFormFieldUsing(fn (Select $component) => $component->allowHtml()) + ->query(function ($query) { + return $query; + })->indicateUsing(function (array $data): array { + // WICHTIG: Ein leeres Array sorgt dafür, dass kein Indicator-Badge erzeugt wird + return []; + }), + ], layout: FiltersLayout::AboveContent) + ->deferFilters(false) + ->records(function () { + $collection = collect($this->sourceRecords); + $selectedPosition = $this->tableFilters['area']['value'] ?? null; + if (! empty($selectedPosition)) { + $collection = $collection->where('area', $selectedPosition); + } + + return $collection; + }); + } +} diff --git a/app/Filament/Widgets/StatsMedianAverage.php b/app/Filament/Widgets/StatsMedianAverage.php index 00f8e11e..a7ad9367 100644 --- a/app/Filament/Widgets/StatsMedianAverage.php +++ b/app/Filament/Widgets/StatsMedianAverage.php @@ -240,7 +240,6 @@ class StatsMedianAverage extends StatsOverviewWidget return $boxes; } - // TEAMPLATE BOX 1 protected function template_box1(float $expectations_home, float $expectations_away): HtmlString @@ -338,7 +337,7 @@ class StatsMedianAverage extends StatsOverviewWidget } } else { // odd (add 1 because array starts with 0) - $m = ceil($size / 2); + $m = (int) ceil($size / 2); // dd($m, $arr); // dd('UNGERADE', $m, $arr, $arr[$m]); if (isset($arr[$m])) { diff --git a/app/Livewire/PlayerCalculator.php b/app/Livewire/PlayerCalculator.php index 682f1fb4..c1423565 100644 --- a/app/Livewire/PlayerCalculator.php +++ b/app/Livewire/PlayerCalculator.php @@ -4,24 +4,12 @@ namespace App\Livewire; use App\Filament\Pages\Selections\LoadPositions; use App\Models\SofaScorePlayerPerSeason; -use Filament\Widgets\Concerns\InteractsWithPageFilters; use Livewire\Component; class PlayerCalculator extends Component { - use InteractsWithPageFilters; - - public $players = []; - - public function mount(array $filters) + public static function load(int $team_id) { - $this->players = self::load($filters); - } - - public static function load(array $filters) - { - $team_id = (int) $filters['team_id']; - $positions_map = LoadPositions::load(); $player = SofaScorePlayerPerSeason::with('details')->where('season', '=', 'total')->where('ss_team_id', '=', $team_id)->get(); @@ -33,6 +21,7 @@ class PlayerCalculator extends Component $tmp['name'] = $val->details->player_name; $tmp['pos_ori'] = $val->details->position; $tmp['pos'] = ''; + $tmp['active'] = 0; $tmp['foot'] = $val->details->preferred_foot; $tmp['tot_evt'] = $val->total_events; $tmp['tot_min'] = $val->total_min; diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 92114ade..fe2e436d 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -3,6 +3,7 @@ namespace App\Providers\Filament; use App\Filament\Exports\BetfairExporter; +use App\Filament\Pages\PlayerProps; use App\Filament\Pages\Statistic; use App\Http\Middleware\RecordUserActivity; use Awcodes\LightSwitch\Enums\Alignment; @@ -50,7 +51,7 @@ class AdminPanelProvider extends PanelProvider ->columnMapping(false) ->exporter(BetfairExporter::class) ->label('Download Betfair') - ->visible(fn (): bool => auth()->user()->hasRole('download_betfair')) + ->visible(fn (): bool => Auth::user()->hasRole('download_betfair')) ->fileName(fn (Export $export): string => 'betfair-odds-'.date('d.m.Y-H.i')."-{$export->getKey()}") ->modifyQueryUsing(fn (Builder $query) => $query->whereHas('odds_3ways_bf') ->whereHas('odds_totals_bf') @@ -97,6 +98,7 @@ class AdminPanelProvider extends PanelProvider ]) ->pages([ Statistic::class, + PlayerProps::class, ]) ->widgets([]) ->middleware([ diff --git a/composer.lock b/composer.lock index 8284a0fd..a5c5016b 100644 --- a/composer.lock +++ b/composer.lock @@ -4932,16 +4932,16 @@ }, { "name": "nesbot/carbon", - "version": "3.13.2", + "version": "3.14.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb" + "reference": "0023eaa2c9110e47446dd512a263c69c40cd41f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/a1c54919f5fff9800cd03c32bd01defd5a4061cb", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/0023eaa2c9110e47446dd512a263c69c40cd41f2", + "reference": "0023eaa2c9110e47446dd512a263c69c40cd41f2", "shasum": "" }, "require": { @@ -5033,7 +5033,7 @@ "type": "tidelift" } ], - "time": "2026-08-08T11:40:35+00:00" + "time": "2026-09-12T20:45:19+00:00" }, { "name": "nette/php-generator", @@ -12180,11 +12180,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.2.13", + "version": "2.2.14", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", - "reference": "9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9c672e7a8e791dfc3d30e55f683e73fc0b63a3ac", + "reference": "9c672e7a8e791dfc3d30e55f683e73fc0b63a3ac", "shasum": "" }, "require": { @@ -12240,7 +12240,7 @@ "type": "github" } ], - "time": "2026-09-03T20:38:19+00:00" + "time": "2026-09-12T21:39:33+00:00" }, { "name": "phpunit/php-code-coverage", diff --git a/public/images/soccerfield-af3.jpg b/public/images/soccerfield-af3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..573ed9cd0b4c1d37f31c84a2035269535cac0f23 GIT binary patch literal 70716 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

* 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 literal 0 HcmV?d00001 diff --git a/resources/css/filament/admin/theme.css b/resources/css/filament/admin/theme.css index cd6bedb6..daa2eed7 100644 --- a/resources/css/filament/admin/theme.css +++ b/resources/css/filament/admin/theme.css @@ -280,4 +280,21 @@ less padding in table background-size: contain; background-repeat: no-repeat; background-position: center; +} + +#playerdragtable .fi-ta-content-ctn { + max-height: 800px !important; + overflow-y: auto !important; + overflow-x: visible; + scrollbar-width: none; + -webkit-scrollbar: hidden; + -ms-overflow-style: none; +} + +/* Fixiert den Tabellenkopf sauber im Scroll-Kontext */ +#playerdragtable .fi-ta-header-ctn { + position: sticky !important; + top: 0 !important; + z-index: 20 !important; + background-color: var(--fi-background-color, #ffffff) !important; } \ No newline at end of file diff --git a/resources/views/filament/pages/player-props.blade.php b/resources/views/filament/pages/player-props.blade.php new file mode 100644 index 00000000..6d969da6 --- /dev/null +++ b/resources/views/filament/pages/player-props.blade.php @@ -0,0 +1,3 @@ + + {{ $this->form }} + diff --git a/resources/views/livewire/player-props-drop.blade.php b/resources/views/livewire/player-props-drop.blade.php new file mode 100644 index 00000000..7db83d4f --- /dev/null +++ b/resources/views/livewire/player-props-drop.blade.php @@ -0,0 +1,68 @@ +

+ @foreach ($beschriftung as $boxNumber => $benennung) + @if ($benennung) + @if (in_array($boxNumber, $lineup)) +
+ +
+
+
+ {{ $benennung }} +
+ + @if ($boxes[$boxNumber]) + + @endif +
+ + + @if ($boxes[$boxNumber]) +
+ {{ $boxes[$boxNumber]['name'] }} +
+ @endif +
+ @else + + @endif + @else +
+ @endif + @endforeach +