From da30f12fc2792d689fdf223272bc8a00e69c3af0 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 29 Jul 2026 22:33:55 +0700 Subject: [PATCH] feat: add employee management features including create, edit, and list functionalities - Implemented employee columns for data table with sorting and action buttons. - Created employee creation form with validation and default password information. - Developed employee editing form pre-filled with existing data. - Added employee listing page with delete and reset password functionalities. - Introduced leave request management with columns for status and actions. - Created leave request form for adding and editing requests with date pickers. - Implemented confirmation dialogs for delete, approve, and reject actions. --- .../Admin/{SDM => HR}/EmployeeController.php | 22 +++++++++---------- .../{SDM => HR}/LeaveRequestController.php | 18 +++++++-------- .../Admin/{SDM => HR}/EmployeeRequest.php | 2 +- .../Admin/{SDM => HR}/LeaveRequestRequest.php | 2 +- .../Admin/{SDM => HR}/EmployeeService.php | 2 +- .../Admin/{SDM => HR}/LeaveRequestService.php | 2 +- resources/js/components/app-sidebar.tsx | 8 +++---- .../admin/{sdm => hr}/employee/columns.tsx | 0 .../admin/{sdm => hr}/employee/create.tsx | 4 ++-- .../pages/admin/{sdm => hr}/employee/edit.tsx | 4 ++-- .../admin/{sdm => hr}/employee/index.tsx | 4 ++-- .../{sdm => hr}/leave-request/columns.tsx | 0 .../admin/{sdm => hr}/leave-request/index.tsx | 4 ++-- routes/web.php | 6 ++--- 14 files changed, 39 insertions(+), 39 deletions(-) rename app/Http/Controllers/Admin/{SDM => HR}/EmployeeController.php (86%) rename app/Http/Controllers/Admin/{SDM => HR}/LeaveRequestController.php (85%) rename app/Http/Requests/Admin/{SDM => HR}/EmployeeRequest.php (97%) rename app/Http/Requests/Admin/{SDM => HR}/LeaveRequestRequest.php (93%) rename app/Services/Admin/{SDM => HR}/EmployeeService.php (98%) rename app/Services/Admin/{SDM => HR}/LeaveRequestService.php (98%) rename resources/js/pages/admin/{sdm => hr}/employee/columns.tsx (100%) rename resources/js/pages/admin/{sdm => hr}/employee/create.tsx (99%) rename resources/js/pages/admin/{sdm => hr}/employee/edit.tsx (99%) rename resources/js/pages/admin/{sdm => hr}/employee/index.tsx (98%) rename resources/js/pages/admin/{sdm => hr}/leave-request/columns.tsx (100%) rename resources/js/pages/admin/{sdm => hr}/leave-request/index.tsx (99%) diff --git a/app/Http/Controllers/Admin/SDM/EmployeeController.php b/app/Http/Controllers/Admin/HR/EmployeeController.php similarity index 86% rename from app/Http/Controllers/Admin/SDM/EmployeeController.php rename to app/Http/Controllers/Admin/HR/EmployeeController.php index e3ce296..a1cb575 100644 --- a/app/Http/Controllers/Admin/SDM/EmployeeController.php +++ b/app/Http/Controllers/Admin/HR/EmployeeController.php @@ -1,11 +1,11 @@ $this->service->getAll(), ]); } public function create(): Response { - return Inertia::render('admin/sdm/employee/create'); + return Inertia::render('admin/hr/employee/create'); } public function store(EmployeeRequest $request): RedirectResponse @@ -42,12 +42,12 @@ public function store(EmployeeRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.employees.index'); + return to_route('admin.hr.employees.index'); } public function edit(User $employee): Response { - return Inertia::render('admin/sdm/employee/edit', [ + return Inertia::render('admin/hr/employee/edit', [ 'employee' => $this->service->getById($employee->id), ]); } @@ -65,7 +65,7 @@ public function update(EmployeeRequest $request, User $employee): RedirectRespon Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.employees.index'); + return to_route('admin.hr.employees.index'); } public function destroy(User $employee): RedirectResponse @@ -81,7 +81,7 @@ public function destroy(User $employee): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.employees.index'); + return to_route('admin.hr.employees.index'); } public function toggleActive(User $employee): RedirectResponse @@ -98,7 +98,7 @@ public function toggleActive(User $employee): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.employees.index'); + return to_route('admin.hr.employees.index'); } public function resetPassword(User $employee): RedirectResponse @@ -114,6 +114,6 @@ public function resetPassword(User $employee): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.employees.index'); + return to_route('admin.hr.employees.index'); } } diff --git a/app/Http/Controllers/Admin/SDM/LeaveRequestController.php b/app/Http/Controllers/Admin/HR/LeaveRequestController.php similarity index 85% rename from app/Http/Controllers/Admin/SDM/LeaveRequestController.php rename to app/Http/Controllers/Admin/HR/LeaveRequestController.php index 6a79839..aaac8fd 100644 --- a/app/Http/Controllers/Admin/SDM/LeaveRequestController.php +++ b/app/Http/Controllers/Admin/HR/LeaveRequestController.php @@ -1,11 +1,11 @@ $this->service->getAll(), ]); } @@ -37,7 +37,7 @@ public function store(LeaveRequestRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.leave-requests.index'); + return to_route('admin.hr.leave-requests.index'); } public function update(LeaveRequestRequest $request, LeaveRequest $leaveRequest): RedirectResponse @@ -53,7 +53,7 @@ public function update(LeaveRequestRequest $request, LeaveRequest $leaveRequest) Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.leave-requests.index'); + return to_route('admin.hr.leave-requests.index'); } public function destroy(LeaveRequest $leaveRequest): RedirectResponse @@ -66,7 +66,7 @@ public function destroy(LeaveRequest $leaveRequest): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.leave-requests.index'); + return to_route('admin.hr.leave-requests.index'); } public function approve(LeaveRequest $leaveRequest): RedirectResponse @@ -79,7 +79,7 @@ public function approve(LeaveRequest $leaveRequest): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.leave-requests.index'); + return to_route('admin.hr.leave-requests.index'); } public function reject(LeaveRequest $leaveRequest): RedirectResponse @@ -92,6 +92,6 @@ public function reject(LeaveRequest $leaveRequest): RedirectResponse Inertia::flash('toast', ['type' => 'error', 'message' => $e->getMessage()]); } - return to_route('admin.sdm.leave-requests.index'); + return to_route('admin.hr.leave-requests.index'); } } diff --git a/app/Http/Requests/Admin/SDM/EmployeeRequest.php b/app/Http/Requests/Admin/HR/EmployeeRequest.php similarity index 97% rename from app/Http/Requests/Admin/SDM/EmployeeRequest.php rename to app/Http/Requests/Admin/HR/EmployeeRequest.php index e70e150..3bdb209 100644 --- a/app/Http/Requests/Admin/SDM/EmployeeRequest.php +++ b/app/Http/Requests/Admin/HR/EmployeeRequest.php @@ -1,6 +1,6 @@ - + diff --git a/resources/js/pages/admin/sdm/employee/columns.tsx b/resources/js/pages/admin/hr/employee/columns.tsx similarity index 100% rename from resources/js/pages/admin/sdm/employee/columns.tsx rename to resources/js/pages/admin/hr/employee/columns.tsx diff --git a/resources/js/pages/admin/sdm/employee/create.tsx b/resources/js/pages/admin/hr/employee/create.tsx similarity index 99% rename from resources/js/pages/admin/sdm/employee/create.tsx rename to resources/js/pages/admin/hr/employee/create.tsx index 1fe54bf..dea2471 100644 --- a/resources/js/pages/admin/sdm/employee/create.tsx +++ b/resources/js/pages/admin/hr/employee/create.tsx @@ -15,7 +15,7 @@ import { SelectValue, } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; -import { index as employeeIndex, store } from '@/routes/admin/sdm/employees'; +import { index as employeeIndex, store } from '@/routes/admin/hr/employees'; import { Form, Head } from '@inertiajs/react'; import { AlertCircle, ArrowLeft } from 'lucide-react'; import { useState } from 'react'; @@ -222,7 +222,7 @@ export default function EmployeeCreate() { EmployeeCreate.layout = { breadcrumbs: [ { - title: 'SDM', + title: 'HR', href: employeeIndex.url(), }, { diff --git a/resources/js/pages/admin/sdm/employee/edit.tsx b/resources/js/pages/admin/hr/employee/edit.tsx similarity index 99% rename from resources/js/pages/admin/sdm/employee/edit.tsx rename to resources/js/pages/admin/hr/employee/edit.tsx index 96289ca..5a22e14 100644 --- a/resources/js/pages/admin/sdm/employee/edit.tsx +++ b/resources/js/pages/admin/hr/employee/edit.tsx @@ -14,7 +14,7 @@ import { SelectValue, } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; -import { index as employeeIndex, update } from '@/routes/admin/sdm/employees'; +import { index as employeeIndex, update } from '@/routes/admin/hr/employees'; import { Form, Head } from '@inertiajs/react'; import { ArrowLeft } from 'lucide-react'; import { useState } from 'react'; @@ -249,7 +249,7 @@ export default function EmployeeEdit({ employee }: Props) { EmployeeEdit.layout = { breadcrumbs: [ { - title: 'SDM', + title: 'HR', href: employeeIndex.url(), }, { diff --git a/resources/js/pages/admin/sdm/employee/index.tsx b/resources/js/pages/admin/hr/employee/index.tsx similarity index 98% rename from resources/js/pages/admin/sdm/employee/index.tsx rename to resources/js/pages/admin/hr/employee/index.tsx index 73cff90..812ef8a 100644 --- a/resources/js/pages/admin/sdm/employee/index.tsx +++ b/resources/js/pages/admin/hr/employee/index.tsx @@ -1,7 +1,7 @@ import { ConfirmDialog } from '@/components/confirm-dialog'; import { DataTable } from '@/components/data-table'; import { Button } from '@/components/ui/button'; -import { destroy, create as employeeCreate, edit as employeeEdit, index as employeeIndex, toggleActive, resetPassword as resetPasswordRoute } from '@/routes/admin/sdm/employees'; +import { destroy, create as employeeCreate, edit as employeeEdit, index as employeeIndex, toggleActive, resetPassword as resetPasswordRoute } from '@/routes/admin/hr/employees'; import { Head, router } from '@inertiajs/react'; import { Plus } from 'lucide-react'; import { useState } from 'react'; @@ -106,7 +106,7 @@ export default function EmployeeIndex({ employees }: Props) { EmployeeIndex.layout = { breadcrumbs: [ { - title: 'SDM', + title: 'HR', href: employeeIndex.url(), }, { diff --git a/resources/js/pages/admin/sdm/leave-request/columns.tsx b/resources/js/pages/admin/hr/leave-request/columns.tsx similarity index 100% rename from resources/js/pages/admin/sdm/leave-request/columns.tsx rename to resources/js/pages/admin/hr/leave-request/columns.tsx diff --git a/resources/js/pages/admin/sdm/leave-request/index.tsx b/resources/js/pages/admin/hr/leave-request/index.tsx similarity index 99% rename from resources/js/pages/admin/sdm/leave-request/index.tsx rename to resources/js/pages/admin/hr/leave-request/index.tsx index 14eb066..246d717 100644 --- a/resources/js/pages/admin/sdm/leave-request/index.tsx +++ b/resources/js/pages/admin/hr/leave-request/index.tsx @@ -11,7 +11,7 @@ import { DialogTitle, } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; -import { approve, destroy, index as leaveRequestIndex, reject, store, update } from '@/routes/admin/sdm/leave-requests'; +import { approve, destroy, index as leaveRequestIndex, reject, store, update } from '@/routes/admin/hr/leave-requests'; import { Form, Head, router } from '@inertiajs/react'; import { Plus } from 'lucide-react'; import { useEffect, useState } from 'react'; @@ -298,7 +298,7 @@ export default function LeaveRequestIndex({ leaveRequests }: Props) { LeaveRequestIndex.layout = { breadcrumbs: [ { - title: 'SDM', + title: 'HR', href: leaveRequestIndex(), }, { diff --git a/routes/web.php b/routes/web.php index 50c0cac..b2411cb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,8 +6,8 @@ use App\Http\Controllers\Admin\Master\CategoryController; use App\Http\Controllers\Admin\Master\CustomerController; use App\Http\Controllers\Admin\Master\SupplierController; -use App\Http\Controllers\Admin\SDM\EmployeeController; -use App\Http\Controllers\Admin\SDM\LeaveRequestController; +use App\Http\Controllers\Admin\HR\EmployeeController; +use App\Http\Controllers\Admin\HR\LeaveRequestController; use Illuminate\Support\Facades\Route; Route::inertia('/', 'welcome')->name('home'); @@ -35,7 +35,7 @@ Route::post('employee-advances/{employeeAdvance}/pay', [EmployeeAdvanceController::class, 'pay'])->name('employee-advances.pay'); }); - Route::prefix('admin/sdm')->name('admin.sdm.')->group(function () { + Route::prefix('admin/hr')->name('admin.hr.')->group(function () { Route::resource('employees', EmployeeController::class)->except(['show']); Route::post('employees/{employee}/toggle-active', [EmployeeController::class, 'toggleActive'])->name('employees.toggle-active'); Route::post('employees/{employee}/reset-password', [EmployeeController::class, 'resetPassword'])->name('employees.reset-password');