From 160e771a6892f670c89504a999b17907d7bce6e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna-Sara=20S=C3=A9lea?= Date: Sun, 19 Jan 2025 10:30:05 +0100 Subject: [PATCH] Reserveditems: migration, model, filament --- .../Resources/ReserveditemResource.php | 121 ++++++++++++++++++ .../Pages/CreateReserveditem.php | 57 +++++++++ .../Pages/EditReserveditem.php | 56 ++++++++ .../Pages/ListReserveditems.php | 19 +++ .../Resources/ReserveditemResourceUser.php | 105 +++++++++++++++ .../Pages/CreateReserveditemUser.php | 51 ++++++++ app/Models/Reserveditem.php | 37 ++++++ .../2025_01_16_061731_reserveditems_table.php | 38 ++++++ ..._01_17_061731_user_reserveditems_table.php | 32 +++++ 9 files changed, 516 insertions(+) create mode 100644 app/Filament/Resources/ReserveditemResource.php create mode 100644 app/Filament/Resources/ReserveditemResource/Pages/CreateReserveditem.php create mode 100644 app/Filament/Resources/ReserveditemResource/Pages/EditReserveditem.php create mode 100644 app/Filament/Resources/ReserveditemResource/Pages/ListReserveditems.php create mode 100644 app/Filament/Resources/ReserveditemResourceUser.php create mode 100644 app/Filament/Resources/ReserveditemResourceUser/Pages/CreateReserveditemUser.php create mode 100644 app/Models/Reserveditem.php create mode 100644 database/migrations/2025_01_16_061731_reserveditems_table.php create mode 100644 database/migrations/2025_01_17_061731_user_reserveditems_table.php diff --git a/app/Filament/Resources/ReserveditemResource.php b/app/Filament/Resources/ReserveditemResource.php new file mode 100644 index 0000000..a80ab0c --- /dev/null +++ b/app/Filament/Resources/ReserveditemResource.php @@ -0,0 +1,121 @@ +schema([ + Forms\Components\Select::make('item_id') + ->label('Välj item att lån') + ->relationship( + name: 'item', + titleAttribute: 'desc', + modifyQueryUsing: fn ($query) => $query->where('can_be_loaned', true)->where('reserved', false) + ) + ->required() + ->disabledOn('edit') + ->hiddenOn('edit'), + //Forms\Components\TextInput::make('user_id') + // ->label('Användare') + // ->default(auth()->id()) + // ->disabledOn(['edit', 'create']) + // ->hiddenOn('edit'), + Section::make('') + ->schema([ + Forms\Components\Toggle::make('delivered'), + Forms\Components\Toggle::make('returned') + ]) + + ]); + } + + public static function table(Table $table): Table + { + return $table + //->query(Reserveditem::withTrashed()) + ->columns([ + Tables\Columns\TextColumn::make('item.desc') + ->label('Namn') + ->sortable(), + Tables\Columns\TextColumn::make('username') + ->label('Användare') + ->sortable(), + Tables\Columns\TextColumn::make('reserved_date') + ->label('Reserveringsdatum') + ->sortable(), + Tables\Columns\TextColumn::make('delivered_date') + ->label('Utlämningsdatum') + ->sortable(), + Tables\Columns\TextColumn::make('return_date') + ->label('Återlämningsdatum') + ->sortable(), + Tables\Columns\TextColumn::make('returned_date') + ->label('Återlämnad') + ->sortable(), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListReserveditems::route('/'), + 'create' => Pages\CreateReserveditem::route('/create'), + 'edit' => Pages\EditReserveditem::route('/{record}/edit'), + ]; + } + + public static function getWidgets(): array +{ + return [ + ItemResource\Widgets\ItemsOverview::class, + ]; +} + +public static function canViewAny(): bool + { + return auth()->user()->is_admin==true; + } +} diff --git a/app/Filament/Resources/ReserveditemResource/Pages/CreateReserveditem.php b/app/Filament/Resources/ReserveditemResource/Pages/CreateReserveditem.php new file mode 100644 index 0000000..a193abb --- /dev/null +++ b/app/Filament/Resources/ReserveditemResource/Pages/CreateReserveditem.php @@ -0,0 +1,57 @@ +id(); + $data['username'] = auth()->user()->name; + $data['reserved_date'] = Carbon::now(); + + if ($data['delivered']) + { + $data['delivered_date'] = Carbon::now(); + $data['return_date'] = Carbon::now()->addMonths(1); + } + + if ($data['returned']) + { + $data['returned_date'] = Carbon::now(); + } + + // Item::where('id', $data['user_id'])->update(['reserved' => 'true']); + + return static::getModel()::create($data); + } + + protected function afterCreate(): void + { + $record = $this->record; + Item::where('id', $record->item_id)->update(['reserved' => true]); + } + + protected function getRedirectUrl(): string + { + return $this->getResource()::getUrl('index'); + } + + protected function getFooterWidgets(): array + { + return [ + ItemResource\Widgets\ItemsOverview::class, + ]; + } +} diff --git a/app/Filament/Resources/ReserveditemResource/Pages/EditReserveditem.php b/app/Filament/Resources/ReserveditemResource/Pages/EditReserveditem.php new file mode 100644 index 0000000..06d04ad --- /dev/null +++ b/app/Filament/Resources/ReserveditemResource/Pages/EditReserveditem.php @@ -0,0 +1,56 @@ +id(); + $data['username'] = auth()->user()->name; + + if ($data['delivered']) + { + $data['delivered_date'] = Carbon::now(); + $data['return_date'] = Carbon::now()->addMonths(1); + } + + if ($data['returned']) + { + $data['returned_date'] = Carbon::now(); + } + + return $data; + } + + protected function afterSave(): void + { + $record = $this->record; + if ($record->returned) { + Item::where('id', $record->item_id)->update(['reserved' => false]); + Reserveditem::where('id', $record->id)->delete(); + } + + } + + protected function getRedirectUrl(): string + { + return $this->getResource()::getUrl('index'); + } +} diff --git a/app/Filament/Resources/ReserveditemResource/Pages/ListReserveditems.php b/app/Filament/Resources/ReserveditemResource/Pages/ListReserveditems.php new file mode 100644 index 0000000..8d26657 --- /dev/null +++ b/app/Filament/Resources/ReserveditemResource/Pages/ListReserveditems.php @@ -0,0 +1,19 @@ +schema([ + Forms\Components\Select::make('item_id') + ->label('Välj item att låna') + ->relationship( + name: 'item', + titleAttribute: 'desc', + modifyQueryUsing: fn ($query) => $query->where('can_be_loaned', true)->where('reserved', false) + ) + ->required(), + //Forms\Components\TextInput::make('user_id') + // ->label('Användare') + // ->default(auth()->id()) + // ->disabledOn('create') + // //->hiddenOn('create') + // ->readOnly(), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('items.desc') + ->label('Namn') + ->sortable(), + Tables\Columns\TextColumn::make('username') + ->label('Användare') + ->sortable(), + Tables\Columns\TextColumn::make('reserved_date') + ->label('Reserveringsdatum') + ->sortable(), + Tables\Columns\TextColumn::make('delivered_date') + ->label('Utlämningsdatum') + ->sortable(), + Tables\Columns\TextColumn::make('return_date') + ->label('Återlämningsdatum') + ->sortable(), + Tables\Columns\TextColumn::make('returned_date') + ->label('Återlämnad') + ->sortable(), + ]) + ->filters([ + // + ]) + ->actions([ + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\CreateReserveditemUser::route('/'), + ]; + } + + public static function getWidgets(): array +{ + return [ + ItemResource\Widgets\ItemsOverview::class, + ]; +} +} diff --git a/app/Filament/Resources/ReserveditemResourceUser/Pages/CreateReserveditemUser.php b/app/Filament/Resources/ReserveditemResourceUser/Pages/CreateReserveditemUser.php new file mode 100644 index 0000000..d1c02b0 --- /dev/null +++ b/app/Filament/Resources/ReserveditemResourceUser/Pages/CreateReserveditemUser.php @@ -0,0 +1,51 @@ +id(); + $data['username'] = auth()->user()->name; + $data['reserved_date'] = Carbon::now(); + $data['delivered'] = false; + $data['returned'] = false; + $data['delivered_date'] = null; + $data['return_date'] = null;; + $data['returned_date'] = null; + + + return static::getModel()::create($data); + } + + protected function getRedirectUrl(): string + { + return $this->getResource()::getUrl('index'); + } + + protected function afterCreate(): void + { + $record = $this->record; + Item::where('id', $record->item_id)->update(['reserved' => true]); + } + + protected function getFooterWidgets(): array + { + return [ + ItemResource\Widgets\ItemsOverview::class, + ]; + } +} diff --git a/app/Models/Reserveditem.php b/app/Models/Reserveditem.php new file mode 100644 index 0000000..769b490 --- /dev/null +++ b/app/Models/Reserveditem.php @@ -0,0 +1,37 @@ +belongsToMany(User::class, 'user_reserveditems')->withTimestamps(); + } + + public function item() + { + return $this->belongsTo(Item::class); + } +} diff --git a/database/migrations/2025_01_16_061731_reserveditems_table.php b/database/migrations/2025_01_16_061731_reserveditems_table.php new file mode 100644 index 0000000..45b6466 --- /dev/null +++ b/database/migrations/2025_01_16_061731_reserveditems_table.php @@ -0,0 +1,38 @@ +bigIncrements('id'); + $table->foreignId('item_id')->constrained('items')->cascadeOnDelete(); + $table->integer('user_id')->nullable(); + $table->string('username')->nullable(); + $table->timestamp('reserved_date')->nullable(); + $table->timestamp('delivered_date')->nullable(); + $table->timestamp('return_date')->nullable(); + $table->timestamp('returned_date')->nullable(); + $table->boolean('delivered')->default(false); + $table->boolean('returned')->default(false); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('reserveditems'); + } +}; diff --git a/database/migrations/2025_01_17_061731_user_reserveditems_table.php b/database/migrations/2025_01_17_061731_user_reserveditems_table.php new file mode 100644 index 0000000..12c7588 --- /dev/null +++ b/database/migrations/2025_01_17_061731_user_reserveditems_table.php @@ -0,0 +1,32 @@ +bigIncrements('id'); + $table->foreignIdFor(Reserveditem::class); + $table->foreignIdFor(User::class); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_reserveditems'); + } +};