Users custome login redirect

This commit is contained in:
Simon Pocrnjič 2026-04-21 20:24:58 +02:00
parent 054202dc32
commit fd81e8ce2d
7 changed files with 96 additions and 3 deletions

View File

@ -20,7 +20,7 @@ public function index(Request $request): Response
{ {
Gate::authorize('manage-settings'); Gate::authorize('manage-settings');
$users = User::with('roles:id,slug,name')->orderBy('name')->get(['id', 'name', 'email', 'active']); $users = User::with('roles:id,slug,name')->orderBy('name')->get(['id', 'name', 'email', 'active', 'login_redirect']);
$roles = Role::with('permissions:id,slug,name')->orderBy('name')->get(['id', 'name', 'slug']); $roles = Role::with('permissions:id,slug,name')->orderBy('name')->get(['id', 'name', 'slug']);
$permissions = Permission::orderBy('slug')->get(['id', 'name', 'slug']); $permissions = Permission::orderBy('slug')->get(['id', 'name', 'slug']);
@ -73,4 +73,17 @@ public function toggleActive(User $user): RedirectResponse
return back()->with('success', "Uporabnik {$status}"); return back()->with('success', "Uporabnik {$status}");
} }
public function updateSettings(Request $request, User $user): RedirectResponse
{
Gate::authorize('manage-settings');
$validated = $request->validate([
'login_redirect' => ['nullable', 'string', 'max:255'],
]);
$user->update($validated);
return back()->with('success', 'Nastavitve shranjene');
}
} }

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Responses;
use Illuminate\Http\RedirectResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class LoginResponse implements LoginResponseContract
{
public function toResponse($request): RedirectResponse
{
$user = $request->user();
$default = $user?->login_redirect ?: config('fortify.home');
return redirect()->intended($default);
}
}

View File

@ -31,6 +31,7 @@ class User extends Authenticatable
'email', 'email',
'password', 'password',
'active', 'active',
'login_redirect',
]; ];
/** /**

View File

@ -6,6 +6,7 @@
use App\Actions\Fortify\ResetUserPassword; use App\Actions\Fortify\ResetUserPassword;
use App\Actions\Fortify\UpdateUserPassword; use App\Actions\Fortify\UpdateUserPassword;
use App\Actions\Fortify\UpdateUserProfileInformation; use App\Actions\Fortify\UpdateUserProfileInformation;
use App\Http\Responses\LoginResponse;
use App\Models\User; use App\Models\User;
use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -14,6 +15,7 @@
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
use Laravel\Fortify\Fortify; use Laravel\Fortify\Fortify;
class FortifyServiceProvider extends ServiceProvider class FortifyServiceProvider extends ServiceProvider
@ -23,7 +25,7 @@ class FortifyServiceProvider extends ServiceProvider
*/ */
public function register(): void public function register(): void
{ {
// $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
} }
/** /**

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('login_redirect')->nullable()->after('active');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('login_redirect');
});
}
};

View File

@ -2,7 +2,7 @@
import AdminLayout from "@/Layouts/AdminLayout.vue"; import AdminLayout from "@/Layouts/AdminLayout.vue";
import { useForm, Link, router } from "@inertiajs/vue3"; import { useForm, Link, router } from "@inertiajs/vue3";
import { ref, computed } from "vue"; import { ref, computed } from "vue";
import { SearchIcon, SaveIcon, UserPlusIcon } from "lucide-vue-next"; import { SearchIcon, SaveIcon, UserPlusIcon, Link2Icon } from "lucide-vue-next";
import { import {
Card, Card,
CardContent, CardContent,
@ -48,6 +48,13 @@ const forms = Object.fromEntries(
]) ])
); );
const settingsForms = Object.fromEntries(
props.users.map((u) => [
u.id,
useForm({ login_redirect: u.login_redirect ?? "" }),
])
);
function toggle(userId, roleId) { function toggle(userId, roleId) {
const form = forms[userId]; const form = forms[userId];
const exists = form.roles.includes(roleId); const exists = form.roles.includes(roleId);
@ -140,6 +147,12 @@ function toggleUserActive(userId) {
} }
); );
} }
function submitSettings(userId) {
settingsForms[userId].patch(route("admin.users.settings", { user: userId }), {
preserveScroll: true,
});
}
</script> </script>
<template> <template>
@ -254,6 +267,24 @@ function toggleUserActive(userId) {
<div class="text-xs text-muted-foreground font-mono"> <div class="text-xs text-muted-foreground font-mono">
{{ user.email }} {{ user.email }}
</div> </div>
<div class="flex items-center gap-1 mt-1.5">
<Link2Icon class="h-3 w-3 text-muted-foreground shrink-0" />
<Input
v-model="settingsForms[user.id].login_redirect"
type="text"
placeholder="/dashboard"
class="h-6 text-xs px-1.5 w-36"
/>
<Button
@click="submitSettings(user.id)"
:disabled="settingsForms[user.id].processing"
size="sm"
variant="ghost"
class="h-6 px-2 text-xs"
>
<SaveIcon class="h-3 w-3" />
</Button>
</div>
</div> </div>
</div> </div>
</TableCell> </TableCell>

View File

@ -86,6 +86,7 @@
Route::post('users', [\App\Http\Controllers\Admin\UserRoleController::class, 'store'])->name('users.store'); Route::post('users', [\App\Http\Controllers\Admin\UserRoleController::class, 'store'])->name('users.store');
Route::put('users/{user}', [\App\Http\Controllers\Admin\UserRoleController::class, 'update'])->name('users.update'); Route::put('users/{user}', [\App\Http\Controllers\Admin\UserRoleController::class, 'update'])->name('users.update');
Route::patch('users/{user}/toggle-active', [\App\Http\Controllers\Admin\UserRoleController::class, 'toggleActive'])->name('users.toggle-active'); Route::patch('users/{user}/toggle-active', [\App\Http\Controllers\Admin\UserRoleController::class, 'toggleActive'])->name('users.toggle-active');
Route::patch('users/{user}/settings', [\App\Http\Controllers\Admin\UserRoleController::class, 'updateSettings'])->name('users.settings');
// Permissions management // Permissions management
Route::get('permissions', [\App\Http\Controllers\Admin\PermissionController::class, 'index'])->name('permissions.index'); Route::get('permissions', [\App\Http\Controllers\Admin\PermissionController::class, 'index'])->name('permissions.index');