Fix table responsiveness in admin pages

AdminProducts.tsx:
- Wrap table in overflow-x-auto div for horizontal scrolling
- Add whitespace-nowrap to TableHead cells
- Change form grid from grid-cols-2 to grid-cols-1 md:grid-cols-2

AdminOrders.tsx:
- Wrap table in overflow-x-auto div for horizontal scrolling
- Add whitespace-nowrap to TableHead cells
- Change detail dialog grid from grid-cols-2 to grid-cols-1 sm:grid-cols-2
- Change action buttons from flex to flex-col sm:flex-row for mobile stacking

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
dwindown
2025-12-25 08:50:17 +07:00
parent c653a174f4
commit ad95a15310
2 changed files with 90 additions and 86 deletions

View File

@@ -178,16 +178,17 @@ export default function AdminOrders() {
<Card className="border-2 border-border"> <Card className="border-2 border-border">
<CardContent className="p-0"> <CardContent className="p-0">
<div className="overflow-x-auto">
<Table> <Table>
<TableHeader> <TableHeader>
<TableRow> <TableRow>
<TableHead>ID Order</TableHead> <TableHead className="whitespace-nowrap">ID Order</TableHead>
<TableHead>Email</TableHead> <TableHead className="whitespace-nowrap">Email</TableHead>
<TableHead>Total</TableHead> <TableHead className="whitespace-nowrap">Total</TableHead>
<TableHead>Metode</TableHead> <TableHead className="whitespace-nowrap">Metode</TableHead>
<TableHead>Status</TableHead> <TableHead className="whitespace-nowrap">Status</TableHead>
<TableHead>Tanggal</TableHead> <TableHead className="whitespace-nowrap">Tanggal</TableHead>
<TableHead className="text-right">Aksi</TableHead> <TableHead className="text-right whitespace-nowrap">Aksi</TableHead>
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
@@ -215,6 +216,7 @@ export default function AdminOrders() {
)} )}
</TableBody> </TableBody>
</Table> </Table>
</div>
</CardContent> </CardContent>
</Card> </Card>
@@ -225,7 +227,7 @@ export default function AdminOrders() {
</DialogHeader> </DialogHeader>
{selectedOrder && ( {selectedOrder && (
<div className="space-y-4"> <div className="space-y-4">
<div className="grid grid-cols-2 gap-2 text-sm"> <div className="grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm">
<div> <div>
<span className="text-muted-foreground">ID:</span> {selectedOrder.id.slice(0, 8)} <span className="text-muted-foreground">ID:</span> {selectedOrder.id.slice(0, 8)}
</div> </div>
@@ -302,7 +304,7 @@ export default function AdminOrders() {
</div> </div>
)} )}
<div className="flex gap-2 pt-4"> <div className="flex flex-col sm:flex-row gap-2 pt-4">
{selectedOrder.payment_status !== "paid" && ( {selectedOrder.payment_status !== "paid" && (
<Button onClick={() => updateOrderStatus(selectedOrder.id, "paid")} className="flex-1"> <Button onClick={() => updateOrderStatus(selectedOrder.id, "paid")} className="flex-1">
<CheckCircle className="w-4 h-4 mr-2" /> <CheckCircle className="w-4 h-4 mr-2" />

View File

@@ -164,14 +164,15 @@ export default function AdminProducts() {
<Card className="border-2 border-border"> <Card className="border-2 border-border">
<CardContent className="p-0"> <CardContent className="p-0">
<div className="overflow-x-auto">
<Table> <Table>
<TableHeader> <TableHeader>
<TableRow> <TableRow>
<TableHead>Judul</TableHead> <TableHead className="whitespace-nowrap">Judul</TableHead>
<TableHead>Tipe</TableHead> <TableHead className="whitespace-nowrap">Tipe</TableHead>
<TableHead>Harga</TableHead> <TableHead className="whitespace-nowrap">Harga</TableHead>
<TableHead>Status</TableHead> <TableHead className="whitespace-nowrap">Status</TableHead>
<TableHead className="text-right">Aksi</TableHead> <TableHead className="text-right whitespace-nowrap">Aksi</TableHead>
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
@@ -213,6 +214,7 @@ export default function AdminProducts() {
)} )}
</TableBody> </TableBody>
</Table> </Table>
</div>
</CardContent> </CardContent>
</Card> </Card>
@@ -227,7 +229,7 @@ export default function AdminProducts() {
{editingProduct && form.type === 'bootcamp' && <TabsTrigger value="curriculum">Kurikulum</TabsTrigger>} {editingProduct && form.type === 'bootcamp' && <TabsTrigger value="curriculum">Kurikulum</TabsTrigger>}
</TabsList> </TabsList>
<TabsContent value="details" className="space-y-4 py-4"> <TabsContent value="details" className="space-y-4 py-4">
<div className="grid grid-cols-2 gap-4"> <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-2"> <div className="space-y-2">
<Label>Judul *</Label> <Label>Judul *</Label>
<Input value={form.title} onChange={(e) => setForm({ ...form, title: e.target.value, slug: generateSlug(e.target.value) })} className="border-2" /> <Input value={form.title} onChange={(e) => setForm({ ...form, title: e.target.value, slug: generateSlug(e.target.value) })} className="border-2" />
@@ -255,7 +257,7 @@ export default function AdminProducts() {
<Label>Konten</Label> <Label>Konten</Label>
<RichTextEditor content={form.content} onChange={(v) => setForm({ ...form, content: v })} /> <RichTextEditor content={form.content} onChange={(v) => setForm({ ...form, content: v })} />
</div> </div>
<div className="grid grid-cols-2 gap-4"> <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-2"> <div className="space-y-2">
<Label>Meeting Link</Label> <Label>Meeting Link</Label>
<Input value={form.meeting_link} onChange={(e) => setForm({ ...form, meeting_link: e.target.value })} placeholder="https://meet.google.com/..." className="border-2" /> <Input value={form.meeting_link} onChange={(e) => setForm({ ...form, meeting_link: e.target.value })} placeholder="https://meet.google.com/..." className="border-2" />