From 0c3142f2fd97b6a18e847a4825d5f151c9cce7c0 Mon Sep 17 00:00:00 2001 From: salam Date: Fri, 20 Feb 2026 12:15:43 +0100 Subject: [PATCH] dynamic elements and groups --- .../Commands/DbMapper/Store/StoreElement.php | 2 + .../Commands/DbMapper/Store/StoreGroup.php | 1 + .../Commands/Grapper/Fixtures/StoreData.php | 3 + .../Grapper/Fixtures/StoreElement.php | 4 +- .../Commands/Grapper/Fixtures/StoreGroup.php | 5 +- .../Bettypes/Tables/BettypesTable.php | 3 +- .../CompetitionGroupResource.php | 4 +- .../Schemas/CompetitionGroupForm.php | 4 +- .../Tables/CompetitionGroupsTable.php | 47 +++++++- .../CompetitonGroupProviderResource.php | 48 ++++++++ .../Pages/CreateCompetitonGroupProvider.php | 11 ++ .../Pages/EditCompetitonGroupProvider.php | 19 +++ .../Pages/ListCompetitonGroupProviders.php | 11 ++ .../Schemas/CompetitonGroupProviderForm.php | 18 +++ .../Tables/CompetitonGroupProvidersTable.php | 92 +++++++++++++++ .../ElementProviderResource.php | 48 ++++++++ .../Pages/CreateElementProvider.php | 11 ++ .../Pages/EditElementProvider.php | 19 +++ .../Pages/ListElementProviders.php | 11 ++ .../Schemas/ElementProviderForm.php | 19 +++ .../Tables/ElementProvidersTable.php | 85 ++++++++++++++ .../Resources/Elements/ElementResource.php | 48 ++++++++ .../Elements/Pages/CreateElement.php | 11 ++ .../Resources/Elements/Pages/EditElement.php | 19 +++ .../Resources/Elements/Pages/ListElements.php | 11 ++ .../Elements/Schemas/ElementForm.php | 18 +++ .../Elements/Tables/ElementsTable.php | 108 ++++++++++++++++++ .../Resources/Providers/ProviderResource.php | 2 +- .../Supervisors/SupervisorResource.php | 2 +- .../TxoddsMarkets/TxoddsMarketResource.php | 2 +- app/Livewire/Mapper/StoreMapped.php | 3 + app/Models/AddByMethod.php | 10 ++ app/Models/CompetitionGroupProvider.php | 11 ++ app/Models/Element.php | 10 ++ app/Models/ElementGroup.php | 15 +++ app/Models/ElementProvider.php | 11 ++ composer.lock | 12 +- ...5_112750_create_element_provider_table.php | 1 + ...reate_competition_group_provider_table.php | 1 + ..._20_100622_create_add_by_methods_table.php | 30 +++++ database/seeders/AddByMethodSeeder.php | 24 ++++ database/seeders/DatabaseSeeder.php | 1 + 42 files changed, 798 insertions(+), 17 deletions(-) create mode 100644 app/Filament/Resources/CompetitonGroupProviders/CompetitonGroupProviderResource.php create mode 100644 app/Filament/Resources/CompetitonGroupProviders/Pages/CreateCompetitonGroupProvider.php create mode 100644 app/Filament/Resources/CompetitonGroupProviders/Pages/EditCompetitonGroupProvider.php create mode 100644 app/Filament/Resources/CompetitonGroupProviders/Pages/ListCompetitonGroupProviders.php create mode 100644 app/Filament/Resources/CompetitonGroupProviders/Schemas/CompetitonGroupProviderForm.php create mode 100644 app/Filament/Resources/CompetitonGroupProviders/Tables/CompetitonGroupProvidersTable.php create mode 100644 app/Filament/Resources/ElementProviders/ElementProviderResource.php create mode 100644 app/Filament/Resources/ElementProviders/Pages/CreateElementProvider.php create mode 100644 app/Filament/Resources/ElementProviders/Pages/EditElementProvider.php create mode 100644 app/Filament/Resources/ElementProviders/Pages/ListElementProviders.php create mode 100644 app/Filament/Resources/ElementProviders/Schemas/ElementProviderForm.php create mode 100644 app/Filament/Resources/ElementProviders/Tables/ElementProvidersTable.php create mode 100644 app/Filament/Resources/Elements/ElementResource.php create mode 100644 app/Filament/Resources/Elements/Pages/CreateElement.php create mode 100644 app/Filament/Resources/Elements/Pages/EditElement.php create mode 100644 app/Filament/Resources/Elements/Pages/ListElements.php create mode 100644 app/Filament/Resources/Elements/Schemas/ElementForm.php create mode 100644 app/Filament/Resources/Elements/Tables/ElementsTable.php create mode 100644 app/Models/AddByMethod.php create mode 100644 database/migrations/2026_02_20_100622_create_add_by_methods_table.php create mode 100644 database/seeders/AddByMethodSeeder.php diff --git a/app/Console/Commands/DbMapper/Store/StoreElement.php b/app/Console/Commands/DbMapper/Store/StoreElement.php index 86f2533f..c1b381c4 100644 --- a/app/Console/Commands/DbMapper/Store/StoreElement.php +++ b/app/Console/Commands/DbMapper/Store/StoreElement.php @@ -12,6 +12,7 @@ class StoreElement $home['sport_id'] = $mapper['sport_id']; $home['element_id'] = $mapper['txodds_home_id']; $home['provider_id'] = $mapper['provider_id']; + $home['add_by_method_id'] = 3; $home['name'] = $mapper['home']; ElementProvider::updateOrCreate(['provider_element_id' => (int) $mapper['home_id']], $home); @@ -20,6 +21,7 @@ class StoreElement $away['sport_id'] = $mapper['sport_id']; $away['element_id'] = $mapper['txodds_away_id']; $away['provider_id'] = $mapper['provider_id']; + $home['add_by_method_id'] = 3; $away['name'] = $mapper['away']; ElementProvider::updateOrCreate(['provider_element_id' => (int) $mapper['away_id']], $away); diff --git a/app/Console/Commands/DbMapper/Store/StoreGroup.php b/app/Console/Commands/DbMapper/Store/StoreGroup.php index bec2d23d..cf8530e9 100644 --- a/app/Console/Commands/DbMapper/Store/StoreGroup.php +++ b/app/Console/Commands/DbMapper/Store/StoreGroup.php @@ -12,6 +12,7 @@ class StoreGroup $group['sport_id'] = $mapper['sport_id']; $group['competition_group_id'] = $mapper['txodds_group_id']; $group['provider_id'] = $mapper['provider_id']; + $home['add_by_method_id'] = 3; $group['name'] = $mapper['group']; CompetitionGroupProvider::updateOrCreate(['provider_group_id' => (int) $mapper['group_id']], $group); diff --git a/app/Console/Commands/Grapper/Fixtures/StoreData.php b/app/Console/Commands/Grapper/Fixtures/StoreData.php index ebde3633..e66252a3 100644 --- a/app/Console/Commands/Grapper/Fixtures/StoreData.php +++ b/app/Console/Commands/Grapper/Fixtures/StoreData.php @@ -20,6 +20,7 @@ class StoreData $ele['sport_id'] = $event['sport_id']; $ele['provider_id'] = $event['provider_id']; $ele['element_id'] = $match->home_id ?? 0; + $home['add_by_method_id'] = 1; $ele['name'] = $event['home']; ElementProvider::updateOrCreate(['provider_element_id' => (int) $event['home_id']], $ele); } @@ -29,6 +30,7 @@ class StoreData $ele['sport_id'] = $event['sport_id']; $ele['provider_id'] = $event['provider_id']; $ele['element_id'] = $match->away_id ?? 0; + $home['add_by_method_id'] = 1; $ele['name'] = $event['away']; ElementProvider::updateOrCreate(['provider_element_id' => (int) $event['away_id']], $ele); } @@ -38,6 +40,7 @@ class StoreData $group['sport_id'] = $event['sport_id']; $group['provider_id'] = $event['provider_id']; $group['competition_group_id'] = $match->competition_group_id; + $home['add_by_method_id'] = 1; $group['name'] = $event['group']; CompetitionGroupProvider::updateOrCreate(['provider_group_id' => (int) $event['group_id']], $group); } diff --git a/app/Console/Commands/Grapper/Fixtures/StoreElement.php b/app/Console/Commands/Grapper/Fixtures/StoreElement.php index 2269bc7c..bca76224 100644 --- a/app/Console/Commands/Grapper/Fixtures/StoreElement.php +++ b/app/Console/Commands/Grapper/Fixtures/StoreElement.php @@ -12,9 +12,11 @@ class StoreElement unset($ele['provider_element_id']); + $ele['add_by_method_id'] = 1; + $sport_id = $ele['sport_id'] ?? 0; - if (! isset($elements[$sport_id][$provider_element_id])) { + if ($sport_id && ! isset($elements[$sport_id][$provider_element_id])) { ElementProvider::updateOrCreate(['provider_element_id' => (int) $provider_element_id], $ele); diff --git a/app/Console/Commands/Grapper/Fixtures/StoreGroup.php b/app/Console/Commands/Grapper/Fixtures/StoreGroup.php index 6c537881..ee141c29 100644 --- a/app/Console/Commands/Grapper/Fixtures/StoreGroup.php +++ b/app/Console/Commands/Grapper/Fixtures/StoreGroup.php @@ -14,10 +14,11 @@ class StoreGroup $sport_id = $group['sport_id'] ?? 0; - if (! isset($groups[$sport_id][$provider_group_id])) { + $ele['add_by_method_id'] = 1; + + if ($sport_id && ! isset($groups[$sport_id][$provider_group_id])) { CompetitionGroupProvider::updateOrCreate(['provider_group_id' => (int) $provider_group_id], $group); - } } } diff --git a/app/Filament/Resources/Bettypes/Tables/BettypesTable.php b/app/Filament/Resources/Bettypes/Tables/BettypesTable.php index dac614d2..66ab9640 100644 --- a/app/Filament/Resources/Bettypes/Tables/BettypesTable.php +++ b/app/Filament/Resources/Bettypes/Tables/BettypesTable.php @@ -6,6 +6,7 @@ use App\Models\Sport; use Filament\Actions\EditAction; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; +use Filament\Tables\Enums\FiltersLayout; use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Table; @@ -41,7 +42,7 @@ class BettypesTable ->label('Sport') ->options(fn () => Sport::where('is_active', 1)->pluck('name', 'id') ->toArray()), - ]) + ], layout: FiltersLayout::AboveContent) ->recordActions([ EditAction::make()->hiddenLabel(), ]); diff --git a/app/Filament/Resources/CompetitionGroups/CompetitionGroupResource.php b/app/Filament/Resources/CompetitionGroups/CompetitionGroupResource.php index 2267d50c..d84cb6c6 100644 --- a/app/Filament/Resources/CompetitionGroups/CompetitionGroupResource.php +++ b/app/Filament/Resources/CompetitionGroups/CompetitionGroupResource.php @@ -16,13 +16,13 @@ class CompetitionGroupResource extends Resource { protected static ?string $model = CompetitionGroup::class; - protected static string|\BackedEnum|null $navigationIcon = 'phosphor-list-numbers'; + protected static string|\BackedEnum|null $navigationIcon = 'phosphor-folder'; protected static ?string $recordTitleAttribute = 'name'; protected static ?string $cluster = AdministratorCluster::class; - protected static string|UnitEnum|null $navigationGroup = 'Static Data'; + protected static string|UnitEnum|null $navigationGroup = 'Dynamic Data'; public static function form(Schema $schema): Schema { diff --git a/app/Filament/Resources/CompetitionGroups/Schemas/CompetitionGroupForm.php b/app/Filament/Resources/CompetitionGroups/Schemas/CompetitionGroupForm.php index 6662ddaf..3c8070fe 100644 --- a/app/Filament/Resources/CompetitionGroups/Schemas/CompetitionGroupForm.php +++ b/app/Filament/Resources/CompetitionGroups/Schemas/CompetitionGroupForm.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources\CompetitionGroups\Schemas; +use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; class CompetitionGroupForm @@ -10,7 +11,8 @@ class CompetitionGroupForm { return $schema ->components([ - // + TextInput::make('name') + ->required(), ]); } } diff --git a/app/Filament/Resources/CompetitionGroups/Tables/CompetitionGroupsTable.php b/app/Filament/Resources/CompetitionGroups/Tables/CompetitionGroupsTable.php index 09c88b8c..ddc78b07 100644 --- a/app/Filament/Resources/CompetitionGroups/Tables/CompetitionGroupsTable.php +++ b/app/Filament/Resources/CompetitionGroups/Tables/CompetitionGroupsTable.php @@ -2,9 +2,22 @@ namespace App\Filament\Resources\CompetitionGroups\Tables; +use App\Models\CompetitionGroupProvider; +use App\Models\Country; +use App\Models\ElementGroup; +use App\Models\Event; +use App\Models\Group; +use App\Models\Sport; +use Filament\Actions\BulkActionGroup; +use Filament\Actions\DeleteAction; +use Filament\Actions\DeleteBulkAction; +use Filament\Actions\EditAction; +use Filament\Notifications\Notification; 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; class CompetitionGroupsTable @@ -27,7 +40,8 @@ class CompetitionGroupsTable ->color('gray') ->label('Event') ->icon(fn ($record) => $record->country->icon), - TextColumn::make('name'), + TextColumn::make('name') + ->searchable(), SelectColumn::make('level') ->width(30) ->options([ @@ -35,6 +49,37 @@ class CompetitionGroupsTable 'MEDIUM' => 'MEDIUM', 'LOW' => 'LOW', ]), + ])->filters([ + SelectFilter::make('sport_id') + ->label('Sport') + ->options(fn () => Sport::where('is_active', 1)->pluck('name', 'id')->toArray()), + SelectFilter::make('country_id') + ->searchable() + ->label('Countries') + ->options(fn () => Country::orderBy('name')->pluck('name', 'id')->toArray()), + ], layout: FiltersLayout::AboveContent) + ->deferFilters(false) + ->recordActions([ + EditAction::make(), + DeleteAction::make() + ->tooltip('All elements connected to this group, including active events, will be deleted') + ->before(function ($record) { + Group::where('competition_group_id', $record->id)->delete(); + Event::where('competition_group_id', $record->id)->delete(); + ElementGroup::where('competition_group_id', $record->id)->delete(); + CompetitionGroupProvider::where('competition_group_id', $record->id)->delete(); + }) + ->successNotification( + Notification::make() + ->success() + ->title('Group deleted') + ->body('The group and all relations has been deleted successfully.'), + ), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), ]); } } diff --git a/app/Filament/Resources/CompetitonGroupProviders/CompetitonGroupProviderResource.php b/app/Filament/Resources/CompetitonGroupProviders/CompetitonGroupProviderResource.php new file mode 100644 index 00000000..3d5e1119 --- /dev/null +++ b/app/Filament/Resources/CompetitonGroupProviders/CompetitonGroupProviderResource.php @@ -0,0 +1,48 @@ + ListCompetitonGroupProviders::route('/'), + ]; + } + + public static function getNavigationBadge(): ?string + { + return parent::getEloquentQuery()->count(); + } +} diff --git a/app/Filament/Resources/CompetitonGroupProviders/Pages/CreateCompetitonGroupProvider.php b/app/Filament/Resources/CompetitonGroupProviders/Pages/CreateCompetitonGroupProvider.php new file mode 100644 index 00000000..c3042abd --- /dev/null +++ b/app/Filament/Resources/CompetitonGroupProviders/Pages/CreateCompetitonGroupProvider.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/CompetitonGroupProviders/Tables/CompetitonGroupProvidersTable.php b/app/Filament/Resources/CompetitonGroupProviders/Tables/CompetitonGroupProvidersTable.php new file mode 100644 index 00000000..64da286e --- /dev/null +++ b/app/Filament/Resources/CompetitonGroupProviders/Tables/CompetitonGroupProvidersTable.php @@ -0,0 +1,92 @@ +columns([ + IconColumn::make('sport.icon') + ->label('') + ->grow(false) + ->color('primary') + ->width(30) + ->icon(fn ($record) => $record->sport->icon) + ->tooltip(fn ($record) => $record->id) + ->visibleFrom('lg'), + TextColumn::make('provider.name')->color(fn ($record) => $record->provider->color), + TextColumn::make('competition_group.country.name') + ->wrap() + ->color('gray') + ->label('Event') + ->icon(fn ($record) => $record->competition_group->country->icon), + TextColumn::make('competition_group.name') + ->searchable(), + TextColumn::make('provider_group_id'), + TextColumn::make('name') + ->label('Group name') + ->searchable(), + TextColumn::make('add_by_method.name') + ->color(fn ($record) => $record->add_by_method->color) + ->icon(fn ($record) => $record->add_by_method->icon) + ->label('Add By'), + ])->filters([ + SelectFilter::make('sport_id') + ->label('Sport') + ->options(Sport::where('is_active', 1)->pluck('name', 'id')), + SelectFilter::make('country_id') + ->searchable() + ->label('Country') + ->options(Country::orderBy('name')->pluck('name', 'id')) + ->query(function (Builder $query, array $data) { + if (blank($data['value'])) { + return $query; + } + + return $query->whereHas('competition_group', function (Builder $query) use ($data) { + return $query->where('country_id', $data['value']); + }); + }), + SelectFilter::make('provider_id') + ->label('Provider') + ->options(Provider::where('color', '!=', null)->pluck('name', 'id')), + SelectFilter::make('add_by_method_id') + ->label('Provider') + ->options(AddByMethod::pluck('name', 'id')), + ], layout: FiltersLayout::AboveContent) + ->deferFilters(false) + ->recordActions([ + EditAction::make(), + DeleteAction::make() + ->successNotification( + Notification::make() + ->success() + ->title('Group deleted') + ->body('The provider group has been deleted successfully.'), + ), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/ElementProviders/ElementProviderResource.php b/app/Filament/Resources/ElementProviders/ElementProviderResource.php new file mode 100644 index 00000000..e3759694 --- /dev/null +++ b/app/Filament/Resources/ElementProviders/ElementProviderResource.php @@ -0,0 +1,48 @@ + ListElementProviders::route('/'), + ]; + } + + public static function getNavigationBadge(): ?string + { + return parent::getEloquentQuery()->count(); + } +} diff --git a/app/Filament/Resources/ElementProviders/Pages/CreateElementProvider.php b/app/Filament/Resources/ElementProviders/Pages/CreateElementProvider.php new file mode 100644 index 00000000..430e22a7 --- /dev/null +++ b/app/Filament/Resources/ElementProviders/Pages/CreateElementProvider.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->label('Client Name') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/ElementProviders/Tables/ElementProvidersTable.php b/app/Filament/Resources/ElementProviders/Tables/ElementProvidersTable.php new file mode 100644 index 00000000..3e3855c1 --- /dev/null +++ b/app/Filament/Resources/ElementProviders/Tables/ElementProvidersTable.php @@ -0,0 +1,85 @@ +columns([ + IconColumn::make('sport.icon') + ->label('') + ->grow(false) + ->color('primary') + ->width(30) + ->icon(fn ($record) => $record->sport->icon) + ->tooltip(fn ($record) => $record->id) + ->visibleFrom('lg'), + TextColumn::make('provider.name')->color(fn ($record) => $record->provider->color), + TextColumn::make('element.country.name') + ->wrap() + ->color('gray') + ->icon(fn ($record) => $record->element->country->icon), + TextColumn::make('provider_element_id'), + TextColumn::make('element_group.competition_group.name'), + TextColumn::make('element.name')->label('TXOdds Name'), + TextColumn::make('name')->label('Client Name'), + TextColumn::make('add_by_method.name') + ->color(fn ($record) => $record->add_by_method->color) + ->icon(fn ($record) => $record->add_by_method->icon) + ->label('Add By'), + ])->filters([ + SelectFilter::make('sport_id') + ->label('Sport') + ->options(Sport::where('is_active', 1)->pluck('name', 'id')), + SelectFilter::make('country_id') + ->searchable() + ->label('Country') + ->options(Country::orderBy('name')->pluck('name', 'id')) + ->query(function (Builder $query, array $data) { + if (blank($data['value'])) { + return $query; + } + + return $query->whereHas('element', function (Builder $query) use ($data) { + return $query->where('country_id', $data['value']); + }); + }), + SelectFilter::make('add_by_method_id') + ->label('Add By') + ->options(AddByMethod::pluck('name', 'id')), + ], layout: FiltersLayout::AboveContent) + ->deferFilters(false) + ->recordActions([ + EditAction::make(), + DeleteAction::make() + ->successNotification( + Notification::make() + ->success() + ->title('Element deleted') + ->body('The provider element has been deleted successfully.'), + ), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Elements/ElementResource.php b/app/Filament/Resources/Elements/ElementResource.php new file mode 100644 index 00000000..014b6f20 --- /dev/null +++ b/app/Filament/Resources/Elements/ElementResource.php @@ -0,0 +1,48 @@ + ListElements::route('/'), + ]; + } + + public static function getNavigationBadge(): ?string + { + return parent::getEloquentQuery()->count(); + } +} diff --git a/app/Filament/Resources/Elements/Pages/CreateElement.php b/app/Filament/Resources/Elements/Pages/CreateElement.php new file mode 100644 index 00000000..9d7a5280 --- /dev/null +++ b/app/Filament/Resources/Elements/Pages/CreateElement.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/Elements/Tables/ElementsTable.php b/app/Filament/Resources/Elements/Tables/ElementsTable.php new file mode 100644 index 00000000..94caeedb --- /dev/null +++ b/app/Filament/Resources/Elements/Tables/ElementsTable.php @@ -0,0 +1,108 @@ +columns([ + IconColumn::make('sport.icon') + ->label('') + ->grow(false) + ->color('primary') + ->width(30) + ->icon(fn ($record) => $record->sport->icon) + ->tooltip(fn ($record) => $record->id) + ->visibleFrom('lg'), + TextColumn::make('country.name') + ->wrap() + ->color('gray') + ->icon(fn ($record) => $record->country->icon), + TextColumn::make('element_group.competition_group.name')->label('Competition Group'), + // TextColumn::make('element_group.group.name')->label('Group'), + TextColumn::make('name')->searchable(), + ])->filters([ + SelectFilter::make('sport_id') + ->label('Sport') + ->options(Sport::where('is_active', 1)->pluck('name', 'id')), + Filter::make('competition_group') + ->columns(3)->columnSpan(3) + ->schema([ + Select::make('country_id') + ->searchable() + ->label('Country') + ->options(Country::orderBy('name')->pluck('name', 'id')) + ->live(), + Select::make('competition_group_id') + ->searchable() + ->label('Competition Group') + ->options(function (Get $get) { + if ($get('country_id')) { + return CompetitionGroup::where('country_id', $get('country_id'))->orderBy('name')->pluck('name', 'id'); + } else { + return CompetitionGroup::orderBy('name')->pluck('name', 'id'); + } + }), + ]) + ->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'], + function (Builder $query, $competition_group_id) { + return $query->whereHas('element_group', function (Builder $query) use ($competition_group_id) { + return $query->where('competition_group_id', $competition_group_id); + }); + } + ); + }), + ], layout: FiltersLayout::AboveContent) + ->deferFilters(false) + ->recordActions([ + EditAction::make(), + DeleteAction::make() + ->tooltip('All elements connected to this group, including active events, will be deleted') + ->before(function ($record) { + Event::where('home_id', $record->id)->delete(); + Event::where('away_id', $record->id)->delete(); + ElementProvider::where('element_id', $record->id)->delete(); + ElementGroup::where('element_id', $record->id)->delete(); + }) + ->successNotification( + Notification::make() + ->success() + ->title('Element deleted') + ->body('The element with all relations in other tables has been deleted successfully.'), + ), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Providers/ProviderResource.php b/app/Filament/Resources/Providers/ProviderResource.php index 73180aa1..b960ed52 100644 --- a/app/Filament/Resources/Providers/ProviderResource.php +++ b/app/Filament/Resources/Providers/ProviderResource.php @@ -17,7 +17,7 @@ class ProviderResource extends Resource { protected static ?string $model = Provider::class; - protected static ?int $navigationSort = 23; + protected static ?int $navigationSort = 2; protected static string|BackedEnum|null $navigationIcon = 'phosphor-books'; diff --git a/app/Filament/Resources/Supervisors/SupervisorResource.php b/app/Filament/Resources/Supervisors/SupervisorResource.php index a5d75ced..6d030ff3 100644 --- a/app/Filament/Resources/Supervisors/SupervisorResource.php +++ b/app/Filament/Resources/Supervisors/SupervisorResource.php @@ -19,7 +19,7 @@ class SupervisorResource extends Resource protected static ?string $cluster = AdministratorCluster::class; - protected static ?int $navigationSort = 20; + protected static ?int $navigationSort = 1; protected static string|\UnitEnum|null $navigationGroup = 'Grapper'; diff --git a/app/Filament/Resources/TxoddsMarkets/TxoddsMarketResource.php b/app/Filament/Resources/TxoddsMarkets/TxoddsMarketResource.php index 64fd2696..a811ca38 100644 --- a/app/Filament/Resources/TxoddsMarkets/TxoddsMarketResource.php +++ b/app/Filament/Resources/TxoddsMarkets/TxoddsMarketResource.php @@ -20,7 +20,7 @@ class TxoddsMarketResource extends Resource protected static ?string $cluster = AdministratorCluster::class; - protected static ?int $navigationSort = 24; + protected static ?int $navigationSort = 3; protected static string|UnitEnum|null $navigationGroup = 'Grapper'; diff --git a/app/Livewire/Mapper/StoreMapped.php b/app/Livewire/Mapper/StoreMapped.php index 44255c0c..7e84cebf 100644 --- a/app/Livewire/Mapper/StoreMapped.php +++ b/app/Livewire/Mapper/StoreMapped.php @@ -57,6 +57,7 @@ class StoreMapped $ele['sport_id'] = $event->sport_id; $ele['provider_id'] = Auth::user()->provider_id; $ele['element_id'] = $event->home_id ?? 0; + $ele['add_by_method_id'] = 2; $ele['name'] = $mapper->home; ElementProvider::updateOrCreate(['provider_element_id' => (int) $mapper->home_id], $ele); @@ -64,12 +65,14 @@ class StoreMapped $ele['sport_id'] = $event->sport_id; $ele['provider_id'] = Auth::user()->provider_id; $ele['element_id'] = $event->away_id ?? 0; + $ele['add_by_method_id'] = 2; $ele['name'] = $mapper->away; ElementProvider::updateOrCreate(['provider_element_id' => (int) $mapper->away_id], $ele); $group['sport_id'] = $event->sport_id; $group['provider_id'] = Auth::user()->provider_id; $group['competition_group_id'] = $event->competition_group_id; + $group['add_by_method_id'] = 2; $group['name'] = $mapper->group; CompetitionGroupProvider::updateOrCreate(['provider_group_id' => (int) $mapper->group_id], $group); diff --git a/app/Models/AddByMethod.php b/app/Models/AddByMethod.php new file mode 100644 index 00000000..3cff107a --- /dev/null +++ b/app/Models/AddByMethod.php @@ -0,0 +1,10 @@ +belongsTo(Provider::class); } + + public function sport() + { + return $this->belongsTo(Sport::class); + } + + public function add_by_method() + { + return $this->belongsTo(AddByMethod::class); + } } diff --git a/app/Models/Element.php b/app/Models/Element.php index 1f04d30b..6d3eb0ac 100644 --- a/app/Models/Element.php +++ b/app/Models/Element.php @@ -17,4 +17,14 @@ class Element extends Model { return $this->belongsTo(Sport::class); } + + public function country() + { + return $this->belongsTo(Country::class); + } + + public function element_group() + { + return $this->belongsTo(ElementGroup::class, 'id', 'element_id'); + } } diff --git a/app/Models/ElementGroup.php b/app/Models/ElementGroup.php index 91a62392..ca393bcd 100644 --- a/app/Models/ElementGroup.php +++ b/app/Models/ElementGroup.php @@ -11,4 +11,19 @@ class ElementGroup extends Model 'group_id', 'competition_group_id', ]; + + public function element() + { + return $this->belongsTo(Element::class); + } + + public function group() + { + return $this->belongsTo(Group::class); + } + + public function competition_group() + { + return $this->belongsTo(CompetitionGroup::class); + } } diff --git a/app/Models/ElementProvider.php b/app/Models/ElementProvider.php index d2df6271..281734d7 100644 --- a/app/Models/ElementProvider.php +++ b/app/Models/ElementProvider.php @@ -12,6 +12,7 @@ class ElementProvider extends Model 'element_id', 'provider_id', 'provider_element_id', + 'add_by_method_id', 'name', ]; @@ -20,6 +21,11 @@ class ElementProvider extends Model return $this->belongsTo(Sport::class); } + public function element_group() + { + return $this->belongsTo(ElementGroup::class, 'element_id', 'element_id'); + } + public function element() { return $this->belongsTo(Element::class); @@ -29,4 +35,9 @@ class ElementProvider extends Model { return $this->belongsTo(Provider::class); } + + public function add_by_method() + { + return $this->belongsTo(AddByMethod::class); + } } diff --git a/composer.lock b/composer.lock index 95e2d25b..b6d56381 100644 --- a/composer.lock +++ b/composer.lock @@ -11951,16 +11951,16 @@ }, { "name": "rector/rector", - "version": "2.3.6", + "version": "2.3.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "ca9ebb81d280cd362ea39474dabd42679e32ca6b" + "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/ca9ebb81d280cd362ea39474dabd42679e32ca6b", - "reference": "ca9ebb81d280cd362ea39474dabd42679e32ca6b", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/9c46ad17f57963932c9788fd1b0f1d07ff450370", + "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370", "shasum": "" }, "require": { @@ -11999,7 +11999,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.3.6" + "source": "https://github.com/rectorphp/rector/tree/2.3.7" }, "funding": [ { @@ -12007,7 +12007,7 @@ "type": "github" } ], - "time": "2026-02-06T14:25:06+00:00" + "time": "2026-02-19T14:44:16+00:00" }, { "name": "sebastian/cli-parser", diff --git a/database/migrations/2023_05_25_112750_create_element_provider_table.php b/database/migrations/2023_05_25_112750_create_element_provider_table.php index 45ca1b28..cf81266a 100644 --- a/database/migrations/2023_05_25_112750_create_element_provider_table.php +++ b/database/migrations/2023_05_25_112750_create_element_provider_table.php @@ -17,6 +17,7 @@ return new class extends Migration $table->integer('element_id')->index()->references('id')->on('elements'); $table->integer('provider_id')->default(0)->nullable()->index()->references('id')->on('providers'); $table->integer('provider_element_id')->index(); + $table->integer('add_by_method_id')->default(0)->nullable()->index(); $table->string('name'); $table->timestamps(); }); diff --git a/database/migrations/2023_05_25_112802_create_competition_group_provider_table.php b/database/migrations/2023_05_25_112802_create_competition_group_provider_table.php index 09ad4297..784c0154 100644 --- a/database/migrations/2023_05_25_112802_create_competition_group_provider_table.php +++ b/database/migrations/2023_05_25_112802_create_competition_group_provider_table.php @@ -17,6 +17,7 @@ return new class extends Migration $table->integer('competition_group_id')->default(0)->nullable()->index()->references('id')->on('competition_groups'); $table->integer('provider_id')->default(0)->nullable()->index()->references('id')->on('providers'); $table->integer('provider_group_id')->default(0)->nullable()->index(); + $table->integer('add_by_method_id')->default(0)->nullable()->index(); $table->string('name')->nullable(); $table->timestamps(); }); diff --git a/database/migrations/2026_02_20_100622_create_add_by_methods_table.php b/database/migrations/2026_02_20_100622_create_add_by_methods_table.php new file mode 100644 index 00000000..21730a46 --- /dev/null +++ b/database/migrations/2026_02_20_100622_create_add_by_methods_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('name'); + $table->string('color'); + $table->string('icon'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('add_by_methods'); + } +}; diff --git a/database/seeders/AddByMethodSeeder.php b/database/seeders/AddByMethodSeeder.php new file mode 100644 index 00000000..8df25fdd --- /dev/null +++ b/database/seeders/AddByMethodSeeder.php @@ -0,0 +1,24 @@ +