// app/routes/dashboard.pencatatan.tsx import { json, type LoaderFunctionArgs, type ActionFunctionArgs } from "@remix-run/node"; import { Form, useLoaderData, useNavigation, useFetcher } from "@remix-run/react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Textarea } from "~/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/components/ui/select"; import { Badge } from "~/components/ui/badge"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "~/components/ui/table"; import { Separator } from "~/components/ui/separator"; import { Plus, Search, Filter, Download, Eye, Edit, Trash2, Receipt, Users, Scale, Calendar, MapPin } from "lucide-react"; import { useState } from "react"; // Loader untuk mengambil data export async function loader({ request }: LoaderFunctionArgs) { // Simulasi data - ganti dengan query database Anda const wasteRecords = [ { id: "WR-001", date: "2024-07-10", collectorName: "Budi Santoso", collectorPhone: "+62 812 3456 7890", wasteType: "Plastik PET", weight: 150.5, pricePerKg: 3500, totalPrice: 526750, location: "Kelurahan Kebayoran", status: "completed", notes: "Kondisi baik, sudah dipilah" }, { id: "WR-002", date: "2024-07-09", collectorName: "Siti Rahayu", collectorPhone: "+62 813 9876 5432", wasteType: "Kardus", weight: 200.0, pricePerKg: 2800, totalPrice: 560000, location: "Kelurahan Menteng", status: "pending", notes: "Perlu pengecekan kualitas" }, { id: "WR-003", date: "2024-07-08", collectorName: "Ahmad Wijaya", collectorPhone: "+62 814 1122 3344", wasteType: "Kaleng Aluminium", weight: 75.2, pricePerKg: 8500, totalPrice: 639200, location: "Kelurahan Cempaka Putih", status: "completed", notes: "Kualitas premium" } ]; const wasteTypes = [ "Plastik PET", "Kardus", "Kaleng Aluminium", "Kertas", "Plastik HDPE", "Besi/Logam", "Kaca" ]; const collectors = [ { name: "Budi Santoso", phone: "+62 812 3456 7890" }, { name: "Siti Rahayu", phone: "+62 813 9876 5432" }, { name: "Ahmad Wijaya", phone: "+62 814 1122 3344" } ]; return json({ wasteRecords, wasteTypes, collectors }); } // Action untuk handle form submission export async function action({ request }: ActionFunctionArgs) { const formData = await request.formData(); const intent = formData.get("intent"); if (intent === "createRecord") { const recordData = { collectorName: formData.get("collectorName"), collectorPhone: formData.get("collectorPhone"), wasteType: formData.get("wasteType"), weight: parseFloat(formData.get("weight") as string), pricePerKg: parseFloat(formData.get("pricePerKg") as string), location: formData.get("location"), notes: formData.get("notes") }; // Simulasi create - ganti dengan insert database Anda console.log("Creating waste record:", recordData); return json({ success: true, message: "Pencatatan sampah berhasil disimpan" }); } return json({ success: false, message: "Invalid action" }); } export default function WasteRecordingPage() { const { wasteRecords, wasteTypes, collectors } = useLoaderData(); const navigation = useNavigation(); const [searchTerm, setSearchTerm] = useState(""); const [selectedType, setSelectedType] = useState("all"); const [selectedStatus, setSelectedStatus] = useState("all"); const isSubmitting = navigation.state === "submitting"; // Filter records const filteredRecords = wasteRecords.filter(record => { const matchesSearch = record.collectorName.toLowerCase().includes(searchTerm.toLowerCase()) || record.wasteType.toLowerCase().includes(searchTerm.toLowerCase()) || record.id.toLowerCase().includes(searchTerm.toLowerCase()); const matchesType = selectedType === "all" || record.wasteType === selectedType; const matchesStatus = selectedStatus === "all" || record.status === selectedStatus; return matchesSearch && matchesType && matchesStatus; }); const formatCurrency = (amount: number) => { return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(amount); }; const getStatusBadge = (status: string) => { switch (status) { case "completed": return Selesai; case "pending": return Pending; default: return {status}; } }; return (

Pencatatan Sampah

Catat pembelian sampah dari pengepul dan kelola transaksi

{/* Left Column - Form Input */}
Tambah Pencatatan
Input data pembelian sampah baru