Reserveditems: migration, model, filament

This commit is contained in:
Anna-Sara Sélea 2025-01-19 10:30:05 +01:00
parent b6a3d988f1
commit 160e771a68
9 changed files with 516 additions and 0 deletions

View file

@ -0,0 +1,121 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ReserveditemResource\Pages;
use App\Filament\Resources\ReserveditemResource\RelationManagers;
use App\Models\Reserveditem;
use App\Models\Item;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
class ReserveditemResource extends Resource
{
protected static ?string $model = Reserveditem::class;
protected static ?string $navigationIcon = 'heroicon-o-archive-box-x-mark';
protected static ?string $modelLabel = 'Reserverade items';
protected static ?string $title = 'Reserverade item';
public static function form(Form $form): Form
{
return $form
->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;
}
}

View file

@ -0,0 +1,57 @@
<?php
namespace App\Filament\Resources\ReserveditemResource\Pages;
use App\Filament\Resources\ReserveditemResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use App\Filament\Resources\ItemResource;
use App\Models\Item;
class CreateReserveditem extends CreateRecord
{
protected static string $resource = ReserveditemResource::class;
protected function handleRecordCreation(array $data): Model
{
$data['user_id'] = auth()->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,
];
}
}

View file

@ -0,0 +1,56 @@
<?php
namespace App\Filament\Resources\ReserveditemResource\Pages;
use App\Filament\Resources\ReserveditemResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
use Carbon\Carbon;
use App\Models\Item;
use App\Models\Reserveditem;
class EditReserveditem extends EditRecord
{
protected static string $resource = ReserveditemResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
protected function mutateFormDataBeforeSave(array $data): array
{
$data['user_id'] = auth()->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');
}
}

View file

@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ReserveditemResource\Pages;
use App\Filament\Resources\ReserveditemResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListReserveditems extends ListRecords
{
protected static string $resource = ReserveditemResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View file

@ -0,0 +1,105 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ReserveditemResourceUser\Pages;
use App\Filament\Resources\ReserveditemResourceUser\RelationManagers;
use App\Models\Reserveditem;
use App\Models\Item;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class ReserveditemResourceUser extends Resource
{
protected static ?string $model = Reserveditem::class;
protected static ?string $navigationIcon = 'heroicon-o-archive-box-x-mark';
protected static ?string $modelLabel = 'Reservera item';
protected static ?string $title = 'Reservera item';
protected static ?string $slug = 'user';
public static function form(Form $form): Form
{
return $form
->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,
];
}
}

View file

@ -0,0 +1,51 @@
<?php
namespace App\Filament\Resources\ReserveditemResourceUser\Pages;
use App\Filament\Resources\ReserveditemResourceUser;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use App\Filament\Resources\ItemResource;
use App\Models\Item;
class CreateReserveditemUser extends CreateRecord
{
protected static string $resource = ReserveditemResourceUser::class;
protected static ?string $title = 'Reserverade item';
protected function handleRecordCreation(array $data): Model
{
$data['user_id'] = auth()->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,
];
}
}

View file

@ -0,0 +1,37 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Models\Item;
use App\Models\User;
use Illuminate\Database\Eloquent\SoftDeletes;
class Reserveditem extends Model
{
public $timestamps = false;
use SoftDeletes;
protected $fillable = [
'username',
'reserved_date',
'delivered_date',
'return_date',
'returned_date',
'delivered',
'returned',
'user_id',
'item_id'
];
public function users()
{
return $this->belongsToMany(User::class, 'user_reserveditems')->withTimestamps();
}
public function item()
{
return $this->belongsTo(Item::class);
}
}

View file

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\Item;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('reserveditems', function (Blueprint $table) {
$table->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');
}
};

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\User;
use App\Models\Reserveditem;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('user_reserveditems', function (Blueprint $table) {
$table->bigIncrements('id');
$table->foreignIdFor(Reserveditem::class);
$table->foreignIdFor(User::class);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('user_reserveditems');
}
};