From 3bc956e0b9bdba9d3535dd1a5279e73316c6cef5 Mon Sep 17 00:00:00 2001 From: salam Date: Sun, 24 May 2026 09:41:52 +0200 Subject: [PATCH] statistic filter player grafics wip --- .../LoadStatisticFixturesMatchOptions.php | 22 +++++++++ app/Filament/Pages/Statistic.php | 32 ++++++++----- app/Filament/Widgets/Data/LoadEvents.php | 11 +++-- app/Filament/Widgets/Data/LoadPlayer.php | 47 +++++++++++++++---- app/Filament/Widgets/StatsMedianAverage.php | 10 ++-- 5 files changed, 93 insertions(+), 29 deletions(-) create mode 100644 app/Actions/LoadStatisticFixturesMatchOptions.php diff --git a/app/Actions/LoadStatisticFixturesMatchOptions.php b/app/Actions/LoadStatisticFixturesMatchOptions.php new file mode 100644 index 00000000..d2a98c69 --- /dev/null +++ b/app/Actions/LoadStatisticFixturesMatchOptions.php @@ -0,0 +1,22 @@ +get(); + + foreach ($res as $val) { + $arr[$val->id] = $val->home->name.' vs '.$val->away->name; + } + + return $arr; + } +} diff --git a/app/Filament/Pages/Statistic.php b/app/Filament/Pages/Statistic.php index c7008734..b1fef1d4 100644 --- a/app/Filament/Pages/Statistic.php +++ b/app/Filament/Pages/Statistic.php @@ -3,6 +3,7 @@ namespace App\Filament\Pages; use App\Actions\LoadStatisticFixturesLeaguesOptions; +use App\Actions\LoadStatisticFixturesMatchOptions; use App\Filament\Widgets\ChartMovingAverageEvent; use App\Filament\Widgets\ChartMovingAveragePlayer; use App\Filament\Widgets\ChartPunctualEvent; @@ -58,34 +59,39 @@ class Statistic extends BaseDashboard Select::make('league_id') ->prefixIcon('phosphor-trophy') ->options(fn () => LoadStatisticFixturesLeaguesOptions::load(1)) - ->preload() - ->searchable() ->live() ->label('League') ->afterStateUpdated(function (callable $set) { - $set('team_id', null); + $set('match_id', null); }), + Select::make('match_id') + ->prefixIcon('icon-team') + ->options(function (Get $get) { + return LoadStatisticFixturesMatchOptions::load($get('league_id')); + }) + ->afterStateUpdated(function (callable $set) { + $set('team_id', null); + $set('tm_player_id', null); + }) + ->live() + ->label('Events'), Select::make('team_id') ->prefixIcon('icon-team') ->options(function (Get $get) { - if ($get('league_id')) { - $res = StatisticFixtures::where('league_id', $get('league_id'))->get(); + if ($get('match_id')) { + $res = StatisticFixtures::where('id', $get('match_id'))->get(); $arr = []; foreach ($res as $value) { $arr[] = $value->home_id; $arr[] = $value->away_id; } - $arr = array_unique($arr); - - return Element::query()->whereIn('id', $arr)->orderBy('name')->pluck('name', 'id'); + return Element::query()->whereIn('id', $arr)->pluck('name', 'id'); } }) ->afterStateUpdated(function (callable $set) { $set('tm_player_id', null); }) - ->preload() - ->searchable() ->live() ->label('Team'), @@ -118,7 +124,7 @@ class Statistic extends BaseDashboard ->color('gray') ->action(fn (Set $set) => $set('end_date', null)) ), - ])->columns(5) + ])->columns(6) ->columnSpanFull(), Grid::make([ 'default' => 2, @@ -233,8 +239,8 @@ class Statistic extends BaseDashboard StatsMedianAverage::make(), ChartPunctualEvent::make(), ChartMovingAverageEvent::make(), - // ChartPunctualPlayer::make(), - // ChartMovingAveragePlayer::make(), + ChartPunctualPlayer::make(), + ChartMovingAveragePlayer::make(), ]; } diff --git a/app/Filament/Widgets/Data/LoadEvents.php b/app/Filament/Widgets/Data/LoadEvents.php index df93ef26..ded4189f 100644 --- a/app/Filament/Widgets/Data/LoadEvents.php +++ b/app/Filament/Widgets/Data/LoadEvents.php @@ -20,6 +20,8 @@ class LoadEvents $league_id = (int) $filter['league_id'] ?? 0; + $match_id = (int) $filter['match_id'] ?? 0; + $team_id = (int) $filter['team_id'] ?? 0; $tm_player_id = (int) $filter['tm_player_id'] ?? 0; @@ -28,20 +30,23 @@ class LoadEvents $end = $filter['end_date'] ?? 0; - $statistic_type = $filter['statistic_type'] ?? 'gls'; + $statistic_type = $filter['statistic_type']; $team_position = $filter['team_position']; $player_on_field = $filter['player_on_field']; + $accuracy = (float) $filter['accuracy']; + if (! $league_id) { return []; } if (! $team_id) { return []; } - if (! $statistic_type) { - return []; + + if ($statistic_type == 'none') { + $statistic_type = 'gls'; } /** diff --git a/app/Filament/Widgets/Data/LoadPlayer.php b/app/Filament/Widgets/Data/LoadPlayer.php index f49b3664..efab0a51 100644 --- a/app/Filament/Widgets/Data/LoadPlayer.php +++ b/app/Filament/Widgets/Data/LoadPlayer.php @@ -18,23 +18,25 @@ class LoadPlayer $league_id = (int) $filter['league_id'] ?? 0; + $match_id = (int) $filter['match_id'] ?? 0; + $team_id = (int) $filter['team_id'] ?? 0; $tm_player_id = (int) $filter['tm_player_id'] ?? 0; + $start = $filter['start_date'] ?? 0; + + $end = $filter['end_date'] ?? 0; + + $statistic_type = $filter['statistic_type']; + $team_position = $filter['team_position']; $player_on_field = $filter['player_on_field']; - $statistic_type = $filter['statistic_type'] ?? 0; - $accuracy = (float) $filter['accuracy']; - $similar_past_matches = $filter['similar_past_matches'] ?? 0; - - $start = $filter['start_date'] ?? 0; - - $end = $filter['end_date'] ?? 0; + $similar_past_matches = $filter['similar_past_matches']; if (! $league_id) { return []; @@ -46,6 +48,31 @@ class LoadPlayer return []; } + if ($statistic_type == 'none') { + $statistic_type = 'gls'; + } + + /** + * IF WITH SIMILAR_PAST_MATCHES + * + * 'none' => 'None', + * 'league' => 'League', + * 'all' => 'All Database', + */ + // $handicap_range = 0; + // $total_range = 0; + // if ($similar_past_matches != 'none') { + // $res = StatisticFixtures::where('id', (int) $match_id)->first(); + + // $exp_handicap = $res->exp_away - $res->exp_home; + + // $exp_total = $res->exp_away + $res->exp_home; + + // $handicap_range = [$exp_handicap - $accuracy, $exp_handicap + $accuracy]; + + // $total_range = [$exp_total - $accuracy, $exp_total + $accuracy]; + // } + /** * STATTISTIC DATA */ @@ -60,9 +87,9 @@ class LoadPlayer return $query->where('home_id', '=', $team_id) ->orWhere('away_id', '=', $team_id); } - }) - ->when($matches_played, function ($query) use ($matches_played) { - return $query->whereIn('match_id', $matches_played); + // }) + // ->when($matches_played, function ($query) use ($matches_played) { + // return $query->whereIn('match_id', $matches_played); })->when($start, function ($query) use ($start) { return $query->where('starttime', '>=', $start); })->when($end, function ($query) use ($end) { diff --git a/app/Filament/Widgets/StatsMedianAverage.php b/app/Filament/Widgets/StatsMedianAverage.php index 0308f9c3..680b5889 100644 --- a/app/Filament/Widgets/StatsMedianAverage.php +++ b/app/Filament/Widgets/StatsMedianAverage.php @@ -55,13 +55,17 @@ class StatsMedianAverage extends StatsOverviewWidget $median = $arr[$m]; } + $win = $data['results']['w'] ? number_format(Round::odd($total / $data['results']['w']), 2) : 0; + $draw = $data['results']['d'] ? number_format(Round::odd($total / $data['results']['d']), 2) : 0; + $lost = $data['results']['l'] ? number_format(Round::odd($total / $data['results']['l']), 2) : 0; + return [ Stat::make('Number of events', $total), Stat::make('Average', round($summe / $total, 1)), Stat::make('Median', $median), - Stat::make('Win: '.$data['results']['w'], number_format(Round::odd($total / $data['results']['w']), 2)), - Stat::make('Draw: '.$data['results']['d'], number_format(Round::odd($total / $data['results']['d']), 2)), - Stat::make('Lost: '.$data['results']['l'], number_format(Round::odd($total / $data['results']['l']), 2)), + Stat::make('Win: '.$data['results']['w'], $win), + Stat::make('Draw: '.$data['results']['d'], $draw), + Stat::make('Lost: '.$data['results']['l'], $lost), ]; } }