diff --git a/app/Filament/Resources/UserResource.php b/app/Filament/Resources/UserResource.php new file mode 100644 index 0000000..1dafa19 --- /dev/null +++ b/app/Filament/Resources/UserResource.php @@ -0,0 +1,71 @@ +components([ + Toggle::make('is_admin') + ->label('Admin') + ->helperText('Grants access to this admin panel.'), + TextInput::make('postcode') + ->label('Postcode') + ->maxLength(8), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('name')->searchable()->sortable(), + TextColumn::make('email')->searchable()->sortable(), + TextColumn::make('postcode')->placeholder('—'), + IconColumn::make('is_admin') + ->label('Admin') + ->boolean(), + TextColumn::make('created_at') + ->dateTime('d M Y') + ->sortable(), + ]) + ->defaultSort('created_at', 'desc') + ->filters([ + TernaryFilter::make('is_admin') + ->label('Admins only'), + ]) + ->recordActions([ + EditAction::make(), + DeleteAction::make(), + ]); + } + + public static function getPages(): array + { + return [ + 'index' => ListUsers::route('/'), + 'edit' => EditUser::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/UserResource/Pages/EditUser.php b/app/Filament/Resources/UserResource/Pages/EditUser.php new file mode 100644 index 0000000..5b1aa09 --- /dev/null +++ b/app/Filament/Resources/UserResource/Pages/EditUser.php @@ -0,0 +1,16 @@ +string('postcode', 8)->nullable()->after('is_admin'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('postcode'); + }); + } +}; diff --git a/tests/Feature/Admin/UserResourceTest.php b/tests/Feature/Admin/UserResourceTest.php new file mode 100644 index 0000000..b115246 --- /dev/null +++ b/tests/Feature/Admin/UserResourceTest.php @@ -0,0 +1,44 @@ +admin = User::factory()->admin()->create(); + $this->actingAs($this->admin); +}); + +it('renders the user list', function () { + $users = User::factory()->count(3)->create(); + + Livewire::test(ListUsers::class) + ->assertOk() + ->assertCanSeeTableRecords($users); +}); + +it('can toggle is_admin on edit', function () { + $user = User::factory()->create(['is_admin' => false]); + + Livewire::test(EditUser::class, ['record' => $user->id]) + ->fillForm(['is_admin' => true]) + ->call('save') + ->assertHasNoFormErrors(); + + expect($user->fresh()->is_admin)->toBeTrue(); +}); + +it('can delete a user', function () { + $user = User::factory()->create(); + + Livewire::test(ListUsers::class) + ->callTableAction(DeleteAction::class, $user) + ->assertHasNoTableActionErrors(); + + $this->assertDatabaseMissing('users', ['id' => $user->id]); +});