useract wip

This commit is contained in:
salam committed 2026-02-13 07:38:17 +01:00
1 parent 10b0d334ab
commit 7e9d841856
19 files changed
+192 -49

No files matched your search

@@ -15,7 +15,7 @@ class ClientResource extends Resource
{ {
protected static ?string $model = Client::class; protected static ?string $model = Client::class;
protected static ?int $navigationSort = 32; protected static ?int $navigationSort = 33;
protected static string|\BackedEnum|null $navigationIcon = 'phosphor-baseball-helmet'; protected static string|\BackedEnum|null $navigationIcon = 'phosphor-baseball-helmet';
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\UserActivities\Pages;
use App\Filament\Resources\UserActivities\UserActivityResource;
use Filament\Resources\Pages\CreateRecord;
class CreateUserActivity extends CreateRecord
{
protected static string $resource = UserActivityResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\UserActivities\Pages;
use App\Filament\Resources\UserActivities\UserActivityResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditUserActivity extends EditRecord
{
protected static string $resource = UserActivityResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\UserActivities\Pages;
use App\Filament\Resources\UserActivities\UserActivityResource;
use Filament\Resources\Pages\ListRecords;
class ListUserActivities extends ListRecords
{
protected static string $resource = UserActivityResource::class;
}
@@ -0,0 +1,16 @@
<?php
namespace App\Filament\Resources\UserActivities\Schemas;
use Filament\Schemas\Schema;
class UserActivityForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
//
]);
}
}
@@ -0,0 +1,25 @@
<?php
namespace App\Filament\Resources\UserActivities\Tables;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class UserActivitiesTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('user.name'),
TextColumn::make('ip'),
TextColumn::make('country'),
TextColumn::make('location'),
TextColumn::make('created_at')->dateTime('M j, Y H:i'),
])
->defaultSort('created_at', 'desc')
->filters([
//
]);
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Filament\Resources\UserActivities;
use App\Filament\Clusters\Administrator\AdministratorCluster;
use App\Filament\Resources\UserActivities\Pages\ListUserActivities;
use App\Filament\Resources\UserActivities\Schemas\UserActivityForm;
use App\Filament\Resources\UserActivities\Tables\UserActivitiesTable;
use App\Models\UserActivity;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
class UserActivityResource extends Resource
{
protected static ?string $model = UserActivity::class;
protected static ?string $cluster = AdministratorCluster::class;
protected static ?int $navigationSort = 32;
protected static string|\UnitEnum|null $navigationGroup = 'User';
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack;
public static function form(Schema $schema): Schema
{
return UserActivityForm::configure($schema);
}
public static function table(Table $table): Table
{
return UserActivitiesTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListUserActivities::route('/'),
];
}
public static function getNavigationBadge(): ?string
{
return parent::getEloquentQuery()->count();
}
}
+9 -9
View File
@@ -18,6 +18,8 @@ class ColumnOdds extends Column
public $slots; public $slots;
public $empty_slots_icons;
public $bookmaker; public $bookmaker;
protected $max; protected $max;
@@ -40,8 +42,6 @@ class ColumnOdds extends Column
public $partner; public $partner;
public $partner_icon;
protected ?array $odds_labels; protected ?array $odds_labels;
protected bool $state = true; protected bool $state = true;
@@ -68,8 +68,6 @@ class ColumnOdds extends Column
return; return;
} }
$this->setPartnerIcon();
$this->setSlots(); $this->setSlots();
$this->has_data = count($this->data); $this->has_data = count($this->data);
@@ -131,11 +129,6 @@ class ColumnOdds extends Column
return $this->columns; return $this->columns;
} }
public function getPartnerBookmakerIcon()
{
return $this->partner_icon;
}
public function getSlots() public function getSlots()
{ {
if (auth()->user()->is_multiline_direct) { if (auth()->user()->is_multiline_direct) {
@@ -465,6 +458,11 @@ class ColumnOdds extends Column
}); });
} }
public function getBookmakerIcon($bookmaker_id)
{
return $this->empty_slots_icons[$bookmaker_id];
}
public function setPartnerIcon() public function setPartnerIcon()
{ {
$this->partner_icon = Bookmaker::where('id', auth()->user()->partner_bookmaker_id)->value('icon'); $this->partner_icon = Bookmaker::where('id', auth()->user()->partner_bookmaker_id)->value('icon');
@@ -474,6 +472,8 @@ class ColumnOdds extends Column
{ {
$this->slots = EventsTable::$slots[$this->bettype]; $this->slots = EventsTable::$slots[$this->bettype];
$this->empty_slots_icons = Bookmaker::pluck('icon', 'id')->all();
$this->bookmaker = EventsTable::$bookmaker[$this->bettype]; $this->bookmaker = EventsTable::$bookmaker[$this->bettype];
$this->filter = EventsTable::$filter[$this->bettype]; $this->filter = EventsTable::$filter[$this->bettype];
+6 -4
View File
@@ -1,6 +1,6 @@
<?php <?php
namespace Edwink\FilamentUserActivity\Http\Middleware; namespace App\Http\Middleware;
use App\Models\UserActivity; use App\Models\UserActivity;
use Closure; use Closure;
@@ -21,18 +21,20 @@ class RecordUserActivity
$response = $next($request); $response = $next($request);
$whoIsIp = request()->ip(); $whoIsIp = request()->ip();
$whoIsIp = '178.165.190.98';
$position = Location::get($whoIsIp); $position = Location::get($whoIsIp);
$session_id = session()->getId();
dd($position); // dd($position);
// Perform action // Perform action
if (Auth::id() !== null) { if (Auth::id() !== null) {
UserActivity::create([ UserActivity::create([
'url' => config('app.url').'/'.$request->path(), 'url' => config('app.url').'/'.$request->path(),
'user_id' => Auth::id(), 'user_id' => Auth::id(),
'session_id' => $session_id,
'ip' => $whoIsIp, 'ip' => $whoIsIp,
'country' => $position->countryName, 'country' => $position->countryName,
'location' => $position->countryName, 'location' => $position->cityName,
]); ]);
} }
+11 -1
View File
@@ -7,10 +7,20 @@ use Illuminate\Database\Eloquent\Model;
class UserActivity extends Model class UserActivity extends Model
{ {
protected $fillable = [ protected $fillable = [
'user_id', 'url', 'user_id',
'url',
'session_id',
'ip',
'country',
'location',
]; ];
protected $casts = [ protected $casts = [
'created_at' => 'datetime', 'created_at' => 'datetime',
]; ];
public function user()
{
return $this->belongsTo(User::class);
}
} }
@@ -3,6 +3,7 @@
namespace App\Providers\Filament; namespace App\Providers\Filament;
use Agencetwogether\HooksHelper\HooksHelperPlugin; use Agencetwogether\HooksHelper\HooksHelperPlugin;
use App\Http\Middleware\RecordUserActivity;
use Awcodes\LightSwitch\Enums\Alignment; use Awcodes\LightSwitch\Enums\Alignment;
use Awcodes\LightSwitch\LightSwitchPlugin; use Awcodes\LightSwitch\LightSwitchPlugin;
use BezhanSalleh\FilamentShield\FilamentShieldPlugin; use BezhanSalleh\FilamentShield\FilamentShieldPlugin;
@@ -38,6 +39,9 @@ class AdminPanelProvider extends PanelProvider
{ {
return $panel return $panel
->id('admin') ->id('admin')
->middleware([
RecordUserActivity::class,
])
->path('') ->path('')
->login() ->login()
->passwordReset(RequestPasswordReset::class) ->passwordReset(RequestPasswordReset::class)
@@ -15,6 +15,7 @@ return new class extends Migration
$table->id(); $table->id();
$table->unsignedInteger('user_id')->nullable(); $table->unsignedInteger('user_id')->nullable();
$table->string('session_id');
$table->string('url'); $table->string('url');
$table->string('ip'); $table->string('ip');
$table->string('country'); $table->string('country');
+4
View File
@@ -8,6 +8,10 @@
@source '../../../../vendor/guava/filament-modal-relation-managers/resources/**/*'; @source '../../../../vendor/guava/filament-modal-relation-managers/resources/**/*';
@source '../../../../vendor/jaocero/radio-deck/resources/views'; @source '../../../../vendor/jaocero/radio-deck/resources/views';
.fi-ta-header-toolbar,
.fi-ta-filters-above-content-ctn {
@apply pt-0
}
/* Reduce gap between widgets and content */ /* Reduce gap between widgets and content */
.fi-page-content { .fi-page-content {
@@ -1,4 +1,5 @@
<div <div
class="text-primary-600 dark:text-primary-500 font-bold"> class="text-gray-400 bg-gray-50 border border-gray-300 dark:text-primary-500 dark:!border-gray-800 dark:bg-gray-900 rounded">
{{ $slot }} {{ $slot }}
</div> </div>
@@ -1,5 +1,5 @@
<div <div
class="grid grid-cols-4 text-xs gap-1 p-1 border rounded border-zinc-200 dark:border-zinc-800 bg-gray-100 dark:bg-gray-900 text-center shadow"> class="grid grid-cols-4 text-xs gap-1 p-1 text-gray-400 dark:text-primary-500 border rounded border-gray-200 dark:border-gray-800 bg-gray-100 dark:bg-gray-900 text-center shadow">
<div class="text-nowrap">{{ $title }}</div> <div class="text-nowrap">{{ $title }}</div>
@if ($red) @if ($red)
@@ -14,19 +14,19 @@
@if ($getColumns() == 2) @if ($getColumns() == 2)
<div {{ $getExtraAttributeBag() }} class="grid grid-cols-4 gap-1 text-xs text-center w-60 mr-3 p-1"> <div {{ $getExtraAttributeBag() }} class="grid grid-cols-4 gap-1 text-xs text-center w-60 mr-3 p-1">
@else @else
<div {{ $getExtraAttributeBag() }} class="grid grid-cols-5 gap-1 text-xs text-center w-76 mr-3 p-1"> <div {{ $getExtraAttributeBag() }} class="grid grid-cols-5 gap-1 text-xs text-center w-76 mr-3 p-1">
@endif @endif
@include('filament.tables.columns.multiline.label', ['labels' => $label]) @include('filament.tables.columns.multiline.label', ['labels' => $label])
</div> </div>
</div> </div>
@if ($getColumns() == 2) @if ($getColumns() == 2)
<div {{ $getExtraAttributeBag() }} class="grid grid-cols-4 gap-1 text-xs text-center w-60 mr-2 mb-1 bg-blue-50 dark:bg-gray-950 p-1"> <div {{ $getExtraAttributeBag() }} class="grid grid-cols-4 gap-1 text-xs text-center w-60 mr-2 mb-2">
@else @else
<div {{ $getExtraAttributeBag() }} class="grid grid-cols-5 gap-1 text-xs text-center w-76 mr-2 mb-1 bg-blue-50 dark:bg-gray-950 p-1"> <div {{ $getExtraAttributeBag() }} class="grid grid-cols-5 gap-1 text-xs text-center w-76 mr-1 mb-2">
@endif @endif
@if(auth()->user()->partner_show == 1) @if (auth()->user()->partner_show == 1)
@include('filament.tables.columns.multiline.multiline-client-partner') @include('filament.tables.columns.multiline.multiline-client-partner')
@include('filament.tables.columns.multiline.multiline-partner') @include('filament.tables.columns.multiline.multiline-partner')
@else @else
@@ -41,8 +41,8 @@
@if ($getColumns() == 2) @if ($getColumns() == 2)
<div {{ $getExtraAttributeBag() }} class="grid grid-cols-4 gap-1 text-xs text-center w-60 mr-3 p-1 mb-5"> <div {{ $getExtraAttributeBag() }} class="grid grid-cols-4 gap-1 text-xs text-center w-60 mr-3 p-1 mb-5">
@else @else
<div {{ $getExtraAttributeBag() }} class="grid grid-cols-5 gap-1 text-xs text-center w-76 mr-3 p-1 mb-5"> <div {{ $getExtraAttributeBag() }} class="grid grid-cols-5 gap-1 text-xs text-center w-76 mr-3 p-1 mb-5">
@endif @endif
@if (auth()->user()->is_multiline_direct) @if (auth()->user()->is_multiline_direct)
@@ -233,10 +233,10 @@
'd' => 1, 'd' => 1,
]) ])
@else @else
{{-- @include('filament.tables.columns.multiline.bkm', [ @include('filament.tables.columns.multiline.bkm', [
'bookmaker_id' => auth()->user()->bookmaker_id, 'bookmaker_id' => auth()->user()->bookmaker_id,
'icon' => auth()->user()->bookmaker->icon ?? '', 'icon' => auth()->user()->bookmaker->icon ?? '',
]) --}} ])
<div>&nbsp;</div> <div>&nbsp;</div>
<div></div> <div></div>
<div></div> <div></div>
@@ -233,10 +233,10 @@
'd' => 1, 'd' => 1,
]) ])
@else @else
{{-- @include('filament.tables.columns.multiline.bkm', [ @include('filament.tables.columns.multiline.bkm', [
'bookmaker_id' => auth()->user()->bookmaker_id, 'bookmaker_id' => auth()->user()->partner_bookmaker_id,
'icon' => auth()->user()->bookmaker->icon ?? '', 'icon' => $getBookmakerIcon(auth()->user()->partner_bookmaker_id),
]) --}} ])
<div>&nbsp;</div> <div>&nbsp;</div>
<div></div> <div></div>
<div></div> <div></div>
@@ -1,7 +1,4 @@
@foreach ($slots as $slot) @foreach ($slots as $slot)
@php @php
$taken = false; $taken = false;
$compare_bookmaker_id = $getCompareBookmaker(); $compare_bookmaker_id = $getCompareBookmaker();
@@ -9,14 +6,13 @@
@endphp @endphp
@foreach ($multilines as $multiline) @foreach ($multilines as $multiline)
@if ($multiline->bookmaker_id == $slot) @if ($multiline->bookmaker_id == $slot)
@php @php
$taken = true; $taken = true;
$favorit = 0; $favorit = 0;
$compared = $compare_bookmaker_id == $multiline->bookmaker_id ? 1 :0; $compared = $compare_bookmaker_id == $multiline->bookmaker_id ? 1 : 0;
if($compared){ if ($compared) {
$favorit = min($client?->h3w,$client?->d3w,$client?->a3w); $favorit = min($client?->h3w, $client?->d3w, $client?->a3w);
} }
@endphp @endphp
@@ -26,7 +22,6 @@
]) ])
@switch ($getBettype()) @switch ($getBettype())
@case ('odds_2ways') @case ('odds_2ways')
@include('filament.tables.columns.multiline.odd-slots', [ @include('filament.tables.columns.multiline.odd-slots', [
'odd' => $multiline->h2w, 'odd' => $multiline->h2w,
@@ -43,7 +38,6 @@
'd' => 2, 'd' => 2,
]) ])
@break; @break;
@case ('odds_tq') @case ('odds_tq')
@include('filament.tables.columns.multiline.odd', [ @include('filament.tables.columns.multiline.odd', [
'odd' => $multiline->htq, 'odd' => $multiline->htq,
@@ -56,7 +50,6 @@
'd' => 2, 'd' => 2,
]) ])
@break; @break;
@case ('odds_2ways_s1') @case ('odds_2ways_s1')
@include('filament.tables.columns.multiline.odd', [ @include('filament.tables.columns.multiline.odd', [
'odd' => $multiline->h2w, 'odd' => $multiline->h2w,
@@ -69,7 +62,6 @@
'd' => 2, 'd' => 2,
]) ])
@break; @break;
@case ('odds_3ways') @case ('odds_3ways')
@include('filament.tables.columns.multiline.odd-slots', [ @include('filament.tables.columns.multiline.odd-slots', [
'odd' => $multiline?->h3w, 'odd' => $multiline?->h3w,
@@ -93,7 +85,6 @@
'd' => 2, 'd' => 2,
]) ])
@break; @break;
@case ('odds_3ways_ht') @case ('odds_3ways_ht')
@include('filament.tables.columns.multiline.odd', [ @include('filament.tables.columns.multiline.odd', [
'odd' => $multiline->h3w, 'odd' => $multiline->h3w,
@@ -173,7 +164,6 @@
'd' => 1, 'd' => 1,
]) ])
@break; @break;
@case ('odds_points_ht') @case ('odds_points_ht')
@case ('odds_points_q1') @case ('odds_points_q1')
@@ -193,7 +183,6 @@
'd' => 1, 'd' => 1,
]) ])
@break; @break;
@case ('odds_totals') @case ('odds_totals')
@case ('odds_totals_ht') @case ('odds_totals_ht')
@@ -227,15 +216,16 @@
@endif @endif
@endforeach @endforeach
@if(!$taken) @if (!$taken)
<div>&nbsp;</div> @include('filament.tables.columns.multiline.bkm', [
'bookmaker_id' => $slot,
'icon' => $getBookmakerIcon($slot),
])
<div></div> <div></div>
<div></div> <div></div>
<div></div> <div></div>
@if ($getColumns() == 3) @if ($getColumns() == 3)
<div></div> <div></div>
@endif @endif
@endif @endif
@endforeach @endforeach