From 51d05653c69bf5e7de3cd76bb343f69b02f18661 Mon Sep 17 00:00:00 2001 From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:14:02 +0700 Subject: [PATCH] style: apply consistent code formatting across project files --- src/app/(app)/balances/page.tsx | 162 ++- src/app/(app)/layout.tsx | 8 +- src/app/(app)/my-orders/page.tsx | 973 ++++++++++-------- src/app/(app)/my-purchases/page.tsx | 761 ++++++++------ .../(app)/order/[id]/PublicOrderActions.tsx | 12 +- src/app/(app)/order/[id]/page.tsx | 161 +-- src/app/(app)/page.tsx | 66 +- src/app/(app)/profile/page.tsx | 257 +++-- src/app/(app)/reports/page.tsx | 179 ++-- src/app/(app)/settings/integrations/page.tsx | 107 +- src/app/(app)/settings/layout.tsx | 18 +- src/app/(app)/settings/users/page.tsx | 400 ++++--- src/app/(auth)/layout.tsx | 6 +- src/app/(auth)/login/page.tsx | 110 +- src/app/(auth)/register/page.tsx | 129 ++- src/app/actions.ts | 434 ++++---- src/app/globals.css | 142 ++- src/app/icon.tsx | 58 +- src/app/layout.tsx | 62 +- src/app/not-found.tsx | 39 +- src/components/AppLayout.tsx | 8 +- src/components/Header.tsx | 57 +- src/components/Navbar.tsx | 44 +- src/components/OrderCard.tsx | 103 +- src/components/OrderFormModal.tsx | 245 +++-- src/components/ReportByPersonGrid.tsx | 319 ++++-- src/components/ReportCharts.tsx | 84 +- src/components/ReportDataGrid.tsx | 291 ++++-- src/components/ShareButton.tsx | 77 +- src/components/Sidebar.tsx | 178 ++-- src/components/SummaryGenerator.tsx | 60 +- src/components/ui/badge.tsx | 37 +- src/components/ui/button.tsx | 40 +- src/components/ui/calendar.tsx | 134 +-- src/components/ui/card.tsx | 51 +- src/components/ui/checkbox.tsx | 13 +- src/components/ui/dialog.tsx | 56 +- src/components/ui/input.tsx | 10 +- src/components/ui/label.tsx | 10 +- src/components/ui/popover.tsx | 41 +- src/components/ui/select.tsx | 67 +- src/components/ui/sonner.tsx | 59 +- src/components/ui/table.tsx | 69 +- src/components/ui/textarea.tsx | 8 +- src/lib/auth.ts | 5 +- src/lib/prisma.ts | 4 +- src/lib/utils.ts | 4 +- src/middleware.ts | 2 +- 48 files changed, 3585 insertions(+), 2575 deletions(-) diff --git a/src/app/(app)/balances/page.tsx b/src/app/(app)/balances/page.tsx index 08f082f..6119ce7 100644 --- a/src/app/(app)/balances/page.tsx +++ b/src/app/(app)/balances/page.tsx @@ -28,7 +28,7 @@ export default function BalancesPage() { setLoading(true) const [subRes, creRes] = await Promise.all([ getBalancesAsSubmittor(id), - getBalancesAsCreator(id) + getBalancesAsCreator(id), ]) setSubmittorBalances(subRes) setCreatorBalances(creRes) @@ -36,29 +36,33 @@ export default function BalancesPage() { } const formatRupiah = (n: number) => - new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', maximumFractionDigits: 0 }).format(n) + new Intl.NumberFormat('id-ID', { + style: 'currency', + currency: 'IDR', + maximumFractionDigits: 0, + }).format(n) return ( -
+
Keuangan / Saldo -

- +

+ Buku Saldo

-

+

Pantau riwayat saldo lebih atau kurang dari transaksi pesanan.

-
+
{loading ? ( -
- - Memuat saldo... +
+ + Memuat saldo...
) : activeTab === 'SUBMITTOR' ? (
-
-

Saldo Anda di Kreator Lain

-

- Jika saldo positif (hijau), Anda memiliki deposit yang bisa digunakan untuk pesanan berikutnya di kreator tersebut. Jika negatif (merah), Anda berhutang. +

+

+ Saldo Anda di Kreator Lain +

+

+ Jika saldo positif (hijau), Anda memiliki deposit yang bisa digunakan + untuk pesanan berikutnya di kreator tersebut. Jika negatif (merah), + Anda berhutang.

{submittorBalances.length === 0 ? ( -
-

Belum ada catatan saldo.

+
+

Belum ada catatan saldo.

) : ( -
+
{submittorBalances.map((b, i) => ( - -
+ +
{b.creator.photo ? ( - {b.creator.name} + {b.creator.name} ) : ( -
+
{b.creator.name.charAt(0).toUpperCase()}
)}
-

{b.creator.name}

-

Kreator

+

+ {b.creator.name} +

+

+ Kreator +

- +
- Total Saldo -
0 ? "text-emerald-600" : "text-rose-600")}> - {b.amount > 0 ? : } + + Total Saldo + +
0 ? 'text-emerald-600' : 'text-rose-600' + )} + > + {b.amount > 0 ? ( + + ) : ( + + )} {formatRupiah(b.amount)}
@@ -127,40 +157,68 @@ export default function BalancesPage() {
) : (
-
-

Saldo Orang Lain di Anda

-

- Jika saldo positif (merah bagi Anda), artinya Anda memegang uang lebih milik penitip (Hutang Anda ke mereka). Jika negatif (hijau), mereka berhutang ke Anda. +

+

+ Saldo Orang Lain di Anda +

+

+ Jika saldo positif (merah bagi Anda), artinya Anda memegang uang + lebih milik penitip (Hutang Anda ke mereka). Jika negatif (hijau), + mereka berhutang ke Anda.

{creatorBalances.length === 0 ? ( -
-

Belum ada penitip yang memiliki catatan saldo dengan Anda.

+
+

+ Belum ada penitip yang memiliki catatan saldo dengan Anda. +

) : ( -
+
{creatorBalances.map((b, i) => ( - -
+ +
{b.user.photo ? ( - {b.user.name} + {b.user.name} ) : ( -
+
{b.user.name.charAt(0).toUpperCase()}
)}
-

{b.user.name}

-

Penitip

+

+ {b.user.name} +

+

+ Penitip +

- +
- Saldo Penitip + + Saldo Penitip + {/* From Creator perspective: positive balance of submittor is bad for creator (creator holds their money) */} -
0 ? "text-rose-600" : "text-emerald-600")}> - {b.amount > 0 ? : } +
0 ? 'text-rose-600' : 'text-emerald-600' + )} + > + {b.amount > 0 ? ( + + ) : ( + + )} {formatRupiah(b.amount)}
diff --git a/src/app/(app)/layout.tsx b/src/app/(app)/layout.tsx index 9866903..90beb3a 100644 --- a/src/app/(app)/layout.tsx +++ b/src/app/(app)/layout.tsx @@ -1,9 +1,5 @@ -import { AppLayout } from "@/components/AppLayout"; +import { AppLayout } from '@/components/AppLayout' export default function Layout({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ); + return {children} } diff --git a/src/app/(app)/my-orders/page.tsx b/src/app/(app)/my-orders/page.tsx index 136ddca..8696d13 100644 --- a/src/app/(app)/my-orders/page.tsx +++ b/src/app/(app)/my-orders/page.tsx @@ -1,13 +1,34 @@ 'use client' import { useEffect, useState } from 'react' -import { getMyOrders, createOrder, updateOrder, duplicateOrder, updateOrderStatus, deleteOrder, getSessionUser } from '@/app/actions' +import { + getMyOrders, + createOrder, + updateOrder, + duplicateOrder, + updateOrderStatus, + deleteOrder, + getSessionUser, +} from '@/app/actions' import { Button, buttonVariants } from '@/components/ui/button' import { cn } from '@/lib/utils' -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card' +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { ShareButton } from '@/components/ShareButton' -import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog' import { Textarea } from '@/components/ui/textarea' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' @@ -15,22 +36,22 @@ import { Checkbox } from '@/components/ui/checkbox' import { format, isToday } from 'date-fns' import { id as idLocale } from 'date-fns/locale' import Link from 'next/link' -import { - PlusCircle, - MinusCircle, - Copy, - FileText, - Loader2, - Plus, - Users, - Sparkles, +import { + PlusCircle, + MinusCircle, + Copy, + FileText, + Loader2, + Plus, + Users, + Sparkles, Layers, Pencil, Lock, Trash2, AlertTriangle, ChevronLeft, - ChevronRight + ChevronRight, } from 'lucide-react' export default function MyOrdersPage() { @@ -51,9 +72,9 @@ export default function MyOrdersPage() { const init = async () => { const user = await getSessionUser() if (user?.id) { - setUserId(user.id) - loadOrders(user.id) - } + setUserId(user.id) + loadOrders(user.id) + } } init() }, []) @@ -72,8 +93,6 @@ export default function MyOrdersPage() { } } - - const handleDelete = async () => { if (!orderToDelete) return setDeleting(true) @@ -86,29 +105,29 @@ export default function MyOrdersPage() { } const getStatusBadge = (status: string) => { - switch(status) { - case 'OPEN': + switch (status) { + case 'OPEN': return ( - + ● OPEN ) - case 'CLOSE': + case 'CLOSE': return ( - + ● CLOSE ) - default: + default: return ( - + ● DRAFT ) } } - const filteredOrders = orders.filter(o => { + const filteredOrders = orders.filter((o) => { const matchTab = activeTab === 'ALL' ? true : o.status === activeTab const matchSearch = o.title.toLowerCase().includes(searchQuery.toLowerCase()) return matchTab && matchSearch @@ -126,34 +145,34 @@ export default function MyOrdersPage() { if (loading) { return ( -
- - Memuat data PO Anda... +
+ + Memuat data PO Anda...
) } return ( -
+
{/* Top Controls & Segmented Control */} -
-
+
+
{/* Segmented Control / Tabs */} -
+
{(['ALL', 'OPEN', 'DRAFT', 'CLOSE'] as const).map((tab) => ( ))} @@ -161,35 +180,46 @@ export default function MyOrdersPage() { {/* Search Input */}
-
- - +
+ +
- setSearchQuery(e.target.value)} - className="pl-9 h-10 w-full rounded-xl border-slate-200 dark:border-slate-800 bg-slate-50 dark:bg-slate-900 focus-visible:ring-[#1B2CC1] text-sm" + className="h-10 w-full rounded-xl border-slate-200 bg-slate-50 pl-9 text-sm focus-visible:ring-[#1B2CC1] dark:border-slate-800 dark:bg-slate-900" />
{/* Action Button */} - - Buka Jasa PO Baru + + Buka Jasa PO Baru - { setIsCreateOpen(false) if (userId) loadOrders(userId) - }} + }} />
@@ -210,14 +240,17 @@ export default function MyOrdersPage() { {/* Duplicate Order Modal */} {orderToDuplicate && ( - !open && setOrderToDuplicate(null)}> - !open && setOrderToDuplicate(null)} + > + { setOrderToDuplicate(null) if (userId) loadOrders(userId) - }} + }} /> )} @@ -225,31 +258,38 @@ export default function MyOrdersPage() { {/* Delete Confirmation Modal */} {orderToDelete && ( !open && setOrderToDelete(null)}> - -
-
- + +
+
+
Hapus Jasa PO Ini? -

+

Tindakan ini permanen dan tidak dapat dibatalkan.

-
-
-

{orderToDelete.title}

-

- Status: {orderToDelete.status} • {orderToDelete.submissions?.length || 0} titipan pemesan +

+
+

+ {orderToDelete.title} +

+

+ Status:{' '} + + {orderToDelete.status} + {' '} + • {orderToDelete.submissions?.length || 0} titipan pemesan

-

- Seluruh data pesanan dan daftar menu yang ada di dalam PO ini akan dihapus dari sistem. +

+ Seluruh data pesanan dan daftar menu yang ada di dalam PO ini akan dihapus dari + sistem.

@@ -258,7 +298,7 @@ export default function MyOrdersPage() { variant="outline" onClick={() => setOrderToDelete(null)} disabled={deleting} - className="w-1/2 h-10 rounded-xl font-bold text-xs" + className="h-10 w-1/2 rounded-xl text-xs font-bold" > Batal @@ -266,9 +306,13 @@ export default function MyOrdersPage() { type="button" onClick={handleDelete} disabled={deleting} - className="w-1/2 h-10 rounded-xl bg-red-600 hover:bg-red-700 text-white font-bold text-xs shadow-md shadow-red-600/20 gap-1.5" + className="h-10 w-1/2 gap-1.5 rounded-xl bg-red-600 text-xs font-bold text-white shadow-md shadow-red-600/20 hover:bg-red-700" > - {deleting ? : } + {deleting ? ( + + ) : ( + + )} {deleting ? 'Menghapus...' : 'Ya, Hapus PO'}
@@ -279,246 +323,280 @@ export default function MyOrdersPage() { {/* Order List */} {filteredOrders.length === 0 ? ( -
-
- +
+
+
-

+

{activeTab === 'ALL' ? 'Belum Ada Jasa PO' : `Tidak Ada PO Berstatus ${activeTab}`}

-

+

Mulai buka jasa titip pesanan makanan atau kebutuhan untuk teman kantor.

-
) : ( -
-
+
+
{paginatedOrders.map((order) => { - const date = new Date(order.date) - const isClosed = order.status === 'CLOSE' - const isDraft = order.status === 'DRAFT' - const canDelete = isDraft || isClosed - - return ( -
- {/* Left: Info */} -
-
-
-

- {order.title} -

- {order.description && ( -

- {order.description} -

- )} -
-
- - {format(date, 'EEEE, dd MMM yyyy', { locale: idLocale })} - - {getStatusBadge(order.status)} -
-
+ const date = new Date(order.date) + const isClosed = order.status === 'CLOSE' + const isDraft = order.status === 'DRAFT' + const canDelete = isDraft || isClosed -
-
- - - {order.submissions.length} Orang Menitip - - {isClosed && order.submissions.length > 0 && ( -
- - Lunas: {order.submissions.filter((s: any) => s.payment_status === 'LUNAS').length} - - - Belum: {order.submissions.filter((s: any) => s.payment_status !== 'LUNAS').length} - -
- )} -
- -
- -
- {order.available_items.length > 0 && ( - - {order.available_items.length} Menu Pilihan + return ( +
+ {/* Left: Info */} +
+
+
+

+ {order.title} +

+ {order.description && ( +

+ {order.description} +

+ )} +
+
+ + {format(date, 'EEEE, dd MMM yyyy', { locale: idLocale })} - )} - {order.allow_custom && ( -
- Custom Item Aktif -
- )} + {getStatusBadge(order.status)} +
-
-
- {/* Right: Actions */} -
-
- {/* Detail Link */} - - - Detail - +
+
+ + + {order.submissions.length} Orang Menitip + + {isClosed && order.submissions.length > 0 && ( +
+ + Lunas:{' '} + { + order.submissions.filter((s: any) => s.payment_status === 'LUNAS') + .length + } + + + Belum:{' '} + { + order.submissions.filter((s: any) => s.payment_status !== 'LUNAS') + .length + } + +
+ )} +
- {/* Status Action Button */} -
- {order.status === 'DRAFT' && ( - - )} - {order.status === 'OPEN' && ( - - )} - {order.status === 'CLOSE' && ( - - )} +
+ +
+ {order.available_items.length > 0 && ( + + {order.available_items.length} Menu Pilihan + + )} + {order.allow_custom && ( +
+ Custom Item Aktif +
+ )} +
- {/* Utility Tools Row */} -
- + {/* Right: Actions */} +
+
+ {/* Detail Link */} + + + Detail + - + {/* Status Action Button */} +
+ {order.status === 'DRAFT' && ( + + )} + {order.status === 'OPEN' && ( + + )} + {order.status === 'CLOSE' && ( + + )} +
+
- - - {order.status === 'OPEN' && ( - + + + + + + + {order.status === 'OPEN' && ( + + )} +
-
- ) - })} + ) + })}
- + {/* Pagination Controls */} {totalPages > 1 && ( -
- - Menampilkan {(currentPage - 1) * ITEMS_PER_PAGE + 1} hingga {Math.min(currentPage * ITEMS_PER_PAGE, filteredOrders.length)} dari {filteredOrders.length} PO +
+ + Menampilkan{' '} + + {(currentPage - 1) * ITEMS_PER_PAGE + 1} + {' '} + hingga{' '} + + {Math.min(currentPage * ITEMS_PER_PAGE, filteredOrders.length)} + {' '} + dari{' '} + + {filteredOrders.length} + {' '} + PO - +
- +
- {Array.from({ length: totalPages }, (_, i) => i + 1).map(page => ( + {Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => (
@@ -544,42 +622,59 @@ export default function MyOrdersPage() { ) } -function CreateOrderModal({ userId, onSuccess, initialData }: { userId: string, onSuccess: () => void, initialData?: any }) { +function CreateOrderModal({ + userId, + onSuccess, + initialData, +}: { + userId: string + onSuccess: () => void + initialData?: any +}) { const [title, setTitle] = useState(initialData ? `${initialData.title} (Copy)` : '') - const [description, setDescription] = useState(initialData ? (initialData.description || '') : '') + const [description, setDescription] = useState(initialData ? initialData.description || '' : '') const [allowCustom, setAllowCustom] = useState(initialData ? initialData.allow_custom : false) const [items, setItems] = useState<{ id: string; name: string }[]>( initialData && initialData.available_items?.length > 0 - ? initialData.available_items.map((ai: any) => ({ id: Math.random().toString(), name: ai.name })) + ? initialData.available_items.map((ai: any) => ({ + id: Math.random().toString(), + name: ai.name, + })) : [{ id: '1', name: '' }] ) const [loading, setLoading] = useState(false) const [error, setError] = useState('') const addItem = () => setItems([...items, { id: Math.random().toString(), name: '' }]) - const removeItem = (id: string) => setItems(items.filter((i: { id: string; name: string }) => i.id !== id)) - const updateItem = (id: string, name: string) => setItems(items.map((i: { id: string; name: string }) => i.id === id ? { ...i, name } : i)) + const removeItem = (id: string) => + setItems(items.filter((i: { id: string; name: string }) => i.id !== id)) + const updateItem = (id: string, name: string) => + setItems(items.map((i: { id: string; name: string }) => (i.id === id ? { ...i, name } : i))) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError('') - + if (!title.trim()) return setError('Judul PO wajib diisi.') - - const validItems = items.filter((i: { id: string; name: string }) => i.name.trim()).map((i: { id: string; name: string }) => i.name.trim()) + + const validItems = items + .filter((i: { id: string; name: string }) => i.name.trim()) + .map((i: { id: string; name: string }) => i.name.trim()) if (!allowCustom && validItems.length === 0) { - return setError('Wajib menambahkan minimal 1 menu pilihan jika tidak mengizinkan custom item.') + return setError( + 'Wajib menambahkan minimal 1 menu pilihan jika tidak mengizinkan custom item.' + ) } setLoading(true) - + const res = await createOrder({ creator_id: userId, title: title.trim(), description: description.trim(), date: new Date(), allow_custom: allowCustom, - available_items: validItems + available_items: validItems, }) if (res.success) { @@ -591,57 +686,71 @@ function CreateOrderModal({ userId, onSuccess, initialData }: { userId: string, } return ( -
- Form Buka PO - + + Form Buka PO + + Buka Jasa Titip Baru -

+

Tentukan nama pesanan dan daftar menu yang bisa dipesan teman kantor.

-
+
-
- +
-