From dfd2c5560b399f5011bc5aed402d7d838c4a84ec Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 23 Jun 2026 10:49:27 +0700 Subject: [PATCH] refactor: replace hardcoded URL strings with dynamic route helpers across services and frontend components. --- .../Commands/SendAttendanceReminder.php | 6 +- app/Services/Finance/CashService.php | 8 +- .../Finance/EmployeeAdvanceService.php | 10 +-- app/Services/Finance/ExpenseService.php | 6 +- app/Services/Finance/PayrollService.php | 8 +- app/Services/Hr/AttendanceService.php | 6 +- app/Services/Hr/LeaveRequestService.php | 10 +-- app/Services/Manage/CuttingService.php | 8 +- app/Services/Manage/OrderService.php | 8 +- app/Services/Manage/PurchaseService.php | 6 +- app/Services/Manage/StockService.php | 8 +- resources/js/components/AppSidebar.vue | 45 +++++------ resources/js/components/UserNav.vue | 6 +- resources/js/layouts/AccountLayout.vue | 8 +- .../js/pages/admin/account/Appearance.vue | 4 +- resources/js/pages/admin/account/Password.vue | 4 +- resources/js/pages/admin/account/Profile.vue | 4 +- .../js/pages/admin/finance/cash/Index.vue | 3 +- .../cash/form/CashTransactionFormModal.vue | 6 +- .../finance/cash/table/data-table-actions.vue | 3 +- .../admin/finance/employee-advances/Index.vue | 4 +- .../form/EmployeeAdvanceFormModal.vue | 5 +- .../form/RejectEmployeeAdvanceModal.vue | 3 +- .../table/data-table-actions.vue | 7 +- .../js/pages/admin/finance/expenses/Index.vue | 4 +- .../expenses/form/ExpenseFormModal.vue | 6 +- .../expenses/table/data-table-actions.vue | 4 +- .../js/pages/admin/finance/payroll/Index.vue | 4 +- .../payroll/form/PayrollAdjustmentModal.vue | 7 +- .../form/AttendanceWebcamModal.vue | 5 +- .../attendances/table/AttendanceCalendar.vue | 3 +- .../table/AttendanceDetailDialog.vue | 3 +- .../attendances/table/data-table-actions.vue | 3 +- .../js/pages/admin/hr/employees/Create.vue | 5 +- .../js/pages/admin/hr/employees/Edit.vue | 5 +- .../js/pages/admin/hr/employees/Index.vue | 5 +- .../hr/employees/form/ResetPasswordDialog.vue | 3 +- .../hr/employees/table/data-table-actions.vue | 7 +- .../table/employee-status-toggle.vue | 3 +- .../pages/admin/hr/leave-requests/Index.vue | 3 +- .../form/LeaveRequestFormModal.vue | 5 +- .../form/RejectLeaveRequestModal.vue | 3 +- .../table/data-table-actions.vue | 5 +- .../js/pages/admin/manage/cuttings/Create.vue | 5 +- .../js/pages/admin/manage/cuttings/Edit.vue | 5 +- .../js/pages/admin/manage/cuttings/Index.vue | 5 +- .../manage/cuttings/form/CuttingPosForm.vue | 14 ++-- .../cuttings/table/data-table-actions.vue | 14 ++-- .../js/pages/admin/manage/orders/Create.vue | 5 +- .../js/pages/admin/manage/orders/Edit.vue | 5 +- .../js/pages/admin/manage/orders/Index.vue | 5 +- .../js/pages/admin/manage/orders/Show.vue | 9 ++- .../orders/form/CustomerQuickCreateModal.vue | 78 +++++++++++++------ .../admin/manage/orders/form/OrderPosForm.vue | 9 ++- .../orders/table/data-table-actions.vue | 9 ++- .../table/data-table-actions.vue | 5 +- .../pages/admin/manage/purchases/Create.vue | 5 +- .../js/pages/admin/manage/purchases/Edit.vue | 5 +- .../js/pages/admin/manage/purchases/Index.vue | 5 +- .../manage/purchases/form/PurchasePosForm.vue | 5 +- .../purchases/table/data-table-actions.vue | 5 +- .../stocks/table/data-table-actions.vue | 3 +- .../pages/admin/master/categories/Index.vue | 3 +- .../categories/form/CategoryFormModal.vue | 5 +- .../categories/table/data-table-actions.vue | 3 +- .../js/pages/admin/master/customers/Index.vue | 3 +- .../customers/form/CustomerFormModal.vue | 5 +- .../customers/table/data-table-actions.vue | 3 +- .../js/pages/admin/master/products/Create.vue | 5 +- .../js/pages/admin/master/products/Edit.vue | 5 +- .../js/pages/admin/master/products/Index.vue | 5 +- .../products/table/data-table-actions.vue | 5 +- .../products/table/product-status-toggle.vue | 3 +- .../admin/master/raw-materials/Create.vue | 5 +- .../pages/admin/master/raw-materials/Edit.vue | 5 +- .../admin/master/raw-materials/Index.vue | 5 +- .../table/data-table-actions.vue | 5 +- .../table/raw-material-status-toggle.vue | 3 +- .../js/pages/admin/master/suppliers/Index.vue | 3 +- .../suppliers/form/SupplierFormModal.vue | 5 +- .../suppliers/table/data-table-actions.vue | 3 +- .../admin/system/activity-logs/Index.vue | 3 +- .../js/pages/admin/system/roles/Create.vue | 5 +- .../js/pages/admin/system/roles/Edit.vue | 5 +- .../js/pages/admin/system/roles/Index.vue | 5 +- .../system/roles/table/data-table-actions.vue | 11 ++- .../system/setting/form/HomepageSection.vue | 3 +- .../admin/system/setting/form/HrSection.vue | 3 +- .../setting/form/MarketplaceSection.vue | 3 +- .../setting/form/SocialMediaSection.vue | 3 +- .../system/setting/form/SystemSection.vue | 3 +- 91 files changed, 358 insertions(+), 230 deletions(-) diff --git a/app/Console/Commands/SendAttendanceReminder.php b/app/Console/Commands/SendAttendanceReminder.php index fb8741a..a595cef 100644 --- a/app/Console/Commands/SendAttendanceReminder.php +++ b/app/Console/Commands/SendAttendanceReminder.php @@ -2,7 +2,6 @@ namespace App\Console\Commands; -use App\Enums\EmployeeStatus; use App\Models\Attendance; use App\Models\Employee; use App\Services\System\PushNotificationService; @@ -31,8 +30,7 @@ public function handle(PushNotificationService $pushNotificationService): int $scheduledCheckIn = Carbon::createFromFormat('Y-m-d H:i', $now->format('Y-m-d').' '.$scheduledTime); $employees = Employee::query() - ->where('status', EmployeeStatus::ACTIVE) - ->whereNotNull('user_id') + ->whereHas('user', fn ($query) => $query->active()) ->get(); $sentCount = 0; @@ -51,7 +49,7 @@ public function handle(PushNotificationService $pushNotificationService): int '⏰ Pengingat Presensi', "Jangan lupa melakukan presensi masuk sebelum pukul {$scheduledTime}.", $employee->user_id, - '/admin/hr/attendances', + route('admin.hr.attendances.index'), ); $sentCount++; diff --git a/app/Services/Finance/CashService.php b/app/Services/Finance/CashService.php index 3aa0354..bcaf02d 100644 --- a/app/Services/Finance/CashService.php +++ b/app/Services/Finance/CashService.php @@ -97,7 +97,7 @@ public function deposit(CashAccount $cashAccount, array $validated, User $user): '💰 Setoran Kas', "Setoran kas baru {$transaction->amount_formatted} dengan keterangan: {$transaction->description} oleh {$user->profile?->full_name}.", ['owner', 'developer', 'admin-toko'], - '/admin/finance/cash', + route('admin.finance.cash.index'), ); return $transaction; @@ -141,7 +141,7 @@ public function withdraw(CashAccount $cashAccount, array $validated, User $user) '🏦 Tarik Kas', "Tarik kas {$transaction->amount_formatted} dengan keterangan: {$transaction->description} oleh {$user->profile?->full_name}.", ['owner', 'developer', 'admin-toko'], - '/admin/finance/cash', + route('admin.finance.cash.index'), ); return $transaction; @@ -250,7 +250,7 @@ public function updateDeposit(CashTransaction $transaction, array $validated): v '✏️ Transaksi Kas Diperbarui', "Transaksi kas dengan keterangan {$transaction->description} diperbarui menjadi senilai {$transaction->amount_formatted}.", ['owner', 'developer', 'admin-toko'], - '/admin/finance/cash', + route('admin.finance.cash.index'), ); } @@ -279,7 +279,7 @@ public function deleteTransaction(CashTransaction $transaction): void '🗑️ Transaksi Kas Dihapus', "Transaksi kas senilai {$transaction->amount_formatted} dengan keterangan {$transaction->description} telah dihapus.", ['owner', 'developer', 'admin-toko'], - '/admin/finance/cash', + route('admin.finance.cash.index'), ); } diff --git a/app/Services/Finance/EmployeeAdvanceService.php b/app/Services/Finance/EmployeeAdvanceService.php index ebb6220..e281dcc 100644 --- a/app/Services/Finance/EmployeeAdvanceService.php +++ b/app/Services/Finance/EmployeeAdvanceService.php @@ -90,7 +90,7 @@ public function create(array $validated, User $user): void '💰 Pengajuan Kasbon Baru', "Karyawan {$user->profil?->full_name} mengajukan kasbon sebesar {$employeeAdvance->amount_formatted} dengan keterangan: {$employeeAdvance->description}.", ['owner', 'developer'], - '/admin/finance/employee-advances', + route('admin.finance.employee-advances.index'), ); } @@ -111,7 +111,7 @@ public function update(EmployeeAdvance $employeeAdvance, array $validated, User '✏️ Kasbon Diperbarui', "Kasbon sebesar {$employeeAdvance->amount_formatted} telah diperbarui oleh {$user->profile?->full_name}.", ['owner', 'developer'], - '/admin/finance/employee-advances', + route('admin.finance.employee-advances.index'), ); } @@ -126,7 +126,7 @@ public function delete(EmployeeAdvance $employeeAdvance, User $user): void '🗑️ Kasbon Dihapus', "Kasbon sebesar {$amount} dengan keterangan {$description} telah dihapus.", ['owner', 'developer'], - '/admin/finance/employee-advances', + route('admin.finance.employee-advances.index'), ); } @@ -161,7 +161,7 @@ public function approve(EmployeeAdvance $employeeAdvance, User $user): void '💰 Kasbon Disetujui', "Pengajuan kasbon Anda sebesar {$employeeAdvance->amount_formatted} telah disetujui.", $employeeAdvance->employee->user_id, - '/admin/finance/employee-advances', + route('admin.finance.employee-advances.index'), ); } } @@ -187,7 +187,7 @@ public function reject(EmployeeAdvance $employeeAdvance, string $reason, User $u '💰 Kasbon Ditolak', "Pengajuan kasbon Anda sebesar {$employeeAdvance->amount_formatted} ditolak dengan alasan: {$reason}.", $employeeAdvance->employee->user_id, - '/admin/finance/employee-advances', + route('admin.finance.employee-advances.index'), ); } } diff --git a/app/Services/Finance/ExpenseService.php b/app/Services/Finance/ExpenseService.php index 98be368..b5ee6ef 100644 --- a/app/Services/Finance/ExpenseService.php +++ b/app/Services/Finance/ExpenseService.php @@ -85,7 +85,7 @@ public function create(array $validated, User $user): void '💸 Pengeluaran Baru', "Pengeluaran baru sebesar {$expense->amount_formatted} dengan keterangan {$expense->description} telah dicatat oleh {$user->profile?->full_name}.", ['owner', 'developer'], - '/admin/finance/expenses', + route('admin.finance.expenses.index'), ); } @@ -118,7 +118,7 @@ public function update(Expense $expense, array $validated): void '✏️ Pengeluaran Diperbarui', "Pengeluaran dengan keterangan {$expense->description} diperbarui menjadi sebesar {$expense->amount_formatted}.", ['owner', 'developer'], - '/admin/finance/expenses', + route('admin.finance.expenses.index'), ); } @@ -137,7 +137,7 @@ public function delete(Expense $expense): void '🗑️ Pengeluaran Dihapus', "Pengeluaran sebesar {$expense->amount_formatted} dengan keterangan {$expense->description} telah dihapus.", ['owner', 'developer'], - '/admin/finance/expenses', + route('admin.finance.expenses.index'), ); } diff --git a/app/Services/Finance/PayrollService.php b/app/Services/Finance/PayrollService.php index 66adf48..d130555 100644 --- a/app/Services/Finance/PayrollService.php +++ b/app/Services/Finance/PayrollService.php @@ -224,7 +224,7 @@ public function addAdjustment(Payroll $payroll, array $validated, User $user): v "📊 Penyesuaian Gaji: {$typeLabel}", "Gaji periode {$payroll->payrollPeriod->period_label} disesuaikan: {$typeLabel} sebesar {$formattedAmount} ({$validated['description']}).", $payroll->employee->user_id, - '/admin/finance/payrolls', + route('admin.finance.payroll.index'), ); } } @@ -252,7 +252,7 @@ public function updateAdjustment(PayrollAdjustment $adjustment, array $validated "📊 Penyesuaian Gaji Diperbarui: {$typeLabel}", "Penyesuaian gaji Anda untuk periode {$payroll->payrollPeriod->period_label} diperbarui: {$typeLabel} menjadi {$formattedAmount} ({$validated['description']}).", $payroll->employee->user_id, - '/admin/finance/payrolls', + route('admin.finance.payroll.index'), ); } } @@ -275,7 +275,7 @@ public function deleteAdjustment(PayrollAdjustment $adjustment): void '📊 Penyesuaian Gaji Dihapus', "Penyesuaian gaji Anda untuk periode {$payroll->payrollPeriod->period_label} telah dihapus.", $payroll->employee->user_id, - '/admin/finance/payrolls', + route('admin.finance.payroll.index'), ); } } @@ -325,7 +325,7 @@ public function pay(Payroll $payroll, User $user): void '💸 Gaji Dibayarkan', "Gaji Anda untuk periode {$payroll->payrollPeriod->period_label} senilai {$payroll->total_amount_formatted} telah dibayarkan.", $payroll->employee->user_id, - '/admin/finance/payrolls', + route('admin.finance.payroll.index'), ); } } diff --git a/app/Services/Hr/AttendanceService.php b/app/Services/Hr/AttendanceService.php index af90cff..afc7c0a 100644 --- a/app/Services/Hr/AttendanceService.php +++ b/app/Services/Hr/AttendanceService.php @@ -105,7 +105,7 @@ public function checkIn(array $validated, User $user): void '⏰ Presensi Masuk', "Karyawan {$user->profile?->full_name} melakukan presensi masuk.", ['owner', 'developer'], - '/admin/hr/attendances', + route('admin.hr.attendances.index'), ); } @@ -154,7 +154,7 @@ public function checkOut(array $validated, User $user): void '⏰ Presensi Pulang', "Karyawan {$user->profile?->full_name} melakukan presensi pulang (Durasi kerja: ".round($workDurationMinutes / 60, 1).' jam).', ['owner', 'developer'], - '/admin/hr/attendances', + route('admin.hr.attendances.index'), ); } @@ -172,7 +172,7 @@ public function delete(Attendance $attendance): void '🗑️ Presensi Dihapus', "Data presensi {$employeeName} tanggal {$date} telah dihapus.", ['owner', 'developer'], - '/admin/hr/attendances', + route('admin.hr.attendances.index'), ); } } diff --git a/app/Services/Hr/LeaveRequestService.php b/app/Services/Hr/LeaveRequestService.php index 941aaaa..907659e 100644 --- a/app/Services/Hr/LeaveRequestService.php +++ b/app/Services/Hr/LeaveRequestService.php @@ -83,7 +83,7 @@ public function create(array $validated, User $user): void '🏖️ Pengajuan Cuti Baru', "Karyawan {$user->profile?->full_name} mengajukan cuti selama {$leaveRequest->total_days} hari mulai dari tanggal {$leaveRequest->start_date_formatted}.", ['owner', 'developer'], - '/admin/hr/leave-requests', + route('admin.hr.leave_requests.index'), ); } @@ -107,7 +107,7 @@ public function update(LeaveRequest $leaveRequest, array $validated, User $user) '✏️ Pengajuan Cuti Diperbarui', "Pengajuan cuti oleh {$user->profile?->full_name} telah diperbarui.", ['owner', 'developer'], - '/admin/hr/leave-requests', + route('admin.hr.leave_requests.index'), ); } @@ -122,7 +122,7 @@ public function delete(LeaveRequest $leaveRequest): void '🗑️ Pengajuan Cuti Dihapus', "Pengajuan cuti {$totalDays} hari oleh {$employeeName} telah dihapus.", ['owner', 'developer'], - '/admin/hr/leave-requests', + route('admin.hr.leave_requests.index'), ); } @@ -142,7 +142,7 @@ public function approve(LeaveRequest $leaveRequest, User $user): void '🏖️ Pengajuan Cuti Disetujui', "Pengajuan cuti Anda selama {$leaveRequest->total_days} hari ({$leaveRequest->start_date_formatted} - {$leaveRequest->end_date_formatted}) telah disetujui.", $leaveRequest->employee->user_id, - '/admin/hr/leave-requests', + route('admin.hr.leave_requests.index'), ); } } @@ -168,7 +168,7 @@ public function reject(LeaveRequest $leaveRequest, string $reason, User $user): '🏖️ Pengajuan Cuti Ditolak', "Pengajuan cuti Anda selama {$leaveRequest->total_days} hari ({$leaveRequest->start_date_formatted} - {$leaveRequest->end_date_formatted}) ditolak dengan alasan: '{$reason}'.", $leaveRequest->employee->user_id, - '/admin/hr/leave-requests', + route('admin.hr.leave_requests.index'), ); } } diff --git a/app/Services/Manage/CuttingService.php b/app/Services/Manage/CuttingService.php index 746d6ce..af2d36d 100644 --- a/app/Services/Manage/CuttingService.php +++ b/app/Services/Manage/CuttingService.php @@ -476,7 +476,7 @@ public function create(array $validated, User $user): Cutting '✂️ Proses Cutting Baru', "Proses cutting dengan deskripsi ({$cutting->description}) telah dimulai oleh {$user->profile?->full_name}.", ['owner', 'developer'], - '/admin/manage/cuttings', + route('admin.manage.cuttings.index'), ); return $cutting; @@ -536,7 +536,7 @@ public function update(Cutting $cutting, array $validated): void '✏️ Proses Cutting Diperbarui', "Proses cutting dengan deskripsi '{$description}' telah diperbarui.", ['owner', 'developer'], - '/admin/manage/cuttings', + route('admin.manage.cuttings.index'), ); } @@ -568,7 +568,7 @@ public function delete(Cutting $cutting): void '🗑️ Proses Cutting Dihapus', "Proses cutting dengan deskripsi {$description} telah dihapus.", ['owner', 'developer'], - '/admin/manage/cuttings', + route('admin.manage.cuttings.index'), ); } @@ -655,7 +655,7 @@ public function transitionStatus( $title, $message, $roles, - '/admin/manage/cuttings', + route('admin.manage.cuttings.index'), ); } diff --git a/app/Services/Manage/OrderService.php b/app/Services/Manage/OrderService.php index 7424d5c..9e9e114 100644 --- a/app/Services/Manage/OrderService.php +++ b/app/Services/Manage/OrderService.php @@ -483,7 +483,7 @@ public function create(array $validated, User $user): Order '📦 Pesanan Baru', "Pesanan baru {$order->order_number} senilai {$order->total_amount_formatted} telah dibuat oleh {$user->profile?->full_name}.", ['owner', 'developer'], - '/admin/manage/orders', + route('admin.manage.orders.index'), ); return $order; @@ -563,7 +563,7 @@ public function update(Order $order, array $validated): void '✏️ Pesanan Diperbarui', "Pesanan {$order->order_number} senilai {$order->total_amount_formatted} telah diperbarui.", ['owner', 'developer'], - '/admin/manage/orders', + route('admin.manage.orders.index'), ); } @@ -593,7 +593,7 @@ public function delete(Order $order): void '🗑️ Pesanan Dihapus', "Pesanan {$orderNumber} senilai {$order->total_amount_formatted} telah dihapus.", ['owner', 'developer'], - '/admin/manage/orders', + route('admin.manage.orders.index'), ); } @@ -627,7 +627,7 @@ public function transitionStatus(Order $order, OrderStatus $status): void '📦 Status Pesanan Diubah', "Pesanan {$order->order_number} diubah statusnya menjadi {$status->label()}.", ['owner', 'developer'], - '/admin/manage/orders', + route('admin.manage.orders.index'), ); } diff --git a/app/Services/Manage/PurchaseService.php b/app/Services/Manage/PurchaseService.php index 3bf45fc..183fe6e 100644 --- a/app/Services/Manage/PurchaseService.php +++ b/app/Services/Manage/PurchaseService.php @@ -253,7 +253,7 @@ public function create(array $validated, User $user): Purchase '🛒 Belanja Baru', "Pembelian dari supplier {$purchase->supplier->name} senilai {$purchase->total_formatted} telah ditambahkan oleh {$user->profile?->full_name}.", ['owner', 'developer'], - '/admin/manage/purchases', + route('admin.manage.purchases.index'), ); return $purchase; @@ -301,7 +301,7 @@ public function update(Purchase $purchase, array $validated): void '✏️ Belanja Diperbarui', "Pembelian dari supplier {$purchase->supplier->name} senilai {$purchase->total_formatted} telah diperbarui.", ['owner', 'developer'], - '/admin/manage/purchases', + route('admin.manage.purchases.index'), ); } @@ -325,7 +325,7 @@ public function delete(Purchase $purchase): void '🗑️ Belanja Dihapus', "Pembelian dari supplier {$supplierName} senilai {$purchase->total_formatted} telah dihapus.", ['owner', 'developer'], - '/admin/manage/purchases', + route('admin.manage.purchases.index'), ); } diff --git a/app/Services/Manage/StockService.php b/app/Services/Manage/StockService.php index 78271c8..4895f94 100644 --- a/app/Services/Manage/StockService.php +++ b/app/Services/Manage/StockService.php @@ -120,7 +120,7 @@ public function submitVerification( '📦 Verifikasi Stok Menunggu Persetujuan', "Cutting dengan deskripsi '{$description}' telah diajukan verifikasi dan menunggu persetujuan owner.", ['owner', 'developer'], - '/admin/manage/owner-verifications', + route('admin.manage.owner_verifications.index'), ); } @@ -161,7 +161,7 @@ public function approveVerification( '📦 Stok Cutting Diverifikasi', "Cutting dengan deskripsi '{$description}' telah disetujui owner dan stok produk telah ditambahkan ke toko.", ['owner', 'developer'], - '/admin/manage/owner-verifications', + route('admin.manage.owner_verifications.index'), ); } @@ -194,7 +194,7 @@ public function rejectVerification( '📦 Verifikasi Cutting Ditolak Owner', "Cutting dengan deskripsi '{$description}' ditolak oleh owner dengan alasan: '{$reason}'.", ['owner', 'developer'], - '/admin/manage/owner-verifications', + route('admin.manage.owner_verifications.index'), ); if ($cutting->submitted_by_id) { @@ -202,7 +202,7 @@ public function rejectVerification( '📦 Verifikasi Cutting Ditolak Owner', "Cutting dengan deskripsi '{$description}' yang Anda verifikasi ditolak oleh owner dengan alasan: '{$reason}'.", $cutting->submitted_by_id, - '/admin/manage/owner-verifications', + route('admin.manage.owner_verifications.index'), ); } } diff --git a/resources/js/components/AppSidebar.vue b/resources/js/components/AppSidebar.vue index e3ea874..a8c9d0d 100644 --- a/resources/js/components/AppSidebar.vue +++ b/resources/js/components/AppSidebar.vue @@ -15,6 +15,7 @@ import { SidebarRail, } from '@/components/ui/sidebar'; import { useCan } from '@/composables/useCan'; +import admin from '@/routes/admin'; const page = usePage(); const { can } = useCan(); @@ -36,52 +37,52 @@ const menuGroups: MenuGroup[] = [ { label: 'Menu', items: [ - { title: 'Dasbor', href: '/admin/dashboard', icon: LayoutDashboard }, + { title: 'Dasbor', href: admin.dashboard.url(), icon: LayoutDashboard }, ], }, { label: 'Master', items: [ - { title: 'Kategori', href: '/admin/master/categories', icon: FolderTree, permission: 'categories.view' }, - { title: 'Produk', href: '/admin/master/products', icon: Package, permission: 'products.view' }, - { title: 'Bahan Baku', href: '/admin/master/raw-materials', icon: Layers, permission: 'raw_materials.view' }, - { title: 'Supplier', href: '/admin/master/suppliers', icon: User, permission: 'suppliers.view' }, - { title: 'Customer', href: '/admin/master/customers', icon: UserCheck, permission: 'customers.view' }, + { title: 'Kategori', href: admin.master.categories.index.url(), icon: FolderTree, permission: 'categories.view' }, + { title: 'Produk', href: admin.master.products.index.url(), icon: Package, permission: 'products.view' }, + { title: 'Bahan Baku', href: admin.master.raw_materials.index.url(), icon: Layers, permission: 'raw_materials.view' }, + { title: 'Supplier', href: admin.master.suppliers.index.url(), icon: User, permission: 'suppliers.view' }, + { title: 'Customer', href: admin.master.customers.index.url(), icon: UserCheck, permission: 'customers.view' }, ], }, { label: 'Kelola', items: [ - { title: 'Belanja', href: '/admin/manage/purchases', icon: ShoppingBag, permission: 'purchases.view' }, - { title: 'Cutting', href: '/admin/manage/cuttings', icon: Scissors, permission: 'cuttings.view' }, - { title: 'Stok', href: '/admin/manage/stocks', icon: Warehouse, permission: 'stocks.view', badgeKey: 'pendingCuttings' }, - { title: 'Verifikasi Owner', href: '/admin/manage/owner-verifications', icon: CheckCircle, permission: 'owner_verifications.view', badgeKey: 'pendingOwnerVerifications' }, - { title: 'Pesanan', href: '/admin/manage/orders', icon: ShoppingCart, permission: 'orders.view' }, + { title: 'Belanja', href: admin.manage.purchases.index.url(), icon: ShoppingBag, permission: 'purchases.view' }, + { title: 'Cutting', href: admin.manage.cuttings.index.url(), icon: Scissors, permission: 'cuttings.view' }, + { title: 'Stok', href: admin.manage.stocks.index.url(), icon: Warehouse, permission: 'stocks.view', badgeKey: 'pendingCuttings' }, + { title: 'Verifikasi Owner', href: admin.manage.owner_verifications.index.url(), icon: CheckCircle, permission: 'owner_verifications.view', badgeKey: 'pendingOwnerVerifications' }, + { title: 'Pesanan', href: admin.manage.orders.index.url(), icon: ShoppingCart, permission: 'orders.view' }, ], }, { label: 'Keuangan', items: [ - { title: 'Kas Toko', href: '/admin/finance/cash', icon: Wallet, permission: 'cash.view' }, - { title: 'Pengeluaran', href: '/admin/finance/expenses', icon: Receipt, permission: 'expenses.view' }, - { title: 'Kasbon', href: '/admin/finance/employee-advances', icon: Banknote, permission: 'employee_advances.view', badgeKey: 'pendingEmployeeAdvances' }, - { title: 'Gaji', href: '/admin/finance/payroll', icon: WalletCards, permission: 'payroll.view' }, + { title: 'Kas Toko', href: admin.finance.cash.index.url(), icon: Wallet, permission: 'cash.view' }, + { title: 'Pengeluaran', href: admin.finance.expenses.index.url(), icon: Receipt, permission: 'expenses.view' }, + { title: 'Kasbon', href: admin.finance.employee_advances.index.url(), icon: Banknote, permission: 'employee_advances.view', badgeKey: 'pendingEmployeeAdvances' }, + { title: 'Gaji', href: admin.finance.payroll.index.url(), icon: WalletCards, permission: 'payroll.view' }, ], }, { label: 'HR', items: [ - { title: 'Pegawai', href: '/admin/hr/employees', icon: Users, permission: 'employees.view' }, - { title: 'Presensi', href: '/admin/hr/attendances', icon: Clock, permission: 'attendances.view' }, - { title: 'Cuti', href: '/admin/hr/leave-requests', icon: CalendarDays, permission: 'leave_requests.view', badgeKey: 'pendingLeaveRequests' }, + { title: 'Pegawai', href: admin.hr.employees.index.url(), icon: Users, permission: 'employees.view' }, + { title: 'Presensi', href: admin.hr.attendances.index.url(), icon: Clock, permission: 'attendances.view' }, + { title: 'Cuti', href: admin.hr.leave_requests.index.url(), icon: CalendarDays, permission: 'leave_requests.view', badgeKey: 'pendingLeaveRequests' }, ], }, { label: 'Sistem', items: [ - { title: 'Role & Permission', href: '/admin/system/roles', icon: Shield, permission: 'roles.view' }, - { title: 'Pengaturan', href: '/admin/system/settings', icon: Settings2, permission: 'settings.view' }, - { title: 'Log Aktivitas', href: '/admin/system/activity-logs', icon: History, permission: 'activity_logs.view' }, + { title: 'Role & Permission', href: admin.system.roles.index.url(), icon: Shield, permission: 'roles.view' }, + { title: 'Pengaturan', href: admin.system.settings.index.url(), icon: Settings2, permission: 'settings.view' }, + { title: 'Log Aktivitas', href: admin.system.activity_logs.index.url(), icon: History, permission: 'activity_logs.view' }, ], }, ]; @@ -93,7 +94,7 @@ const menuGroups: MenuGroup[] = [ - + { const { isSupported, isSubscribed, isLoading, toggle } = usePushNotification(); function logout() { - router.post('/auth/logout'); + router.post(logoutRoute.url()); } @@ -69,7 +71,7 @@ function logout() { - + Profil diff --git a/resources/js/layouts/AccountLayout.vue b/resources/js/layouts/AccountLayout.vue index cd59dc1..f92987b 100644 --- a/resources/js/layouts/AccountLayout.vue +++ b/resources/js/layouts/AccountLayout.vue @@ -5,23 +5,25 @@ import { computed } from 'vue'; import AdminLayout from '@/layouts/AdminLayout.vue'; import { cn } from '@/lib/utils'; +import { profile, password, appearance } from '@/routes/admin/account'; + const page = usePage(); const currentPath = computed(() => page.url.split('?')[0]); const navItems = [ { - href: '/admin/account/profile', + href: profile.url(), label: 'Profil', icon: User, }, { - href: '/admin/account/password', + href: password.url(), label: 'Kata Sandi', icon: KeyRound, }, { - href: '/admin/account/appearance', + href: appearance.url(), label: 'Tampilan', icon: Palette, }, diff --git a/resources/js/pages/admin/account/Appearance.vue b/resources/js/pages/admin/account/Appearance.vue index 4d6f3ef..e1e911d 100644 --- a/resources/js/pages/admin/account/Appearance.vue +++ b/resources/js/pages/admin/account/Appearance.vue @@ -19,6 +19,8 @@ import { formErrors } from '@/lib/form'; import { cn } from '@/lib/utils'; import type { AppearanceFormData, AppearanceMode } from '@/types/account'; +import { update } from '@/routes/admin/account/appearance'; + const props = defineProps<{ appearance: AppearanceMode; }>(); @@ -63,7 +65,7 @@ function onAppearanceChange(value: AcceptableValue) { } function submit() { - form.put('/admin/account/appearance', { + form.put(update.url(), { onError: () => { toast.error('Gagal menyimpan tampilan.'); }, diff --git a/resources/js/pages/admin/account/Password.vue b/resources/js/pages/admin/account/Password.vue index 2bae523..5d6c38f 100644 --- a/resources/js/pages/admin/account/Password.vue +++ b/resources/js/pages/admin/account/Password.vue @@ -17,6 +17,8 @@ import AccountLayout from '@/layouts/AccountLayout.vue'; import { formErrors } from '@/lib/form'; import type { PasswordFormData } from '@/types/account'; +import { update } from '@/routes/admin/account/password'; + const form = useForm({ current_password: '', password: '', @@ -28,7 +30,7 @@ const showPassword = ref(false); const showPasswordConfirmation = ref(false); function submit() { - form.put('/admin/account/password', { + form.put(update.url(), { onSuccess: () => { form.reset(); }, diff --git a/resources/js/pages/admin/account/Profile.vue b/resources/js/pages/admin/account/Profile.vue index 5023498..e287c5a 100644 --- a/resources/js/pages/admin/account/Profile.vue +++ b/resources/js/pages/admin/account/Profile.vue @@ -25,6 +25,8 @@ import type { ProfileUser, } from '@/types/account'; +import { update } from '@/routes/admin/account/profile'; + const props = defineProps<{ user: ProfileUser; genders: EnumOption[]; @@ -41,7 +43,7 @@ const form = useForm({ }); function submit() { - form.put('/admin/account/profile', { + form.put(update.url(), { preserveScroll: true, onError: () => { toast.error('Gagal menyimpan profil. Periksa kembali formulir.'); diff --git a/resources/js/pages/admin/finance/cash/Index.vue b/resources/js/pages/admin/finance/cash/Index.vue index 980c992..9c2460d 100644 --- a/resources/js/pages/admin/finance/cash/Index.vue +++ b/resources/js/pages/admin/finance/cash/Index.vue @@ -14,6 +14,7 @@ import type { CashAccount, CashTransactionListItem, PaginatedCashTransactions } import type { DataTableFilterDef, DataTableSort } from '@/types/data-table'; import CashTransactionFormModal from './form/CashTransactionFormModal.vue'; import { createColumns } from './table/columns'; +import { index } from '@/routes/admin/finance/cash'; const props = defineProps<{ cashAccount: CashAccount; @@ -33,7 +34,7 @@ const formModalMode = ref<'deposit' | 'withdrawal'>(CashTransactionType.DEPOSIT) const editingTransaction = ref(null); const { query, setSearch, setSort, setFilter, resetFilters, syncFromServer } = useDataTableQuery({ - url: '/admin/finance/cash', + url: index.url(), initial: { ...props.filters }, filterKeys: ['reference_type'], }); diff --git a/resources/js/pages/admin/finance/cash/form/CashTransactionFormModal.vue b/resources/js/pages/admin/finance/cash/form/CashTransactionFormModal.vue index e114437..a6e1a69 100644 --- a/resources/js/pages/admin/finance/cash/form/CashTransactionFormModal.vue +++ b/resources/js/pages/admin/finance/cash/form/CashTransactionFormModal.vue @@ -29,6 +29,8 @@ import { parseRupiah } from '@/lib/rupiah'; import type { CashTransactionListItem } from '@/types/cash'; import { appendRootPhotosToFormData, createMediaUploadState } from '@/types/media'; import type { MediaUploadState } from '@/types/media'; +import { withdraw, deposit } from '@/routes/admin/finance/cash'; +import { update } from '@/routes/admin/finance/cash/transactions'; const open = defineModel('open', { default: false }); @@ -111,12 +113,12 @@ function submit() { }; if (isEditing.value && props.transaction) { - form.transform(() => payload).put(`/admin/finance/cash/transactions/${props.transaction.id}`, options); + form.transform(() => payload).put(update.url(props.transaction.id), options); return; } - const endpoint = isWithdrawal.value ? '/admin/finance/cash/withdraw' : '/admin/finance/cash/deposit'; + const endpoint = isWithdrawal.value ? withdraw.url() : deposit.url(); form.transform(() => payload).post(endpoint, options); } diff --git a/resources/js/pages/admin/finance/cash/table/data-table-actions.vue b/resources/js/pages/admin/finance/cash/table/data-table-actions.vue index 48ca5bd..55981e5 100644 --- a/resources/js/pages/admin/finance/cash/table/data-table-actions.vue +++ b/resources/js/pages/admin/finance/cash/table/data-table-actions.vue @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useCan } from '@/composables/useCan'; import type { CashTransactionListItem } from '@/types/cash'; +import { destroy } from '@/routes/admin/finance/cash/transactions'; const props = defineProps<{ transaction: CashTransactionListItem; @@ -27,7 +28,7 @@ const deleteProcessing = ref(false); function destroyTransaction() { deleteProcessing.value = true; - router.delete(`/admin/finance/cash/transactions/${props.transaction.id}`, { + router.delete(destroy.url(props.transaction.id), { preserveScroll: true, onSuccess: () => { deleteConfirmOpen.value = false; diff --git a/resources/js/pages/admin/finance/employee-advances/Index.vue b/resources/js/pages/admin/finance/employee-advances/Index.vue index 4356b08..cdce5fd 100644 --- a/resources/js/pages/admin/finance/employee-advances/Index.vue +++ b/resources/js/pages/admin/finance/employee-advances/Index.vue @@ -21,6 +21,8 @@ import EmployeeAdvanceFormModal from './form/EmployeeAdvanceFormModal.vue'; import RejectEmployeeAdvanceModal from './form/RejectEmployeeAdvanceModal.vue'; import { createColumns } from './table/columns'; +import { index } from '@/routes/admin/finance/employee_advances'; + const props = defineProps(); const { can } = useCan(); @@ -32,7 +34,7 @@ const rejectingEmployeeAdvance = ref(null); const { query, setSearch, setSort, setFilter, resetFilters, syncFromServer } = useDataTableQuery({ - url: '/admin/finance/employee-advances', + url: index.url(), initial: { ...props.filters }, filterKeys: ['status'], }); diff --git a/resources/js/pages/admin/finance/employee-advances/form/EmployeeAdvanceFormModal.vue b/resources/js/pages/admin/finance/employee-advances/form/EmployeeAdvanceFormModal.vue index 7fd4071..2656f58 100644 --- a/resources/js/pages/admin/finance/employee-advances/form/EmployeeAdvanceFormModal.vue +++ b/resources/js/pages/admin/finance/employee-advances/form/EmployeeAdvanceFormModal.vue @@ -26,6 +26,7 @@ import { FIELD_LIMITS } from '@/lib/field-limits'; import { formErrors } from '@/lib/form'; import { parseRupiah } from '@/lib/rupiah'; import type { EmployeeAdvanceFormData, EmployeeAdvanceListItem } from '@/types/employee-advance'; +import { store, update } from '@/routes/admin/finance/employee_advances'; const open = defineModel('open', { default: false }); @@ -94,12 +95,12 @@ function submit() { }; if (isEditing.value && props.employeeAdvance) { - form.transform(() => payload).put(`/admin/finance/employee-advances/${props.employeeAdvance.id}`, options); + form.transform(() => payload).put(update.url(props.employeeAdvance.id), options); return; } - form.transform(() => payload).post('/admin/finance/employee-advances', options); + form.transform(() => payload).post(store.url(), options); } diff --git a/resources/js/pages/admin/finance/employee-advances/form/RejectEmployeeAdvanceModal.vue b/resources/js/pages/admin/finance/employee-advances/form/RejectEmployeeAdvanceModal.vue index a416ae7..c0a14d6 100644 --- a/resources/js/pages/admin/finance/employee-advances/form/RejectEmployeeAdvanceModal.vue +++ b/resources/js/pages/admin/finance/employee-advances/form/RejectEmployeeAdvanceModal.vue @@ -22,6 +22,7 @@ import { Textarea } from '@/components/ui/textarea'; import { FIELD_LIMITS } from '@/lib/field-limits'; import { formErrors } from '@/lib/form'; import type { EmployeeAdvanceListItem } from '@/types/employee-advance'; +import { reject } from '@/routes/admin/finance/employee_advances'; const open = defineModel('open', { default: false }); @@ -49,7 +50,7 @@ function submit() { return; } - form.post(`/admin/finance/employee-advances/${props.employeeAdvance.id}/reject`, { + form.post(reject.url(props.employeeAdvance.id), { preserveScroll: true, onSuccess: () => { open.value = false; diff --git a/resources/js/pages/admin/finance/employee-advances/table/data-table-actions.vue b/resources/js/pages/admin/finance/employee-advances/table/data-table-actions.vue index 4909c3e..a9e5ca6 100644 --- a/resources/js/pages/admin/finance/employee-advances/table/data-table-actions.vue +++ b/resources/js/pages/admin/finance/employee-advances/table/data-table-actions.vue @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useCan } from '@/composables/useCan'; import type { EmployeeAdvanceListItem } from '@/types/employee-advance'; +import { destroy, approve, pay } from '@/routes/admin/finance/employee_advances'; const props = defineProps<{ employeeAdvance: EmployeeAdvanceListItem; @@ -50,7 +51,7 @@ const payProcessing = ref(false); function destroyEmployeeAdvance() { deleteProcessing.value = true; - router.delete(`/admin/finance/employee-advances/${props.employeeAdvance.id}`, { + router.delete(destroy.url(props.employeeAdvance.id), { preserveScroll: true, onSuccess: () => { deleteConfirmOpen.value = false; @@ -67,7 +68,7 @@ function destroyEmployeeAdvance() { function approveEmployeeAdvance() { approveProcessing.value = true; - router.post(`/admin/finance/employee-advances/${props.employeeAdvance.id}/approve`, {}, { + router.post(approve.url(props.employeeAdvance.id), {}, { preserveScroll: true, onSuccess: () => { approveConfirmOpen.value = false; @@ -84,7 +85,7 @@ function approveEmployeeAdvance() { function payEmployeeAdvance() { payProcessing.value = true; - router.post(`/admin/finance/employee-advances/${props.employeeAdvance.id}/pay`, {}, { + router.post(pay.url(props.employeeAdvance.id), {}, { preserveScroll: true, onSuccess: () => { payConfirmOpen.value = false; diff --git a/resources/js/pages/admin/finance/expenses/Index.vue b/resources/js/pages/admin/finance/expenses/Index.vue index 6509b6e..d5ee533 100644 --- a/resources/js/pages/admin/finance/expenses/Index.vue +++ b/resources/js/pages/admin/finance/expenses/Index.vue @@ -15,6 +15,8 @@ import { computed, ref, watch } from 'vue'; import ExpenseFormModal from './form/ExpenseFormModal.vue'; import { createColumns } from './table/columns'; +import { index } from '@/routes/admin/finance/expenses'; + const props = defineProps<{ expenses: PaginatedExpenses; filters: { @@ -31,7 +33,7 @@ const editingExpense = ref(null); const { query, setSearch, setSort, resetFilters, syncFromServer } = useDataTableQuery({ - url: '/admin/finance/expenses', + url: index.url(), initial: { ...props.filters }, }); diff --git a/resources/js/pages/admin/finance/expenses/form/ExpenseFormModal.vue b/resources/js/pages/admin/finance/expenses/form/ExpenseFormModal.vue index 0d7a1c2..f4f0e5c 100644 --- a/resources/js/pages/admin/finance/expenses/form/ExpenseFormModal.vue +++ b/resources/js/pages/admin/finance/expenses/form/ExpenseFormModal.vue @@ -29,6 +29,8 @@ import type { ExpenseListItem } from '@/types/expense'; import { appendRootPhotosToFormData, createMediaUploadState } from '@/types/media'; import type { MediaUploadState } from '@/types/media'; +import { store, update } from '@/routes/admin/finance/expenses'; + const open = defineModel('open', { default: false }); const props = defineProps<{ @@ -99,12 +101,12 @@ function submit() { }; if (isEditing.value && props.expense) { - form.transform(() => payload).put(`/admin/finance/expenses/${props.expense.id}`, options); + form.transform(() => payload).put(update.url(props.expense.id), options); return; } - form.transform(() => payload).post('/admin/finance/expenses', options); + form.transform(() => payload).post(store.url(), options); } diff --git a/resources/js/pages/admin/finance/expenses/table/data-table-actions.vue b/resources/js/pages/admin/finance/expenses/table/data-table-actions.vue index 418be15..aa3ae26 100644 --- a/resources/js/pages/admin/finance/expenses/table/data-table-actions.vue +++ b/resources/js/pages/admin/finance/expenses/table/data-table-actions.vue @@ -9,6 +9,8 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip import { useCan } from '@/composables/useCan'; import type { ExpenseListItem } from '@/types/expense'; +import { destroy } from '@/routes/admin/finance/expenses'; + const props = defineProps<{ expense: ExpenseListItem; }>(); @@ -25,7 +27,7 @@ const deleteProcessing = ref(false); function destroyExpense() { deleteProcessing.value = true; - router.delete(`/admin/finance/expenses/${props.expense.id}`, { + router.delete(destroy.url(props.expense.id), { preserveScroll: true, onSuccess: () => { deleteConfirmOpen.value = false; diff --git a/resources/js/pages/admin/finance/payroll/Index.vue b/resources/js/pages/admin/finance/payroll/Index.vue index 9dcb742..7bcfa52 100644 --- a/resources/js/pages/admin/finance/payroll/Index.vue +++ b/resources/js/pages/admin/finance/payroll/Index.vue @@ -27,6 +27,8 @@ import type { PayrollListItem, PayrollPageProps } from '@/types/payroll'; import PayrollAdjustmentModal from './form/PayrollAdjustmentModal.vue'; import { createColumns } from './table/columns'; +import { index } from '@/routes/admin/finance/payroll'; + const props = defineProps(); const { can } = useCan(); @@ -48,7 +50,7 @@ const currentAdjustingPayroll = computed(() => { const { query, setSearch, setSort, setFilter, resetFilters, syncFromServer } = useDataTableQuery({ - url: '/admin/finance/payroll', + url: index.url(), initial: { ...props.filters, period_id: props.filters.period_id diff --git a/resources/js/pages/admin/finance/payroll/form/PayrollAdjustmentModal.vue b/resources/js/pages/admin/finance/payroll/form/PayrollAdjustmentModal.vue index 26c9d19..7e1fa80 100644 --- a/resources/js/pages/admin/finance/payroll/form/PayrollAdjustmentModal.vue +++ b/resources/js/pages/admin/finance/payroll/form/PayrollAdjustmentModal.vue @@ -31,6 +31,7 @@ import { FIELD_LIMITS } from '@/lib/field-limits'; import { formErrors } from '@/lib/form'; import { parseRupiah } from '@/lib/rupiah'; import type { PayrollAdjustmentFormData, PayrollAdjustmentItem, PayrollListItem, SelectOption } from '@/types/payroll'; +import { store, update, destroy } from '@/routes/admin/finance/payroll/adjustments'; const open = defineModel('open', { default: false }); @@ -76,7 +77,7 @@ function cancelEdit() { } function deleteAdj(adjustment: PayrollAdjustmentItem) { - router.delete(`/admin/finance/payroll/adjustments/${adjustment.id}`, { + router.delete(destroy.url(adjustment.id), { preserveScroll: true, onSuccess: () => { toast.success('Penyesuaian berhasil dihapus.'); @@ -98,7 +99,7 @@ function submit() { })); if (editingAdjustment.value) { - payload.put(`/admin/finance/payroll/adjustments/${editingAdjustment.value.id}`, { + payload.put(update.url(editingAdjustment.value.id), { preserveScroll: true, onSuccess: () => { cancelEdit(); @@ -108,7 +109,7 @@ function submit() { }, }); } else { - payload.post(`/admin/finance/payroll/${props.payroll.id}/adjustments`, { + payload.post(store.url(props.payroll.id), { preserveScroll: true, onSuccess: () => { resetForm(); diff --git a/resources/js/pages/admin/hr/attendances/form/AttendanceWebcamModal.vue b/resources/js/pages/admin/hr/attendances/form/AttendanceWebcamModal.vue index 278c26d..457a10a 100644 --- a/resources/js/pages/admin/hr/attendances/form/AttendanceWebcamModal.vue +++ b/resources/js/pages/admin/hr/attendances/form/AttendanceWebcamModal.vue @@ -14,6 +14,7 @@ import { useForm } from '@inertiajs/vue3'; import { Camera, Loader2 } from '@lucide/vue'; import { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'; import { toast } from 'vue-sonner'; +import { check_in, check_out } from '@/routes/admin/hr/attendances'; const open = defineModel('open', { default: false }); @@ -44,8 +45,8 @@ const submitLabel = computed(() => ); const submitUrl = computed(() => props.mode === 'check-in' - ? '/admin/hr/attendances/check-in' - : '/admin/hr/attendances/check-out', + ? check_in.url() + : check_out.url(), ); async function initializeCamera() { diff --git a/resources/js/pages/admin/hr/attendances/table/AttendanceCalendar.vue b/resources/js/pages/admin/hr/attendances/table/AttendanceCalendar.vue index f21ebb8..d0a37f3 100644 --- a/resources/js/pages/admin/hr/attendances/table/AttendanceCalendar.vue +++ b/resources/js/pages/admin/hr/attendances/table/AttendanceCalendar.vue @@ -13,6 +13,7 @@ import { Button } from '@/components/ui/button'; import { DatePicker } from '@/components/ui/date-picker'; import { cn } from '@/lib/utils'; import type { AttendanceListItem, CalendarRange } from '@/types/attendance'; +import { index } from '@/routes/admin/hr/attendances'; const props = defineProps<{ attendances: AttendanceListItem[]; @@ -180,7 +181,7 @@ function handleDatesSet(arg: DatesSetArg) { isNavigating.value = true; - router.get('/admin/hr/attendances', { start, end }, { + router.get(index.url(), { start, end }, { preserveState: true, preserveScroll: true, only: ['attendances', 'calendarRange'], diff --git a/resources/js/pages/admin/hr/attendances/table/AttendanceDetailDialog.vue b/resources/js/pages/admin/hr/attendances/table/AttendanceDetailDialog.vue index e29e2e9..e0f2499 100644 --- a/resources/js/pages/admin/hr/attendances/table/AttendanceDetailDialog.vue +++ b/resources/js/pages/admin/hr/attendances/table/AttendanceDetailDialog.vue @@ -16,6 +16,7 @@ import { } from '@/components/ui/dialog'; import { useCan } from '@/composables/useCan'; import type { AttendanceListItem } from '@/types/attendance'; +import { destroy } from '@/routes/admin/hr/attendances'; const open = defineModel('open', { required: true }); @@ -35,7 +36,7 @@ function destroyAttendance() { deleteProcessing.value = true; - router.delete(`/admin/hr/attendances/${props.attendance.id}`, { + router.delete(destroy.url(props.attendance.id), { preserveScroll: true, onSuccess: () => { deleteConfirmOpen.value = false; diff --git a/resources/js/pages/admin/hr/attendances/table/data-table-actions.vue b/resources/js/pages/admin/hr/attendances/table/data-table-actions.vue index b588246..0a5cd17 100644 --- a/resources/js/pages/admin/hr/attendances/table/data-table-actions.vue +++ b/resources/js/pages/admin/hr/attendances/table/data-table-actions.vue @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useCan } from '@/composables/useCan'; import type { AttendanceListItem } from '@/types/attendance'; +import { destroy } from '@/routes/admin/hr/attendances'; const props = defineProps<{ attendance: AttendanceListItem; @@ -21,7 +22,7 @@ const deleteProcessing = ref(false); function destroyAttendance() { deleteProcessing.value = true; - router.delete(`/admin/hr/attendances/${props.attendance.id}`, { + router.delete(destroy.url(props.attendance.id), { preserveScroll: true, onSuccess: () => { deleteConfirmOpen.value = false; diff --git a/resources/js/pages/admin/hr/employees/Create.vue b/resources/js/pages/admin/hr/employees/Create.vue index e57cda5..95c2149 100644 --- a/resources/js/pages/admin/hr/employees/Create.vue +++ b/resources/js/pages/admin/hr/employees/Create.vue @@ -4,6 +4,7 @@ import AdminLayout from '@/layouts/AdminLayout.vue'; import type { EnumOption } from '@/types/employee'; import { Head } from '@inertiajs/vue3'; import EmployeeForm from './form/EmployeeForm.vue'; +import { index, store } from '@/routes/admin/hr/employees'; defineProps<{ genders: EnumOption[]; @@ -25,11 +26,11 @@ defineProps<{ - + ({

Ubah Pegawai

- + diff --git a/resources/js/pages/admin/hr/employees/form/ResetPasswordDialog.vue b/resources/js/pages/admin/hr/employees/form/ResetPasswordDialog.vue index 8de7420..e87367f 100644 --- a/resources/js/pages/admin/hr/employees/form/ResetPasswordDialog.vue +++ b/resources/js/pages/admin/hr/employees/form/ResetPasswordDialog.vue @@ -14,6 +14,7 @@ import { AlertDialogTrigger, } from '@/components/ui/alert-dialog'; import { Button } from '@/components/ui/button'; +import { reset_password } from '@/routes/admin/hr/employees'; const props = defineProps<{ employeeId: number; @@ -29,7 +30,7 @@ const processing = ref(false); function resetPassword() { processing.value = true; - router.post(`/admin/hr/employees/${props.employeeId}/reset-password`, {}, { + router.post(reset_password.url(props.employeeId), {}, { preserveScroll: true, onSuccess: () => { open.value = false; diff --git a/resources/js/pages/admin/hr/employees/table/data-table-actions.vue b/resources/js/pages/admin/hr/employees/table/data-table-actions.vue index c40b700..10dfb1f 100644 --- a/resources/js/pages/admin/hr/employees/table/data-table-actions.vue +++ b/resources/js/pages/admin/hr/employees/table/data-table-actions.vue @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useCan } from '@/composables/useCan'; import type { EmployeeListItem } from '@/types/employee'; +import { edit, destroy, reset_password } from '@/routes/admin/hr/employees'; const props = defineProps<{ employee: EmployeeListItem; @@ -25,7 +26,7 @@ const resetPasswordProcessing = ref(false); function destroyEmployee() { deleteProcessing.value = true; - router.delete(`/admin/hr/employees/${props.employee.id}`, { + router.delete(destroy.url(props.employee.id), { onSuccess: () => { deleteConfirmOpen.value = false; }, @@ -41,7 +42,7 @@ function destroyEmployee() { function resetPassword() { resetPasswordProcessing.value = true; - router.post(`/admin/hr/employees/${props.employee.id}/reset-password`, {}, { + router.post(reset_password.url(props.employee.id), {}, { preserveScroll: true, onSuccess: () => { resetPasswordConfirmOpen.value = false; @@ -61,7 +62,7 @@ function resetPassword() { - + diff --git a/resources/js/pages/admin/manage/orders/form/CustomerQuickCreateModal.vue b/resources/js/pages/admin/manage/orders/form/CustomerQuickCreateModal.vue index dbc8080..0518614 100644 --- a/resources/js/pages/admin/manage/orders/form/CustomerQuickCreateModal.vue +++ b/resources/js/pages/admin/manage/orders/form/CustomerQuickCreateModal.vue @@ -1,7 +1,4 @@ diff --git a/resources/js/pages/admin/master/categories/table/data-table-actions.vue b/resources/js/pages/admin/master/categories/table/data-table-actions.vue index 25f8e99..a20f2f6 100644 --- a/resources/js/pages/admin/master/categories/table/data-table-actions.vue +++ b/resources/js/pages/admin/master/categories/table/data-table-actions.vue @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useCan } from '@/composables/useCan'; import type { CategoryListItem } from '@/types/category'; +import { destroy } from '@/routes/admin/master/categories'; const props = defineProps<{ category: CategoryListItem; @@ -25,7 +26,7 @@ const deleteProcessing = ref(false); function destroyCategory() { deleteProcessing.value = true; - router.delete(`/admin/master/categories/${props.category.id}`, { + router.delete(destroy.url(props.category.id), { preserveScroll: true, onSuccess: () => { deleteConfirmOpen.value = false; diff --git a/resources/js/pages/admin/master/customers/Index.vue b/resources/js/pages/admin/master/customers/Index.vue index d8b361e..bab0949 100644 --- a/resources/js/pages/admin/master/customers/Index.vue +++ b/resources/js/pages/admin/master/customers/Index.vue @@ -14,6 +14,7 @@ import { Head } from '@inertiajs/vue3'; import { computed, ref, watch } from 'vue'; import CustomerFormModal from './form/CustomerFormModal.vue'; import { createColumns } from './table/columns'; +import { index } from '@/routes/admin/master/customers'; const props = defineProps<{ customers: PaginatedCustomers; @@ -31,7 +32,7 @@ const editingCustomer = ref(null); const { query, setSearch, setSort, resetFilters, syncFromServer } = useDataTableQuery({ - url: '/admin/master/customers', + url: index.url(), initial: { ...props.filters }, }); diff --git a/resources/js/pages/admin/master/customers/form/CustomerFormModal.vue b/resources/js/pages/admin/master/customers/form/CustomerFormModal.vue index 6f87b8b..d4785f3 100644 --- a/resources/js/pages/admin/master/customers/form/CustomerFormModal.vue +++ b/resources/js/pages/admin/master/customers/form/CustomerFormModal.vue @@ -25,6 +25,7 @@ import { useFormDialog } from '@/composables/useFormDialog'; import { FIELD_LIMITS } from '@/lib/field-limits'; import { formErrors } from '@/lib/form'; import type { CustomerFormData, CustomerListItem } from '@/types/customer'; +import { store, update } from '@/routes/admin/master/customers'; const open = defineModel('open', { default: false }); @@ -76,12 +77,12 @@ function submit() { }; if (isEditing.value && props.customer) { - form.put(`/admin/master/customers/${props.customer.id}`, options); + form.put(update.url(props.customer.id), options); return; } - form.post('/admin/master/customers', options); + form.post(store.url(), options); } diff --git a/resources/js/pages/admin/master/customers/table/data-table-actions.vue b/resources/js/pages/admin/master/customers/table/data-table-actions.vue index 05f45b5..c227356 100644 --- a/resources/js/pages/admin/master/customers/table/data-table-actions.vue +++ b/resources/js/pages/admin/master/customers/table/data-table-actions.vue @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useCan } from '@/composables/useCan'; import type { CustomerListItem } from '@/types/customer'; +import { destroy } from '@/routes/admin/master/customers'; const props = defineProps<{ customer: CustomerListItem; @@ -25,7 +26,7 @@ const deleteProcessing = ref(false); function destroyCustomer() { deleteProcessing.value = true; - router.delete(`/admin/master/customers/${props.customer.id}`, { + router.delete(destroy.url(props.customer.id), { preserveScroll: true, onSuccess: () => { deleteConfirmOpen.value = false; diff --git a/resources/js/pages/admin/master/products/Create.vue b/resources/js/pages/admin/master/products/Create.vue index 01c8a9d..6d1a1b3 100644 --- a/resources/js/pages/admin/master/products/Create.vue +++ b/resources/js/pages/admin/master/products/Create.vue @@ -4,6 +4,7 @@ import AdminLayout from '@/layouts/AdminLayout.vue'; import type { CategoryOption } from '@/types/product'; import { Head } from '@inertiajs/vue3'; import ProductForm from './form/ProductForm.vue'; +import { index, store } from '@/routes/admin/master/products'; defineProps<{ categories: CategoryOption[]; @@ -21,11 +22,11 @@ defineProps<{

Tambah Produk

- + ({

Ubah Produk

- + diff --git a/resources/js/pages/admin/master/products/table/data-table-actions.vue b/resources/js/pages/admin/master/products/table/data-table-actions.vue index dbfc920..60d9ba0 100644 --- a/resources/js/pages/admin/master/products/table/data-table-actions.vue +++ b/resources/js/pages/admin/master/products/table/data-table-actions.vue @@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { useCan } from '@/composables/useCan'; import type { ProductListItem } from '@/types/product'; +import { edit, destroy } from '@/routes/admin/master/products'; const props = defineProps<{ product: ProductListItem; @@ -21,7 +22,7 @@ const deleteProcessing = ref(false); function destroyProduct() { deleteProcessing.value = true; - router.delete(`/admin/master/products/${props.product.id}`, { + router.delete(destroy.url(props.product.id), { onSuccess: () => { deleteConfirmOpen.value = false; }, @@ -40,7 +41,7 @@ function destroyProduct() {