Add user account management features including Appearance, Password, and Profile controllers for handling user preferences. Implement corresponding requests for validation and create views for each setting. Update routes for new account functionality and enhance UI components for user navigation in the account layout.

This commit is contained in:
Yoga Pangestu 2026-06-11 18:01:12 +07:00
parent f6891dbe24
commit 9798150994
15 changed files with 43 additions and 43 deletions

View File

@ -1,9 +1,9 @@
<?php
namespace App\Http\Controllers\Admin\Setting;
namespace App\Http\Controllers\Admin\Account;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Setting\UpdateAppearanceRequest;
use App\Http\Requests\Admin\Account\UpdateAppearanceRequest;
use Illuminate\Http\RedirectResponse;
use Inertia\Inertia;
use Inertia\Response;
@ -13,7 +13,7 @@ class AppearanceController extends Controller
{
public function edit(): Response
{
return Inertia::render('admin/setting/Appearance', [
return Inertia::render('admin/account/Appearance', [
'appearance' => request()->cookie('appearance', 'system'),
]);
}
@ -25,7 +25,7 @@ public function update(UpdateAppearanceRequest $request): RedirectResponse
Inertia::flash('success', 'Tampilan berhasil diperbarui.');
return redirect()
->route('admin.setting.appearance')
->route('admin.account.appearance')
->withCookie(Cookie::create('appearance')
->withValue($appearance)
->withExpires(now()->addYear())

View File

@ -1,9 +1,9 @@
<?php
namespace App\Http\Controllers\Admin\Setting;
namespace App\Http\Controllers\Admin\Account;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Setting\UpdatePasswordRequest;
use App\Http\Requests\Admin\Account\UpdatePasswordRequest;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Hash;
use Inertia\Inertia;
@ -13,7 +13,7 @@ class PasswordController extends Controller
{
public function edit(): Response
{
return Inertia::render('admin/setting/Password');
return Inertia::render('admin/account/Password');
}
public function update(UpdatePasswordRequest $request): RedirectResponse
@ -24,6 +24,6 @@ public function update(UpdatePasswordRequest $request): RedirectResponse
Inertia::flash('success', 'Kata sandi berhasil diperbarui.');
return redirect()->route('admin.setting.password');
return redirect()->route('admin.account.password');
}
}

View File

@ -1,11 +1,11 @@
<?php
namespace App\Http\Controllers\Admin\Setting;
namespace App\Http\Controllers\Admin\Account;
use App\Enums\Gender;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Setting\UpdateProfileRequest;
use App\Services\Setting\ProfileService;
use App\Http\Requests\Admin\Account\UpdateProfileRequest;
use App\Services\Account\ProfileService;
use Illuminate\Http\RedirectResponse;
use Inertia\Inertia;
use Inertia\Response;
@ -20,7 +20,7 @@ public function edit(): Response
{
$user = auth()->user()->load('profile');
return Inertia::render('admin/setting/Profile', [
return Inertia::render('admin/account/Profile', [
'genders' => Gender::selectOptions(),
'user' => $user,
]);
@ -32,6 +32,6 @@ public function update(UpdateProfileRequest $request): RedirectResponse
Inertia::flash('success', 'Profil berhasil diperbarui.');
return redirect()->route('admin.setting.profile');
return redirect()->route('admin.account.profile');
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Requests\Admin\Setting;
namespace App\Http\Requests\Admin\Account;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Requests\Admin\Setting;
namespace App\Http\Requests\Admin\Account;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Password;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Requests\Admin\Setting;
namespace App\Http\Requests\Admin\Account;
use App\Enums\Gender;
use Illuminate\Foundation\Http\FormRequest;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Services\Setting;
namespace App\Services\Account;
use Illuminate\Support\Facades\DB;

View File

@ -49,7 +49,7 @@ function logout() {
</div>
</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem @click="router.visit('/admin/setting/profile')">
<DropdownMenuItem @click="router.visit('/admin/account/profile')">
<User />
Profil
</DropdownMenuItem>

View File

@ -1,4 +1,4 @@
import type { AppearanceMode } from '@/types/settings';
import type { AppearanceMode } from '@/types/account';
export function applyAppearance(mode: AppearanceMode): void {
const root = document.documentElement;

View File

@ -11,17 +11,17 @@ const currentPath = computed(() => page.url.split('?')[0]);
const navItems = [
{
href: '/admin/setting/profile',
href: '/admin/account/profile',
label: 'Profil',
icon: User,
},
{
href: '/admin/setting/password',
href: '/admin/account/password',
label: 'Kata Sandi',
icon: KeyRound,
},
{
href: '/admin/setting/appearance',
href: '/admin/account/appearance',
label: 'Tampilan',
icon: Palette,
},
@ -29,11 +29,11 @@ const navItems = [
</script>
<template>
<AdminLayout title="Pengaturan">
<AdminLayout title="Akun">
<div class="space-y-6">
<div class="space-y-1">
<h2 class="text-2xl font-bold tracking-tight">
Pengaturan
Akun
</h2>
</div>

View File

@ -14,9 +14,9 @@ import {
import { Label } from '@/components/ui/label';
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
import { applyAppearance } from '@/composables/useAppearance';
import SettingsLayout from '@/layouts/SettingsLayout.vue';
import AccountLayout from '@/layouts/AccountLayout.vue';
import { cn } from '@/lib/utils';
import type { AppearanceFormData, AppearanceMode } from '@/types/settings';
import type { AppearanceFormData, AppearanceMode } from '@/types/account';
const props = defineProps<{
appearance: AppearanceMode;
@ -58,7 +58,7 @@ function onAppearanceChange(value: string) {
}
function submit() {
form.put('/admin/setting/appearance', {
form.put('/admin/account/appearance', {
onError: () => {
toast.error('Gagal menyimpan tampilan.');
},
@ -70,7 +70,7 @@ function submit() {
<Head title="Tampilan" />
<SettingsLayout>
<AccountLayout>
<form @submit.prevent="submit">
<Card>
<CardContent>
@ -117,5 +117,5 @@ function submit() {
</CardContent>
</Card>
</form>
</SettingsLayout>
</AccountLayout>
</template>

View File

@ -12,8 +12,8 @@ import {
FieldSet,
} from '@/components/ui/field';
import { Input } from '@/components/ui/input';
import SettingsLayout from '@/layouts/SettingsLayout.vue';
import type { PasswordFormData } from '@/types/settings';
import AccountLayout from '@/layouts/AccountLayout.vue';
import type { PasswordFormData } from '@/types/account';
const form = useForm<PasswordFormData>({
current_password: '',
@ -22,7 +22,7 @@ const form = useForm<PasswordFormData>({
});
function submit() {
form.put('/admin/setting/password', {
form.put('/admin/account/password', {
onSuccess: () => {
form.reset();
},
@ -37,7 +37,7 @@ function submit() {
<Head title="Kata Sandi" />
<SettingsLayout>
<AccountLayout>
<form @submit.prevent="submit">
<div class="grid gap-6">
<Card>
@ -85,5 +85,5 @@ function submit() {
</div>
</div>
</form>
</SettingsLayout>
</AccountLayout>
</template>

View File

@ -16,8 +16,8 @@ import { Input } from '@/components/ui/input';
import { PhoneNumberInput } from '@/components/ui/phone-number-input';
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
import { Textarea } from '@/components/ui/textarea';
import SettingsLayout from '@/layouts/SettingsLayout.vue';
import type { EnumOption, ProfileFormData, ProfileUser } from '@/types/settings';
import AccountLayout from '@/layouts/AccountLayout.vue';
import type { EnumOption, ProfileFormData, ProfileUser } from '@/types/account';
const props = defineProps<{
user: ProfileUser;
@ -35,7 +35,7 @@ const form = useForm<ProfileFormData>({
});
function submit() {
form.put('/admin/setting/profile', {
form.put('/admin/account/profile', {
onError: () => {
toast.error('Gagal menyimpan profil. Periksa kembali formulir.');
},
@ -47,7 +47,7 @@ function submit() {
<Head title="Profil" />
<SettingsLayout>
<AccountLayout>
<form @submit.prevent="submit">
<div class="grid gap-6">
<Card>
@ -133,5 +133,5 @@ function submit() {
</div>
</div>
</form>
</SettingsLayout>
</AccountLayout>
</template>

View File

@ -1,6 +1,9 @@
<?php
use App\Enums\Permission;
use App\Http\Controllers\Admin\Account\AppearanceController;
use App\Http\Controllers\Admin\Account\PasswordController;
use App\Http\Controllers\Admin\Account\ProfileController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\Finance\CashController;
use App\Http\Controllers\Admin\Finance\EmployeeAdvanceController;
@ -15,9 +18,6 @@
use App\Http\Controllers\Admin\Master\ProductController;
use App\Http\Controllers\Admin\Master\RawMaterialController;
use App\Http\Controllers\Admin\Master\SupplierController;
use App\Http\Controllers\Admin\Setting\AppearanceController;
use App\Http\Controllers\Admin\Setting\PasswordController;
use App\Http\Controllers\Admin\Setting\ProfileController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\LogoutController;
use Illuminate\Support\Facades\Route;
@ -153,7 +153,7 @@
});
Route::prefix('setting')->name('setting.')->group(function () {
Route::prefix('account')->name('account.')->group(function () {
Route::get('profile', [ProfileController::class, 'edit'])->name('profile');
Route::put('profile', [ProfileController::class, 'update'])->name('profile.update');