download countries, teams/player and tournaments for txodds

This commit is contained in:
salam committed 2026-03-05 11:56:18 +01:00
1 parent cf37530dd2
commit 356dabb0c1
14 files changed
+294 -17

No files matched your search

@@ -2,6 +2,7 @@
namespace App\Filament\Clusters\DynamicData\Resources\CompetitionGroups\Tables;
use App\Filament\Exports\CompetitionGroupExporter;
use App\Models\CompetitionGroupProvider;
use App\Models\Country;
use App\Models\ElementGroup;
@@ -13,13 +14,17 @@ use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ExportAction;
use Filament\Actions\Exports\Enums\ExportFormat;
use Filament\Notifications\Notification;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
class CompetitionGroupsTable
{
@@ -53,6 +58,8 @@ class CompetitionGroupsTable
])->filters([
SelectFilter::make('sport_id')
->label('Sport')
->default(1)
->selectablePlaceholder(false)
->options(fn () => Sport::where('is_active', 1)->pluck('name', 'id')->toArray()),
SelectFilter::make('country_id')
->searchable()
@@ -80,6 +87,21 @@ class CompetitionGroupsTable
])->iconButton()
->icon('phosphor-dots-three-vertical'),
])
->headerActions([
ExportAction::make()
->modalHeading('Download Groups')
->label('Export')
->icon('phosphor-download')
->modalDescription('This will download the TxOdds tournaments with "sport_id" and "country_id" for the sport selected.')
->modalIcon('phosphor-microsoft-excel-logo')
->exporter(CompetitionGroupExporter::class)
->columnMapping(false)
->modifyQueryUsing(fn (Builder $query, Get $get) => $query->where('spoirt_id', $get('sport_id')))
->formats([
ExportFormat::Xlsx,
ExportFormat::Csv,
]),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
@@ -2,6 +2,7 @@
namespace App\Filament\Clusters\DynamicData\Resources\Elements\Tables;
use App\Filament\Exports\ElementExporter;
use App\Models\CompetitionGroup;
use App\Models\Country;
use App\Models\ElementGroup;
@@ -13,6 +14,8 @@ use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ExportAction;
use Filament\Actions\Exports\Enums\ExportFormat;
use Filament\Forms\Components\Select;
use Filament\Notifications\Notification;
use Filament\Schemas\Components\Utilities\Get;
@@ -103,6 +106,21 @@ class ElementsTable
])->iconButton()
->icon('phosphor-dots-three-vertical'),
])
->headerActions([
ExportAction::make()
->modalHeading('Download Teams/Player')
->label('Export')
->icon('phosphor-download')
->modalDescription('This will download the TxOdds Teams/Player with "sport_id" and "country_id" for the sport selected.')
->modalIcon('phosphor-microsoft-excel-logo')
->exporter(ElementExporter::class)
->columnMapping(false)
->modifyQueryUsing(fn (Builder $query, Get $get) => $query->where('spoirt_id', $get('sport_id')))
->formats([
ExportFormat::Xlsx,
ExportFormat::Csv,
]),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
@@ -3,17 +3,9 @@
namespace App\Filament\Clusters\StaticData\Resources\Bettypes\Pages;
use App\Filament\Clusters\StaticData\Resources\Bettypes\BettypeResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListBettypes extends ListRecords
{
protected static string $resource = BettypeResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -4,11 +4,14 @@ namespace App\Filament\Clusters\StaticData\Resources\Bettypes\Tables;
use App\Models\Sport;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Select;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
class BettypesTable
{
@@ -38,11 +41,28 @@ class BettypesTable
IconColumn::make('q1')->boolean()->trueIcon('phosphor-check-circle-fill')->falseIcon('phosphor-circle')->falseColor('gray'),
])
->filters([
SelectFilter::make('sport_id')
->label('Sport')
->options(fn () => Sport::where('is_active', 1)->pluck('name', 'id')
->toArray()),
Filter::make('sport_id')
->schema([
Select::make(name: 'sport_id')
->placeholder('Filter Sport')
->hiddenLabel()
->preload()
->options(fn () => Sport::where('is_active', 1)->pluck('name', 'id'))
->live(),
])
->query(function (Builder $query, array $data): Builder {
return $query
->when(
$data['sport_id'],
fn (Builder $query, $sport_id) => $query->where('sport_id', $sport_id)
);
}),
// SelectFilter::make('sport_id')
// ->label('')
// ->options(fn () => Sport::where('is_active', 1)->pluck('name', 'id')
// ->toArray()),
], layout: FiltersLayout::AboveContent)
->deferFilters(false)
->recordActions([
EditAction::make()->hiddenLabel(),
]);
@@ -4,8 +4,11 @@ namespace App\Filament\Clusters\StaticData\Resources\Countries;
use App\Filament\Clusters\StaticData\Resources\Countries\Pages\ManageCountries;
use App\Filament\Clusters\StaticData\StaticDataCluster;
use App\Filament\Exports\CountryExporter;
use App\Models\Country;
use Filament\Actions\EditAction;
use Filament\Actions\ExportAction;
use Filament\Actions\Exports\Enums\ExportFormat;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Resources\Resource;
@@ -13,6 +16,7 @@ use Filament\Schemas\Schema;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\TernaryFilter;
use Filament\Tables\Table;
@@ -77,6 +81,22 @@ class CountryResource extends Resource
Filter::make('icon')
->label('Missing Icons')
->query(fn (Builder $query): Builder => $query->whereNull('icon')),
], layout: FiltersLayout::AboveContent)
->deferFilters(false)
->headerActions([
ExportAction::make()
->modalHeading('Download Countries')
->label('Export')
->icon('phosphor-download')
->modalDescription('This will download the Countries (id, name) from TxOdds.')
->modalIcon('phosphor-microsoft-excel-logo')
->exporter(CountryExporter::class)
->columnMapping(false)
->modifyQueryUsing(fn (Builder $query) => $query->where('is_country', true))
->formats([
ExportFormat::Xlsx,
ExportFormat::Csv,
]),
])
->recordActions([
EditAction::make()->hiddenLabel(),
@@ -29,7 +29,6 @@ class TxoddsMarketsTable
Select::make(name: 'sport_market')
->placeholder('Filter Sport')
->hiddenLabel()
->label('')
->preload()
->options(function () {
return [
@@ -0,0 +1,37 @@
<?php
namespace App\Filament\Exports;
use App\Models\CompetitionGroup;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
use Illuminate\Support\Number;
class CompetitionGroupExporter extends Exporter
{
protected static ?string $model = CompetitionGroup::class;
public static function getColumns(): array
{
return [
ExportColumn::make('id')
->label('ID'),
ExportColumn::make('name'),
ExportColumn::make('level'),
ExportColumn::make('sport_id'),
ExportColumn::make('country_id'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your competition group export has completed and '.Number::format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
}
return $body;
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Filament\Exports;
use App\Models\Country;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
use Illuminate\Support\Number;
class CountryExporter extends Exporter
{
protected static ?string $model = Country::class;
public static function getColumns(): array
{
return [
ExportColumn::make('id'),
ExportColumn::make('name'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your countries export has completed and '.Number::format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
}
return $body;
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Filament\Exports;
use App\Models\Element;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
use Illuminate\Support\Number;
class ElementExporter extends Exporter
{
protected static ?string $model = Element::class;
public static function getColumns(): array
{
return [
ExportColumn::make('id')
->label('ID'),
ExportColumn::make('name'),
ExportColumn::make('sport_id'),
ExportColumn::make('country_id'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your element export has completed and '.Number::format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
}
return $body;
}
}
@@ -48,8 +48,8 @@ class AdminPanelProvider extends PanelProvider
->emailVerification()
->emailChangeVerification()
->databaseNotifications()
->sidebarCollapsibleOnDesktop()
// ->databaseNotificationsPolling('15s') default is 30
->sidebarCollapsibleOnDesktop()
->profile(isSimple: false)
->default()
->globalSearch(false)
Generated
+3 -3
View File
@@ -13404,12 +13404,12 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"stability-flags": [],
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^8.3"
},
"platform-dev": {},
"plugin-api-version": "2.9.0"
"platform-dev": [],
"plugin-api-version": "2.6.0"
}
@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('imports', function (Blueprint $table): void {
$table->id();
$table->timestamp('completed_at')->nullable();
$table->string('file_name');
$table->string('file_path');
$table->string('importer');
$table->unsignedInteger('processed_rows')->default(0);
$table->unsignedInteger('total_rows');
$table->unsignedInteger('successful_rows')->default(0);
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('imports');
}
};
@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('exports', function (Blueprint $table): void {
$table->id();
$table->timestamp('completed_at')->nullable();
$table->string('file_disk');
$table->string('file_name')->nullable();
$table->string('exporter');
$table->unsignedInteger('processed_rows')->default(0);
$table->unsignedInteger('total_rows');
$table->unsignedInteger('successful_rows')->default(0);
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('exports');
}
};
@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('failed_import_rows', function (Blueprint $table): void {
$table->id();
$table->json('data');
$table->foreignId('import_id')->constrained()->cascadeOnDelete();
$table->text('validation_error')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('failed_import_rows');
}
};