Updated table view for reserve and reserveditems

This commit is contained in:
Anna-Sara Sélea 2025-04-19 18:05:55 +02:00
parent d11c5b746f
commit 5a3c695603
4 changed files with 132 additions and 95 deletions

View file

@ -36,6 +36,12 @@ use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Actions\Action; use Filament\Tables\Actions\Action;
use Filament\Support\Colors\Color; 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 class Reserve extends BasePage implements HasTable
{ {
@ -51,31 +57,54 @@ class Reserve extends BasePage implements HasTable
return $table return $table
->query( Item::where('can_be_loaned', true)->where('type', "game")) ->query( Item::where('can_be_loaned', true)->where('type', "game"))
->columns([ ->columns([
TextColumn::make('desc') Grid::make()
->label('Beskrivning') ->columns(1)
->sortable() ->schema([
->searchable(), Stack::make([
ImageColumn::make('image') TextColumn::make('reserved')
->label('Bild') ->weight(FontWeight::Bold)
->disk('local') ->formatStateUsing(fn (string $state): string => $state ? 'Utlånad' : 'Tillgänglig')
->visibility('private'), ->color(fn($record) => $record->reserved ? 'danger' : 'success' )
TextColumn::make('players') ->badge(),
->label('Antal spelare') ImageColumn::make('image')
->sortable(), ->label('Bild')
TextColumn::make('play_time') ->disk('local')
->label('Speltid') ->size('100%')
->sortable(), ->extraImgAttributes([
TextColumn::make('age') 'class' => 'rounded-md'
->label('Ålder') ])
->sortable(), ->visibility('private'),
IconColumn::make('reserved') TextColumn::make('desc')
->label('Tillgängligt') ->label('Beskrivning')
->falseIcon('heroicon-o-check-badge') ->sortable()
->trueIcon('heroicon-o-x-mark') ->searchable()
->falseColor('success') ->weight(FontWeight::Bold)
->trueColor('danger') ->size(TextColumn\TextColumnSize::Large),
->default(false), 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([ ->filters([
SelectFilter::make('category_id') SelectFilter::make('category_id')
@ -90,8 +119,38 @@ class Reserve extends BasePage implements HasTable
->toggle() ->toggle()
],layout: FiltersLayout::AboveContent) ],layout: FiltersLayout::AboveContent)
->actions([ ->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') Action::make('Mer info')
->modalSubmitAction(false) ->modalSubmitAction(false)
->button()
->color('primary')
->infolist([ ->infolist([
Section::make('Spel') Section::make('Spel')
->schema([ ->schema([
@ -115,31 +174,11 @@ class Reserve extends BasePage implements HasTable
->label('Ålder'), ->label('Ålder'),
]) ])
->columns(), ->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([ ->bulkActions([
]); ]);
} }
} }

View file

@ -23,6 +23,10 @@ use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ImageColumn; use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Actions\Action; 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 class ReserveditemResource extends Resource
@ -73,33 +77,46 @@ class ReserveditemResource extends Resource
return $table return $table
//->query(Reserveditem::withTrashed()) //->query(Reserveditem::withTrashed())
->columns([ ->columns([
TextColumn::make('item.desc') Stack::make([
->label('Name') TextColumn::make('item.desc')
->translateLabel() ->label('Name')
->sortable(), ->translateLabel()
TextColumn::make('username') ->sortable()
->label('User') ->weight(FontWeight::Bold)
->translateLabel() ->size(TextColumn\TextColumnSize::Large),
->sortable(), TextColumn::make('username')
TextColumn::make('email') ->label('User')
->label('Email') ->translateLabel()
->sortable(), ->sortable()
TextColumn::make('reserved_date') ->icon('heroicon-m-user'),
->label('Reservation date') TextColumn::make('email')
->translateLabel() ->label('Email')
->sortable(), ->sortable()
TextColumn::make('delivered_date') ->icon('heroicon-m-envelope'),
->label('Delivery date') TextColumn::make('reserved_date')
->translateLabel() ->label('Reservation date')
->sortable(), ->translateLabel()
TextColumn::make('return_date') ->sortable()
->label('Return date') ->dateTime('Y-m-d')
->translateLabel() ->icon('heroicon-m-hand-raised'),
->sortable(), TextColumn::make('delivered_date')
TextColumn::make('returned_date') ->label('Delivery date')
->label('Returned') ->translateLabel()
->translateLabel() ->sortable()
->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([ ->filters([
// //

View file

@ -26,7 +26,7 @@
"Reservation": "Reservation", "Reservation": "Reservation",
"Reservation date": "Reservationsdatum", "Reservation date": "Reservationsdatum",
"Delivery date": "Utlämningsdatum", "Delivery date": "Utlämningsdatum",
"Return date": rterlämningsdatum", "Return date": terlämningsdatum",
"Returned": "Återlämnad", "Returned": "Återlämnad",
"Delivered": "Utlämnad", "Delivered": "Utlämnad",
"Users": "Användare", "Users": "Användare",

View file

@ -6,25 +6,6 @@ use Illuminate\Support\Facades\Route;
use Inertia\Inertia; use Inertia\Inertia;
use App\Filament\Pages\Reserve; 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); Route::get('reserve', Reserve::class);
require __DIR__.'/auth.php'; require __DIR__.'/auth.php';