wip fixes

This commit is contained in:
salam committed 2026-10-11 07:26:01 +02:00
1 parent eb66222c85
commit ed9e1db12e
8 files changed
+46 -195

No files matched your search

@@ -2,12 +2,9 @@
namespace App\Filament\Clusters\StaticData\Resources\SofaScoreRosas\Tables; namespace App\Filament\Clusters\StaticData\Resources\SofaScoreRosas\Tables;
use App\Models\SofaScoreRosaTournament; use Filament\Forms\Components\Toggle;
use App\Models\SofaScoreTournament;
use App\Models\Sport;
use Filament\Forms\Components\Select;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn;
use Filament\Tables\Enums\FiltersLayout; use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter; use Filament\Tables\Filters\Filter;
use Filament\Tables\Table; use Filament\Tables\Table;
@@ -20,59 +17,24 @@ class SofaScoreRosasTable
return $table return $table
->defaultPaginationPageOption(50) ->defaultPaginationPageOption(50)
->columns([ ->columns([
TextColumn::make('ss_team_id')->label('SSId')->badge()->width('1rem') TextColumn::make('ss_team_id')->label('SofaId')->badge()->width('1rem')
->sortable(),
TextColumn::make('sofascore_category.name')->label('Country')
->sortable(),
TextColumn::make('tournament_rosa.tournament.name')->label('Tournament')
->sortable(), ->sortable(),
TextColumn::make('cc'),
TextColumn::make('ss_team_name')->label('Name') TextColumn::make('ss_team_name')->label('Name')
->searchable() ->searchable()
->sortable(), ->sortable(),
TextColumn::make('updated_at')->dateTime('Y-m-d H:i:s') ToggleColumn::make('is_active'),
->sortable()
]) ])
->filters([ ->filters([
Filter::make('filters') Filter::make('filters')
->columns(3)->columnSpan(3) ->columns(7)->columnSpan(7)
->schema([ ->schema([
Select::make('sport_id') Toggle::make('is_active')->label('In Statistiko')->default(1),
->default(1)
->selectablePlaceholder(false)
->label('Sport')
->options(Sport::where('is_active', 1)->pluck('name', 'id'))
->afterStateUpdated(function (callable $set) {
$set('ss_tournament_id', null);
})
->live(),
Select::make('ss_tournament_id')
// ->default(23)
->label('Tournament')
->selectablePlaceholder(true)
->options(function (Get $get) {
$res = SofaScoreTournament::with('sofascore_category')->where('enabled', 1)->where('sport_id', $get('sport_id'))->get();
$return = [];
foreach ($res as $value) {
$return[$value->tournament_id] = $value->sofascore_category->name . ' - ' . $value->name;
}
asort($return);
return $return;
})
->live(),
]) ])
->query(function (Builder $query, array $data): Builder { ->query(function (Builder $query, array $data): Builder {
return $query->when( return $query->when(
$data['sport_id'], $data['is_active'],
fn(Builder $query, $sport_id) => $query->where('sport_id', $sport_id) fn (Builder $query, $is_active) => $query->where('is_active', $is_active)
)->when(
$data['ss_tournament_id'],
function (Builder $query, $ss_tournament_id) {
$ss_team_ids = SofaScoreRosaTournament::where('ss_tournament_id', $ss_tournament_id)->pluck('ss_team_id')->toArray();
$query->whereIn('ss_team_id', $ss_team_ids);
}
); );
}), }),
], layout: FiltersLayout::AboveContent) ], layout: FiltersLayout::AboveContent)
@@ -2,12 +2,7 @@
namespace App\Filament\Clusters\StaticData\Resources\SofaScoreTournaments\Tables; namespace App\Filament\Clusters\StaticData\Resources\SofaScoreTournaments\Tables;
use App\Models\SofaScoreCategory;
use App\Models\SofaScoreTournament;
use App\Models\Sport;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Toggle; use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Support\Enums\IconSize; use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
@@ -16,7 +11,6 @@ use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter; use Filament\Tables\Filters\Filter;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
// use Illuminate\Database\Eloquent\Collection;
class SofaScoreTournamentsTable class SofaScoreTournamentsTable
{ {
@@ -28,10 +22,10 @@ class SofaScoreTournamentsTable
->label('') ->label('')
->grow(false) ->grow(false)
->width(30) ->width(30)
->color(fn($record) => $record->sport->color) ->color(fn ($record) => $record->sport->color)
->icon(fn($record) => $record->sport->icon) ->icon(fn ($record) => $record->sport->icon)
->size(IconSize::Medium) ->size(IconSize::Medium)
->tooltip(fn($record) => $record->id) ->tooltip(fn ($record) => $record->id)
->visibleFrom('lg'), ->visibleFrom('lg'),
TextColumn::make('sport.name') TextColumn::make('sport.name')
->sortable(), ->sortable(),
@@ -41,7 +35,7 @@ class SofaScoreTournamentsTable
->searchable(), ->searchable(),
TextColumn::make('sofascore_category.name') TextColumn::make('sofascore_category.name')
->label('Country') ->label('Country')
->icon(fn($record) => $record->sofascore_category->flag) ->icon(fn ($record) => $record->sofascore_category->flag)
->sortable(), ->sortable(),
TextColumn::make('name')->searchable()->sortable(), TextColumn::make('name')->searchable()->sortable(),
ToggleColumn::make('enabled') ToggleColumn::make('enabled')
@@ -53,124 +47,15 @@ class SofaScoreTournamentsTable
Filter::make('filters') Filter::make('filters')
->columns(7)->columnSpan(7) ->columns(7)->columnSpan(7)
->schema([ ->schema([
Select::make('sport_id')
->default(1)
->selectablePlaceholder(false)
->label('Sport')
->options(Sport::where('is_active', 1)->pluck('name', 'id'))
->afterStateUpdated(function (callable $set) {
$set('sofa_score_category_id', null);
})
->live(),
Select::make('sofa_score_category_id')
->searchable()
->multiple()
->columnSpan(2)
->label('Categorie')
->options(function (Get $get) {
$res = SofaScoreTournament::where('sport_id', $get('sport_id'))
->groupBy('sofa_score_category_id')
->pluck('sofa_score_category_id')
->toArray();
return SofaScoreCategory::query()->whereIn('id', $res)->orderBy('name')->pluck('name', 'id');
})
->live(),
Toggle::make('enabled')->label('In Statistiko')->default(1), Toggle::make('enabled')->label('In Statistiko')->default(1),
]) ])
->query(function (Builder $query, array $data): Builder { ->query(function (Builder $query, array $data): Builder {
return $query->when( return $query->when(
$data['sport_id'],
fn(Builder $query, $sport_id) => $query->where('sport_id', $sport_id)
)->when(
$data['enabled'], $data['enabled'],
fn(Builder $query, $enabled) => $query->where('enabled', $enabled) fn (Builder $query, $enabled) => $query->where('enabled', $enabled)
)->when(
$data['sofa_score_category_id'],
function (Builder $query, $sofa_score_category_id) {
if (is_array($sofa_score_category_id)) {
$query->whereIn('sofa_score_category_id', $sofa_score_category_id);
} else {
$query->where('sofa_score_category_id', $sofa_score_category_id);
}
}
// )->when(
// $data['filter-grapping'],
// function (Builder $query, $filtergrapping) {
// switch ($filtergrapping) {
// case 'active':
// $query->where('enabled', 1);
// break;
// case 'disabled':
// $query->where('enabled', 0);
// break;
// }
// }
// )->when(
// $data['filter-disabled'],
// function (Builder $query, $filterdisabled) {
// switch ($filterdisabled) {
// case 'enabled':
// $query->where('enabled', 1);
// break;
// case 'hidden':
// $query->where('disabled', 1);
// break;
// }
// }
); );
}), }),
], layout: FiltersLayout::AboveContent) ], layout: FiltersLayout::AboveContent)
->deferFilters(false); ->deferFilters(false);
// ->toolbarActions([
// BulkActionGroup::make([
// BulkAction::make('Enable selected')
// ->icon('phosphor-toggle-right-fill')
// ->color('primary')
// ->action(function (Collection $records): void {
// foreach ($records as $record) {
// SofaScoreTournament::where('id', '=', $record->id)
// ->update(
// ['enabled' => 1]
// );
// }
// }),
// BulkAction::make('Disable selected')
// ->icon('phosphor-toggle-left-fill')
// ->color('gray')
// ->action(function (Collection $records): void {
// foreach ($records as $record) {
// SofaScoreTournament::where('id', '=', $record->id)
// ->update(
// ['enabled' => 0]
// );
// }
// }),
// ])->label('Grapping'),
// BulkActionGroup::make([
// BulkAction::make('Hide selected')
// ->icon('phosphor-toggle-right-fill')
// ->color('primary')
// ->action(function (Collection $records): void {
// foreach ($records as $record) {
// SofaScoreTournament::where('id', '=', $record->id)
// ->update(
// ['disabled' => 1]
// );
// }
// }),
// BulkAction::make('Show selected')
// ->icon('phosphor-toggle-left-fill')
// ->color('gray')
// ->action(function (Collection $records): void {
// foreach ($records as $record) {
// SofaScoreTournament::where('id', '=', $record->id)
// ->update(
// ['disabled' => 0]
// );
// }
// }),
// ])->label('Hidden'),
// ]);
} }
} }
@@ -28,6 +28,7 @@ class StatistikoConfigsTable
->color(fn (string $state): string => match ($state) { ->color(fn (string $state): string => match ($state) {
'home' => 'info', 'home' => 'info',
'away' => 'warning', 'away' => 'warning',
default => ''
}), }),
TextColumn::make('varname') TextColumn::make('varname')
->formatStateUsing(fn (string $state): string => strtoupper($state)), ->formatStateUsing(fn (string $state): string => strtoupper($state)),
@@ -16,6 +16,15 @@ use Illuminate\Database\Eloquent\Builder;
class StatistikoDetailsTable class StatistikoDetailsTable
{ {
/**
* Eingebettete Dokumente (Embeds): Falls Sie mal in einem verschachtelten MongoDB-Objekt suchen müssen (z. B. address.city),
* können Sie das in der $subQuery einfach in der Dot-Notation angeben:
* $subQuery->orWhere('address.city', 'regexp', '/' . $search . '/i').
*
* Indexierung: Da Regex-Suchen rechenintensiv sein können,
* lohnt es sich, bei wachsenden Datenmengen einen Index auf die durchsuchten Felder
* (wie name oder email) in Ihrer MongoDB zu legen.
*/
public static function configure(Table $table): Table public static function configure(Table $table): Table
{ {
return $table return $table
@@ -32,9 +41,9 @@ class StatistikoDetailsTable
->copyable() ->copyable()
->searchable(query: function (Builder $query, string $search): Builder { ->searchable(query: function (Builder $query, string $search): Builder {
return $query->where(function (Builder $subQuery) use ($search) { return $query->where(function (Builder $subQuery) use ($search) {
// MongoDB-sichere Suche über 'name' ODER 'email' mittels Regex // MongoDB-sichere Regex-Suche über Name ODER E-Mail
$subQuery->where('name', 'regexp', '/'.$search.'/i') $subQuery->where('player_name', 'regexp', '/'.$search.'/i')
->orWhere('email', 'regexp', '/'.$search.'/i'); ->orWhere('player_name', 'regexp', '/'.$search.'/i');
}); });
}), }),
TextColumn::make('ss_player_id') TextColumn::make('ss_player_id')
@@ -53,13 +62,6 @@ class StatistikoDetailsTable
TextColumn::make('last_update')->date()->prefix('Last Update: '), TextColumn::make('last_update')->date()->prefix('Last Update: '),
]), ]),
]) ])
->searchQuery(function (Builder $query, string $search): Builder {
return $query->where(function (Builder $subQuery) use ($search) {
// Nutzen Sie 'regexp' als Operator und packen Sie Flags in den String /.../i
$subQuery->where('name', 'regexp', '/'.$search.'/i')
->orWhere('email', 'regexp', '/'.$search.'/i');
});
})
->emptyStateHeading('No double player in details') ->emptyStateHeading('No double player in details')
->contentGrid([ ->contentGrid([
'md' => 2, 'md' => 2,
@@ -88,7 +90,6 @@ class StatistikoDetailsTable
return 'Find Double'; return 'Find Double';
}), }),
], layout: FiltersLayout::AboveContent) ], layout: FiltersLayout::AboveContent)
->deferFilters(false) ->deferFilters(false)
->recordActions([ ->recordActions([
@@ -7,6 +7,8 @@ use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
@@ -19,27 +21,29 @@ class StatistikoPlayersTable
TextColumn::make('match_id')->color('info')->icon('phosphor-copy')->copyable() TextColumn::make('match_id')->color('info')->icon('phosphor-copy')->copyable()
->sortable() ->sortable()
->searchable( ->searchable(
query: fn($query, $search) => $query->orWhere('match_id', (int) $search) query: fn ($query, $search) => $query->orWhere('match_id', (int) $search)
), ),
TextColumn::make('ss_player_id') TextColumn::make('ss_player_id')
->sortable() ->sortable()
->label('Player Id') ->label('Player Id')
->color('success')->icon('phosphor-copy')->copyable() ->color('success')->icon('phosphor-copy')->copyable()
->searchable( ->searchable(
query: fn($query, $search) => $query->orWhere('ss_player_id', (int) $search) query: fn ($query, $search) => $query->orWhere('ss_player_id', (int) $search)
),
TextColumn::make('details.player_name')->label('Player')->searchable()
->tooltip(fn($record) => $record->details->full_name)
->sortable(
query: fn(Builder $query) => $query->orderBy('details.player_name')
), ),
TextColumn::make('details.player_name')->label('Player')
->searchable(query: function (Builder $query, string $search): Builder {
return $query->where(function (Builder $subQuery) use ($search) {
$subQuery->where('details.player_name', 'regexp', '/'.$search.'/i')
->orWhere('details.player_name', 'regexp', '/'.$search.'/i');
});
}),
TextColumn::make('event.home.ss_team_name')->color('primary')->searchable() TextColumn::make('event.home.ss_team_name')->color('primary')->searchable()
->sortable( ->sortable(
query: fn(Builder $query) => $query->orderBy('event.home.ss_team_name') query: fn (Builder $query) => $query->orderBy('event.home.ss_team_name')
), ),
TextColumn::make('event.away.ss_team_name')->searchable()->color('success') TextColumn::make('event.away.ss_team_name')->searchable()->color('success')
->sortable( ->sortable(
query: fn(Builder $query) => $query->orderBy('ss_team_name') query: fn (Builder $query) => $query->orderBy('ss_team_name')
), ),
]) ])
// ->filters([ // ->filters([
@@ -55,13 +59,11 @@ class StatistikoPlayersTable
// foreach ($events as $value) { // foreach ($events as $value) {
// $match_id = $value['match_id']; // $match_id = $value['match_id'];
// $player_id = $value['ss_player_id']; // $player_id = $value['ss_player_id'];
// if (isset($arr[$match_id]) && in_array($player_id, $arr[$match_id])) { // if (isset($arr[$match_id]) && in_array($player_id, $arr[$match_id])) {
// return $query->where('match_id', $match_id)->where('ss_player_id', $player_id); // return $query->where('match_id', $match_id)->where('ss_player_id', $player_id);
// } // }
// $arr[$match_id][] = $player_id; // $arr[$match_id][] = $player_id;
// } // }
// return $query->where('match_id', 0); // return $query->where('match_id', 0);
// } // }
// ); // );
@@ -71,7 +73,6 @@ class StatistikoPlayersTable
// } // }
// return 'Find Double'; // return 'Find Double';
// }), // }),
// ], layout: FiltersLayout::AboveContent) // ], layout: FiltersLayout::AboveContent)
->emptyStateHeading('No player double in an event') ->emptyStateHeading('No player double in an event')
->deferFilters(false) ->deferFilters(false)
+3 -1
View File
@@ -11,6 +11,8 @@ class SofaScoreRosa extends Model
protected $connection = 'mariadb'; protected $connection = 'mariadb';
protected $table = 'sofa_score_rosas';
protected $fillable = [ protected $fillable = [
'sport_id', 'sport_id',
'cc', 'cc',
@@ -31,7 +33,7 @@ class SofaScoreRosa extends Model
public function sofascore_category() public function sofascore_category()
{ {
return $this->belongsTo(SofaScoreCategory::class, 'country_id', 'country_id')->where('in_soccer', 1); return $this->belongsTo(SofaScoreCategory::class, 'country_id', 'country_id');
} }
public function tournament_rosa() public function tournament_rosa()
+1 -2
View File
@@ -4,8 +4,8 @@ declare(strict_types=1);
namespace App\Models; namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use MongoDB\Laravel\Eloquent\Model;
class StatistikoEvent extends Model class StatistikoEvent extends Model
{ {
@@ -48,7 +48,6 @@ class StatistikoEvent extends Model
'starttime' => 'datetime', 'starttime' => 'datetime',
]; ];
public function sport(): BelongsTo public function sport(): BelongsTo
{ {
return $this->belongsTo(Sport::class, 'sport_id', 'id'); return $this->belongsTo(Sport::class, 'sport_id', 'id');
+2 -2
View File
@@ -67,8 +67,8 @@ class StatistikoConfigSeeder extends Seeder
(54, 'A', 'tsh', 'away', 'tsh_away_made_home', 1.00, NULL, NULL), (54, 'A', 'tsh', 'away', 'tsh_away_made_home', 1.00, NULL, NULL),
(55, 'A', 'tsh', 'away', 'tsh_away_got_total', 1.00, NULL, NULL), (55, 'A', 'tsh', 'away', 'tsh_away_got_total', 1.00, NULL, NULL),
(56, 'A', 'tsh', 'away', 'tsh_away_got_home', 1.00, NULL, NULL), (56, 'A', 'tsh', 'away', 'tsh_away_got_home', 1.00, NULL, NULL),
(57, 'B', 'all', 'home', 'asp_home', 2.00, NULL, NULL), (57, 'B', 'all', 'Bet Modificator', 'cfHA', 1.00, NULL, NULL),
(58, 'B', 'all', 'away', 'asp_away', 2.00, NULL, NULL);"; (58, 'B', 'all', 'Min Max', 'Y', 0.25, NULL, NULL);";
DB::unprepared($sql); DB::unprepared($sql);
} }