From 5a3c695603234d56243ebd960021ccb421542108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna-Sara=20S=C3=A9lea?= Date: Sat, 19 Apr 2025 18:05:55 +0200 Subject: [PATCH] Updated table view for reserve and reserveditems --- app/Filament/Pages/Reserve.php | 135 +++++++++++------- .../Resources/ReserveditemResource.php | 71 +++++---- lang/vendor/filament-panels/sv.json | 2 +- routes/web.php | 19 --- 4 files changed, 132 insertions(+), 95 deletions(-) diff --git a/app/Filament/Pages/Reserve.php b/app/Filament/Pages/Reserve.php index 62f367f..5571d35 100644 --- a/app/Filament/Pages/Reserve.php +++ b/app/Filament/Pages/Reserve.php @@ -36,6 +36,12 @@ use Filament\Tables\Columns\ImageColumn; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Actions\Action; use Filament\Support\Colors\Color; +use Filament\Tables\Columns\Layout\Split; +use Filament\Tables\Columns\Layout\Stack; +use Filament\Support\Enums\FontWeight; +use Filament\Tables\Columns\Layout\Panel; +use Filament\Tables\Columns\Layout\Grid; +use Filament\Notifications\Notification; class Reserve extends BasePage implements HasTable { @@ -51,31 +57,54 @@ class Reserve extends BasePage implements HasTable return $table ->query( Item::where('can_be_loaned', true)->where('type', "game")) ->columns([ - TextColumn::make('desc') - ->label('Beskrivning') - ->sortable() - ->searchable(), - ImageColumn::make('image') - ->label('Bild') - ->disk('local') - ->visibility('private'), - TextColumn::make('players') - ->label('Antal spelare') - ->sortable(), - TextColumn::make('play_time') - ->label('Speltid') - ->sortable(), - TextColumn::make('age') - ->label('Ålder') - ->sortable(), - IconColumn::make('reserved') - ->label('Tillgängligt') - ->falseIcon('heroicon-o-check-badge') - ->trueIcon('heroicon-o-x-mark') - ->falseColor('success') - ->trueColor('danger') - ->default(false), + Grid::make() + ->columns(1) + ->schema([ + Stack::make([ + TextColumn::make('reserved') + ->weight(FontWeight::Bold) + ->formatStateUsing(fn (string $state): string => $state ? 'Utlånad' : 'Tillgänglig') + ->color(fn($record) => $record->reserved ? 'danger' : 'success' ) + ->badge(), + ImageColumn::make('image') + ->label('Bild') + ->disk('local') + ->size('100%') + ->extraImgAttributes([ + 'class' => 'rounded-md' + ]) + ->visibility('private'), + TextColumn::make('desc') + ->label('Beskrivning') + ->sortable() + ->searchable() + ->weight(FontWeight::Bold) + ->size(TextColumn\TextColumnSize::Large), + Panel::make([ + Stack::make([ + TextColumn::make('players') + ->label('Antal spelare') + ->sortable() + ->icon('heroicon-m-users'), + TextColumn::make('play_time') + ->label('Speltid') + ->sortable() + ->icon('heroicon-m-clock'), + TextColumn::make('age') + ->label('Ålder') + ->sortable() + ->icon('heroicon-m-arrows-right-left'), + ])->extraAttributes(['class' => 'space-y-3']) + ]) + ])->extraAttributes(['class' => 'space-y-3']) + ]) + ]) + ->defaultSort('desc', 'asc') + ->contentGrid([ + 'sm' => 2, + 'md' => 3, + 'xl' => 4, ]) ->filters([ SelectFilter::make('category_id') @@ -90,8 +119,38 @@ class Reserve extends BasePage implements HasTable ->toggle() ],layout: FiltersLayout::AboveContent) ->actions([ + Action::make('reserve') + ->label('Reservera') + ->button() + ->color('primary') + ->form([ + TextInput::make('username') + ->label('Namn') + ->required(), + TextInput::make('email') + ->label('Email') + ->required(), + ]) + ->action(function (array $data, Item $record): void { + Reserveditem::create([ + 'item_id' => $record->id, + 'reserved_date' => Carbon::now(), + 'username' => $data['username'], + 'email' => $data['email'] + ]); + Item::where('id', $record->id)->update(['reserved' => true]); + Notification::make() + ->title('Spelet är reserverat!') + ->body('Ett bekräftelsemail har skickats till emailadressen du uppgav. Läs det för mer info om utlämning av spelet.') + ->success() + ->seconds(10) + ->send(); + }) + ->hidden(fn ($record) => $record->reserved), Action::make('Mer info') - ->modalSubmitAction(false) + ->modalSubmitAction(false) + ->button() + ->color('primary') ->infolist([ Section::make('Spel') ->schema([ @@ -115,31 +174,11 @@ class Reserve extends BasePage implements HasTable ->label('Ålder'), ]) ->columns(), - ]), - Action::make('reserve') - ->label('Reservera') - ->button() - ->color('primary') - ->form([ - TextInput::make('username') - ->label('Namn') - ->required(), - TextInput::make('email') - ->label('Email') - ->required(), - ]) - ->action(function (array $data, Item $record): void { - Reserveditem::create([ - 'item_id' => $record->id, - 'reserved_date' => Carbon::now(), - 'username' => $data['username'], - 'email' => $data['email'] - ]); - Item::where('id', $record->id)->update(['reserved' => true]); - }) - ->hidden(fn ($record) => $record->reserved) + ]), ]) ->bulkActions([ ]); + + } } diff --git a/app/Filament/Resources/ReserveditemResource.php b/app/Filament/Resources/ReserveditemResource.php index 84d4595..5076b30 100644 --- a/app/Filament/Resources/ReserveditemResource.php +++ b/app/Filament/Resources/ReserveditemResource.php @@ -23,6 +23,10 @@ use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\ImageColumn; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Actions\Action; +use Filament\Tables\Columns\Layout\Split; +use Filament\Tables\Columns\Layout\Stack; +use Filament\Support\Enums\FontWeight; +use Filament\Tables\Columns\Layout\Panel; class ReserveditemResource extends Resource @@ -73,33 +77,46 @@ class ReserveditemResource extends Resource return $table //->query(Reserveditem::withTrashed()) ->columns([ - TextColumn::make('item.desc') - ->label('Name') - ->translateLabel() - ->sortable(), - TextColumn::make('username') - ->label('User') - ->translateLabel() - ->sortable(), - TextColumn::make('email') - ->label('Email') - ->sortable(), - TextColumn::make('reserved_date') - ->label('Reservation date') - ->translateLabel() - ->sortable(), - TextColumn::make('delivered_date') - ->label('Delivery date') - ->translateLabel() - ->sortable(), - TextColumn::make('return_date') - ->label('Return date') - ->translateLabel() - ->sortable(), - TextColumn::make('returned_date') - ->label('Returned') - ->translateLabel() - ->sortable(), + Stack::make([ + TextColumn::make('item.desc') + ->label('Name') + ->translateLabel() + ->sortable() + ->weight(FontWeight::Bold) + ->size(TextColumn\TextColumnSize::Large), + TextColumn::make('username') + ->label('User') + ->translateLabel() + ->sortable() + ->icon('heroicon-m-user'), + TextColumn::make('email') + ->label('Email') + ->sortable() + ->icon('heroicon-m-envelope'), + TextColumn::make('reserved_date') + ->label('Reservation date') + ->translateLabel() + ->sortable() + ->dateTime('Y-m-d') + ->icon('heroicon-m-hand-raised'), + TextColumn::make('delivered_date') + ->label('Delivery date') + ->translateLabel() + ->sortable() + ->dateTime('Y-m-d') + ->icon('heroicon-m-arrow-up-tray') + , + TextColumn::make('return_date') + ->label('Return date') + ->translateLabel() + ->sortable() + ->dateTime('Y-m-d') + ->icon('heroicon-m-arrow-down-tray') + ])->extraAttributes(['class' => 'space-y-2']) + ]) + ->contentGrid([ + 'md' => 2, + 'xl' => 3, ]) ->filters([ // diff --git a/lang/vendor/filament-panels/sv.json b/lang/vendor/filament-panels/sv.json index f101150..00db29a 100644 --- a/lang/vendor/filament-panels/sv.json +++ b/lang/vendor/filament-panels/sv.json @@ -26,7 +26,7 @@ "Reservation": "Reservation", "Reservation date": "Reservationsdatum", "Delivery date": "Utlämningsdatum", - "Return date": "Årterlämningsdatum", + "Return date": "Återlämningsdatum", "Returned": "Återlämnad", "Delivered": "Utlämnad", "Users": "Användare", diff --git a/routes/web.php b/routes/web.php index 2fea339..0f42565 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,25 +6,6 @@ use Illuminate\Support\Facades\Route; use Inertia\Inertia; use App\Filament\Pages\Reserve; -//Route::get('/', function () { -// return Inertia::render('Welcome', [ -// 'canLogin' => Route::has('login'), -// 'canRegister' => Route::has('register'), -// 'laravelVersion' => Application::VERSION, -// 'phpVersion' => PHP_VERSION, -// ]); -//}); - -//Route::get('/dashboard', function () { -// return Inertia::render('Dashboard'); -//})->middleware(['auth', 'verified'])->name('dashboard'); - -//Route::middleware('auth')->group(function () { -// Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); -// Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); -// Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); -//}); - Route::get('reserve', Reserve::class); require __DIR__.'/auth.php';