diff --git a/app/Concerns/ProfileValidationRules.php b/app/Concerns/ProfileValidationRules.php index 46e19ba..56a70e6 100644 --- a/app/Concerns/ProfileValidationRules.php +++ b/app/Concerns/ProfileValidationRules.php @@ -15,19 +15,32 @@ trait ProfileValidationRules protected function profileRules(?int $userId = null): array { return [ - 'name' => $this->nameRules(), + 'username' => $this->usernameRules($userId), 'email' => $this->emailRules($userId), + 'nik' => ['required', 'string', 'size:16'], + 'full_name' => ['required', 'string', 'max:100'], + 'phone_number' => ['required', 'string', 'max:20'], + 'address' => ['required', 'string'], + 'birth_place' => ['required', 'string', 'max:100'], + 'birth_date' => ['required', 'date'], ]; } /** - * Get the validation rules used to validate user names. + * Get the validation rules used to validate usernames. * * @return array|string> */ - protected function nameRules(): array + protected function usernameRules(?int $userId = null): array { - return ['required', 'string', 'max:255']; + return [ + 'required', + 'string', + 'max:20', + $userId === null + ? Rule::unique(User::class) + : Rule::unique(User::class)->ignore($userId), + ]; } /** diff --git a/app/Http/Controllers/Settings/ProfileController.php b/app/Http/Controllers/Settings/ProfileController.php index d19f963..ad80162 100644 --- a/app/Http/Controllers/Settings/ProfileController.php +++ b/app/Http/Controllers/Settings/ProfileController.php @@ -9,6 +9,7 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; use Inertia\Inertia; use Inertia\Response; @@ -30,17 +31,32 @@ public function edit(Request $request): Response */ public function update(ProfileUpdateRequest $request): RedirectResponse { - $request->user()->fill($request->validated()); + $user = $request->user(); + $validated = $request->validated(); - if ($request->user()->isDirty('email')) { - $request->user()->email_verified_at = null; - } + DB::transaction(function () use ($user, $validated) { + $user->fill([ + 'username' => $validated['username'], + 'email' => $validated['email'], + ]); - $request->user()->save(); + if ($user->isDirty('email')) { + $user->email_verified_at = null; + } - Inertia::flash('toast', ['type' => 'success', 'message' => __('Profile updated.')]); + $user->save(); - return to_route('profile.edit'); + $user->profile()->update([ + 'nik' => $validated['nik'], + 'full_name' => $validated['full_name'], + 'phone_number' => $validated['phone_number'], + 'address' => $validated['address'], + 'birth_place' => $validated['birth_place'], + 'birth_date' => $validated['birth_date'], + ]); + }); + + return redirect()->route('profile.edit')->with('success', __('Profile updated.')); } /** diff --git a/app/Models/UserProfile.php b/app/Models/UserProfile.php index 9814aec..03d1d8c 100644 --- a/app/Models/UserProfile.php +++ b/app/Models/UserProfile.php @@ -31,7 +31,7 @@ public function user(): BelongsTo public function getActivitylogOptions(): LogOptions { return LogOptions::defaults() - ->logOnly(['full_name', 'phone', 'address', 'base_salary']) + ->logOnly(['full_name', 'phone_number', 'address', 'base_salary']) ->logOnlyDirty() ->useLogName('Profil Pegawai'); } @@ -48,7 +48,7 @@ public function tapActivity(Activity $activity, string $eventName) if (isset($activity->properties['attributes'])) { $attributeMap = [ 'full_name' => 'Nama Lengkap', - 'phone' => 'No. Telepon', + 'phone_number' => 'No. Telepon', 'address' => 'Alamat', 'base_salary' => 'Gaji Pokok', ]; diff --git a/config/fortify.php b/config/fortify.php index 5f88464..c5b9362 100644 --- a/config/fortify.php +++ b/config/fortify.php @@ -149,7 +149,7 @@ Features::emailVerification(), Features::twoFactorAuthentication([ 'confirm' => true, - 'confirmPassword' => true, + 'confirmPassword' => false, // 'window' => 0 ]), ], diff --git a/lang/id.json b/lang/id.json index 72195d9..efae523 100644 --- a/lang/id.json +++ b/lang/id.json @@ -58,5 +58,7 @@ "Verify Email Address": "Verifikasi Alamat Surel", "Verify your email address": "Verifikasi alamat email Anda", "Whoops!": "Aduh!", - "You are receiving this email because we received a password reset request for your account.": "Anda menerima surel ini karena kami menerima permintaan pengaturan ulang kata sandi untuk akun anda." + "You are receiving this email because we received a password reset request for your account.": "Anda menerima surel ini karena kami menerima permintaan pengaturan ulang kata sandi untuk akun anda.", + "Profile updated.": "Profil berhasil diperbarui.", + "Password updated.": "Kata sandi berhasil diperbarui." } \ No newline at end of file diff --git a/resources/js/components/appearance-tabs.tsx b/resources/js/components/appearance-tabs.tsx index b013862..9b1bfcb 100644 --- a/resources/js/components/appearance-tabs.tsx +++ b/resources/js/components/appearance-tabs.tsx @@ -12,9 +12,9 @@ export default function AppearanceToggleTab({ const { appearance, updateAppearance } = useAppearance(); const tabs: { value: Appearance; icon: LucideIcon; label: string }[] = [ - { value: 'light', icon: Sun, label: 'Light' }, - { value: 'dark', icon: Moon, label: 'Dark' }, - { value: 'system', icon: Monitor, label: 'System' }, + { value: 'light', icon: Sun, label: 'Terang' }, + { value: 'dark', icon: Moon, label: 'Gelap' }, + { value: 'system', icon: Monitor, label: 'Sistem' }, ]; return ( diff --git a/resources/js/components/delete-user.tsx b/resources/js/components/delete-user.tsx index 213e76f..9b906ab 100644 --- a/resources/js/components/delete-user.tsx +++ b/resources/js/components/delete-user.tsx @@ -23,14 +23,14 @@ export default function DeleteUser() {
-

Warning

+

Peringatan

- Please proceed with caution, this cannot be undone. + Harap berhati-hati, tindakan ini tidak dapat dibatalkan.

@@ -40,18 +40,17 @@ export default function DeleteUser() { variant="destructive" data-test="delete-user-button" > - Delete account + Hapus Akun - Are you sure you want to delete your account? + Apakah Anda yakin ingin menghapus akun Anda? - Once your account is deleted, all of its resources - and data will also be permanently deleted. Please - enter your password to confirm you would like to - permanently delete your account. + Setelah akun Anda dihapus, semua sumber daya dan datanya + akan dihapus secara permanen. Silakan masukkan kata sandi Anda + untuk mengonfirmasi bahwa Anda ingin menghapus akun Anda secara permanen.
- Password + Kata Sandi @@ -92,7 +91,7 @@ export default function DeleteUser() { resetAndClearErrors() } > - Cancel + Batal @@ -105,7 +104,7 @@ export default function DeleteUser() { type="submit" data-test="confirm-delete-user-button" > - Delete account + Hapus Akun diff --git a/resources/js/components/user-menu-content.tsx b/resources/js/components/user-menu-content.tsx index adbda71..8334403 100644 --- a/resources/js/components/user-menu-content.tsx +++ b/resources/js/components/user-menu-content.tsx @@ -41,7 +41,7 @@ export function UserMenuContent({ user }: Props) { onClick={cleanup} > - Settings + Pengaturan @@ -55,7 +55,7 @@ export function UserMenuContent({ user }: Props) { data-test="logout-button" > - Log out + Keluar diff --git a/resources/js/layouts/settings/layout.tsx b/resources/js/layouts/settings/layout.tsx index efd7904..1ea75da 100644 --- a/resources/js/layouts/settings/layout.tsx +++ b/resources/js/layouts/settings/layout.tsx @@ -12,17 +12,17 @@ import type { NavItem } from '@/types'; const sidebarNavItems: NavItem[] = [ { - title: 'Profile', + title: 'Profil', href: edit(), icon: null, }, { - title: 'Security', + title: 'Keamanan', href: editSecurity(), icon: null, }, { - title: 'Appearance', + title: 'Tampilan', href: editAppearance(), icon: null, }, @@ -34,15 +34,14 @@ export default function SettingsLayout({ children }: PropsWithChildren) { return (
- -
+ + +