From 739f7e761e14e7b601b9d9d64e1964d86f7228f6 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 2 Oct 2025 18:41:50 +0700 Subject: [PATCH] feat(setting): membuat pengaturan untuk mengatur akun, profil dan mengubah kata sandi --- app/Livewire/Forms/AccountForm.php | 58 ++++++++++++ app/Livewire/Forms/PasswordForm.php | 54 +++++++++++ app/Livewire/Forms/ProfileForm.php | 81 +++++++++++++++++ app/Livewire/Studio/Setting/Account.php | 42 +++++++++ app/Livewire/Studio/Setting/Password.php | 62 +++++++++++++ app/Livewire/Studio/Setting/Profile.php | 42 +++++++++ app/Models/Employee.php | 3 - .../partials/studio/_header.blade.php | 9 +- .../views/components/setting-tabs.blade.php | 24 +++++ .../livewire/studio/setting/account.blade.php | 38 ++++++++ .../studio/setting/password.blade.php | 40 +++++++++ .../livewire/studio/setting/profile.blade.php | 89 +++++++++++++++++++ routes/pages/studio.php | 13 ++- 13 files changed, 548 insertions(+), 7 deletions(-) create mode 100644 app/Livewire/Forms/AccountForm.php create mode 100644 app/Livewire/Forms/PasswordForm.php create mode 100644 app/Livewire/Forms/ProfileForm.php create mode 100644 app/Livewire/Studio/Setting/Account.php create mode 100644 app/Livewire/Studio/Setting/Password.php create mode 100644 app/Livewire/Studio/Setting/Profile.php create mode 100644 resources/views/components/setting-tabs.blade.php create mode 100644 resources/views/livewire/studio/setting/account.blade.php create mode 100644 resources/views/livewire/studio/setting/password.blade.php create mode 100644 resources/views/livewire/studio/setting/profile.blade.php diff --git a/app/Livewire/Forms/AccountForm.php b/app/Livewire/Forms/AccountForm.php new file mode 100644 index 0000000..667a40e --- /dev/null +++ b/app/Livewire/Forms/AccountForm.php @@ -0,0 +1,58 @@ + ['required', 'alpha_num', 'min:5', 'max:20', Rule::unique('users', 'username')->ignore($this->user)], + 'email' => ['required', 'email', 'max:100', Rule::unique('users', 'email')->ignore($this->user)], + ]; + } + + public function validationAttributes(): array + { + return [ + 'username' => 'nama pengguna', + ]; + } + + public function setAccount(User $user) + { + $this->user = $user; + + $this->username = $user->username; + $this->email = $user->email; + $this->status = $user->status->label(); + $this->email_verified_at = $user->email_verified_at ? formatDateTime($user->email_verified_at) : '-'; + } + + public function update() + { + $this->validate(); + + $this->user->update([ + 'username' => $this->username, + 'email' => $this->email, + ]); + } +} diff --git a/app/Livewire/Forms/PasswordForm.php b/app/Livewire/Forms/PasswordForm.php new file mode 100644 index 0000000..fbf00aa --- /dev/null +++ b/app/Livewire/Forms/PasswordForm.php @@ -0,0 +1,54 @@ + ['required', 'string'], + 'new_password' => ['required', 'string', Password::min(8)->letters()->mixedCase()->numbers()->symbols()->uncompromised()], + 'new_confirm_password' => ['required', 'string', 'same:new_password'], + ]; + } + + public function validationAttributes(): array + { + return [ + 'current_password' => 'kata sandi saat ini', + 'new_password' => 'kata sandi baru', + 'new_confirm_password' => 'konfirmasi kata sandi baru', + ]; + } + + public function setUser(User $user) + { + $this->user = $user; + } + + public function update() + { + $this->validate(); + + $this->user->update([ + 'password' => Hash::make($this->new_password), + ]); + } +} diff --git a/app/Livewire/Forms/ProfileForm.php b/app/Livewire/Forms/ProfileForm.php new file mode 100644 index 0000000..db01e85 --- /dev/null +++ b/app/Livewire/Forms/ProfileForm.php @@ -0,0 +1,81 @@ + ['required', 'string', 'max:100'], + 'phone_number' => ['required', 'string', new PhoneNumber], + 'birthdate' => ['required', 'date', 'before:'.Carbon::now()->subYears(18)->format('Y-m-d')], + 'address' => ['required', 'string'], + 'gender' => ['required', Rule::in(Gender::cases())], + ]; + } + + public function validationAttributes(): array + { + return [ + 'full_name' => 'nama lengkap', + 'phone_number' => 'nomor telepon', + 'base_salary' => 'gaji pokok', + 'birthdate' => 'tanggal lahir', + 'address' => 'alamat', + 'gender' => 'jenis kelamin', + ]; + } + + public function setProfile(Employee $employee) + { + $this->employee = $employee; + + $this->full_name = $employee->full_name; + $this->phone_number = $employee->phone_number; + $this->base_salary = $employee->base_salary; + $this->birthdate = $employee->birthdate; + $this->hire_date = formatDate($employee->hire_date); + $this->address = $employee->address; + $this->gender = $employee->gender->value; + $this->status = $employee->status->label(); + } + + public function update() + { + $this->validate(); + + $this->employee->update([ + 'full_name' => $this->full_name, + 'phone_number' => $this->phone_number, + 'birthdate' => $this->birthdate, + 'address' => $this->address, + 'gender' => $this->gender, + ]); + } +} diff --git a/app/Livewire/Studio/Setting/Account.php b/app/Livewire/Studio/Setting/Account.php new file mode 100644 index 0000000..5347614 --- /dev/null +++ b/app/Livewire/Studio/Setting/Account.php @@ -0,0 +1,42 @@ +form->setAccount($user); + } + + public function update() + { + $this->form->update(); + + Flux::toast( + heading: 'Berhasil', + text: 'Akun berhasil diperbarui.', + variant: 'success', + duration: 3000 + ); + } + + public function render() + { + return view('livewire.studio.setting.account', [ + 'pageTitle' => 'Akun', + ]); + } +} diff --git a/app/Livewire/Studio/Setting/Password.php b/app/Livewire/Studio/Setting/Password.php new file mode 100644 index 0000000..03fa708 --- /dev/null +++ b/app/Livewire/Studio/Setting/Password.php @@ -0,0 +1,62 @@ +form->setUser($user); + } + + public function update() + { + if (! Hash::check($this->form->current_password, $this->form->user->password)) { + Flux::toast( + heading: 'Gagal', + text: 'Kata sandi yang Anda masukkan tidak sesuai dengan kata sandi saat ini.', + variant: 'danger', + duration: 3000 + ); + + return; + } + + auth()->logoutOtherDevices($this->form->current_password); + + $this->form->update(); + + auth()->logout(); + session()->invalidate(); + session()->regenerateToken(); + + Flux::toast( + heading: 'Berhasil', + text: 'Kata sandi berhasil diperbarui.', + variant: 'success', + duration: 3000 + ); + + $this->redirectRoute('login', navigate: true); + } + + public function render() + { + return view('livewire.studio.setting.password', [ + 'pageTitle' => 'Kata Sandi', + ]); + } +} diff --git a/app/Livewire/Studio/Setting/Profile.php b/app/Livewire/Studio/Setting/Profile.php new file mode 100644 index 0000000..7e1d3ae --- /dev/null +++ b/app/Livewire/Studio/Setting/Profile.php @@ -0,0 +1,42 @@ +form->setProfile($employee); + } + + public function update() + { + $this->form->update(); + + Flux::toast( + heading: 'Berhasil', + text: 'Profil berhasil diperbarui.', + variant: 'success', + duration: 3000 + ); + } + + public function render() + { + return view('livewire.studio.setting.profile', [ + 'pageTitle' => 'Profil', + ]); + } +} diff --git a/app/Models/Employee.php b/app/Models/Employee.php index 871634d..f000280 100644 --- a/app/Models/Employee.php +++ b/app/Models/Employee.php @@ -19,9 +19,6 @@ protected function casts(): array { return [ 'gender' => Gender::class, - 'birthdate' => 'date', - 'hire_date' => 'date', - 'resign_date' => 'date', 'status' => EmploymentStatus::class, ]; } diff --git a/resources/views/components/partials/studio/_header.blade.php b/resources/views/components/partials/studio/_header.blade.php index 78f8b22..81b0afb 100644 --- a/resources/views/components/partials/studio/_header.blade.php +++ b/resources/views/components/partials/studio/_header.blade.php @@ -21,10 +21,13 @@ class="max-lg:hidden! hidden dark:flex" /> - + - Pengaturan - Tema + + Pengaturan + Statistik @livewire('auth.logout') diff --git a/resources/views/components/setting-tabs.blade.php b/resources/views/components/setting-tabs.blade.php new file mode 100644 index 0000000..e50e673 --- /dev/null +++ b/resources/views/components/setting-tabs.blade.php @@ -0,0 +1,24 @@ +
+ + + Akun + + + + Profil + + + + Kata + Sandi + + +
+ + + * Geser ke kanan untuk melihat selengkapnya. + diff --git a/resources/views/livewire/studio/setting/account.blade.php b/resources/views/livewire/studio/setting/account.blade.php new file mode 100644 index 0000000..ce441d8 --- /dev/null +++ b/resources/views/livewire/studio/setting/account.blade.php @@ -0,0 +1,38 @@ + + @include('components.setting-tabs') + +
+
+
+ +
+ + Nama Pengguna * + + + + + + Email * + + + + + + + + +
+
+
+
+
+ +
+ + Simpan + +
+
diff --git a/resources/views/livewire/studio/setting/password.blade.php b/resources/views/livewire/studio/setting/password.blade.php new file mode 100644 index 0000000..36582ba --- /dev/null +++ b/resources/views/livewire/studio/setting/password.blade.php @@ -0,0 +1,40 @@ + + @include('components.setting-tabs') + +
+
+
+ +
+ + Kata Sandi Saat Ini * + + + + + + Kata Sandi Baru * + + + + + + Konfirmasi Kata Sandi * + + + +
+
+
+
+
+ +
+ + Simpan + +
+
diff --git a/resources/views/livewire/studio/setting/profile.blade.php b/resources/views/livewire/studio/setting/profile.blade.php new file mode 100644 index 0000000..ba822e3 --- /dev/null +++ b/resources/views/livewire/studio/setting/profile.blade.php @@ -0,0 +1,89 @@ + + @include('components.setting-tabs') + +
+
+
+
+
+ +
+
+ + Nama Lengkap * + + + + +
+ + + Nomor Telepon * + + + + + + Gaji Pokok + + Rp + + + + + + + Tanggal Lahir * + + + + + + +
+ + Alamat * + + + +
+
+
+
+
+
+ +
+ + + Jenis Kelamin * + + @foreach (\App\Enums\Gender::cases() as $gender) + + {{ $gender->label() }} + + @endforeach + + + + + + + + +
+
+
+ +
+ + Simpan + +
+
diff --git a/routes/pages/studio.php b/routes/pages/studio.php index be48dc0..2dacd2a 100644 --- a/routes/pages/studio.php +++ b/routes/pages/studio.php @@ -23,15 +23,26 @@ use App\Livewire\Studio\Master\User\Create as UserCreate; use App\Livewire\Studio\Master\User\Edit as UserEdit; use App\Livewire\Studio\Master\User\Index as UserIndex; +use App\Livewire\Studio\Setting\Account as AccountComponent; +use App\Livewire\Studio\Setting\Password as PasswordComponent; +use App\Livewire\Studio\Setting\Profile as ProfileComponent; use Illuminate\Support\Facades\Route; Route::middleware('auth') ->prefix('studio') ->group(function () { + Route::prefix('setting') + ->name('studio.setting.') + ->group(function () { + Route::get('/account/{user}', AccountComponent::class)->name('account'); + Route::get('/profile/{employee}', ProfileComponent::class)->name('profile'); + Route::get('/password/{user}', PasswordComponent::class)->name('password'); + }); + Route::prefix('dashboard') ->name('studio.dashboard.') ->group(function () { - Route::get('overview', OverviewComponent::class)->name('overview'); + Route::get('/overview', OverviewComponent::class)->name('overview'); }); Route::prefix('master')