diff --git a/src/components/StatusBadge.js b/src/components/StatusBadge.js index 89ce768..f021d8c 100644 --- a/src/components/StatusBadge.js +++ b/src/components/StatusBadge.js @@ -6,7 +6,6 @@ const STATUS_BADGE_CONFIG = { //status-based badges pending_email: { label: 'Pending Email', variant: 'orange2' }, pending_validation: { label: 'Pending Validation', variant: 'gray' }, - pre_validated: { label: 'Pre-Validated', variant: 'green' }, payment_pending: { label: 'Payment Pending', variant: 'orange' }, active: { label: 'Active', variant: 'green' }, inactive: { label: 'Inactive', variant: 'gray2' }, @@ -23,7 +22,12 @@ const STATUS_BADGE_CONFIG = { admin: { label: 'Admin', variant: 'purple' }, moderator: { label: 'Moderator', variant: 'bg-[var(--neutral-800)] text-[var(--purple-ink)]' }, staff: { label: 'Staff', variant: 'gray' }, - media: { label: 'Media', variant: 'gray2' } + media: { label: 'Media', variant: 'gray2' }, + + //donation badges + pending: { label: 'Payment Pending', variant: 'orange' }, + completed: { label: 'Completed', variant: 'green' }, + failed: { label: 'Failed', className: 'bg-red-100 text-red-700' } }; //todo: make shield icon dynamic based on status diff --git a/src/components/ui/table.jsx b/src/components/ui/table.jsx index 07443a1..07164fb 100644 --- a/src/components/ui/table.jsx +++ b/src/components/ui/table.jsx @@ -1,78 +1,91 @@ -import * as React from "react" +import * as React from "react"; -import { cn } from "@/lib/utils" +import { cn } from "@/lib/utils"; const Table = React.forwardRef(({ className, ...props }, ref) => (
- +
-)) -Table.displayName = "Table" +)); +Table.displayName = "Table"; const TableHeader = React.forwardRef(({ className, ...props }, ref) => ( - -)) -TableHeader.displayName = "TableHeader" + +)); +TableHeader.displayName = "TableHeader"; const TableBody = React.forwardRef(({ className, ...props }, ref) => ( -)) -TableBody.displayName = "TableBody" + {...props} + /> +)); +TableBody.displayName = "TableBody"; const TableFooter = React.forwardRef(({ className, ...props }, ref) => ( tr]:last:border-b-0", className)} - {...props} /> -)) -TableFooter.displayName = "TableFooter" + className={cn( + "border-t border-[var(--neutral-800)] font-medium [&>tr]:last:border-b-0", + className, + )} + {...props} + /> +)); +TableFooter.displayName = "TableFooter"; const TableRow = React.forwardRef(({ className, ...props }, ref) => ( -)) -TableRow.displayName = "TableRow" + {...props} + /> +)); +TableRow.displayName = "TableRow"; const TableHead = React.forwardRef(({ className, ...props }, ref) => (
[role=checkbox]]:translate-y-[2px]", - className + "p-4 text-left align-middle font-semibold text-[var(--purple-ink)] [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", + className, )} - {...props} /> -)) -TableHead.displayName = "TableHead" + {...props} + /> +)); +TableHead.displayName = "TableHead"; const TableCell = React.forwardRef(({ className, ...props }, ref) => ( [role=checkbox]]:translate-y-[2px]", - className + "p-4 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px] ", + className, )} - {...props} /> -)) -TableCell.displayName = "TableCell" + {...props} + /> +)); +TableCell.displayName = "TableCell"; const TableCaption = React.forwardRef(({ className, ...props }, ref) => (
-)) -TableCaption.displayName = "TableCaption" + {...props} + /> +)); +TableCaption.displayName = "TableCaption"; export { Table, @@ -83,4 +96,4 @@ export { TableRow, TableCell, TableCaption, -} +}; diff --git a/src/pages/admin/AdminDonations.js b/src/pages/admin/AdminDonations.js index 4e53094..beb4da5 100644 --- a/src/pages/admin/AdminDonations.js +++ b/src/pages/admin/AdminDonations.js @@ -3,6 +3,7 @@ import { useAuth } from '../../context/AuthContext'; import { Card } from '../../components/ui/card'; import { Button } from '../../components/ui/button'; import { Input } from '../../components/ui/input'; +import StatusBadge from '@/components/StatusBadge'; import { Select, SelectContent, @@ -17,6 +18,14 @@ import { DropdownMenuTrigger, } from '../../components/ui/dropdown-menu'; import { Badge } from '../../components/ui/badge'; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '../../components/ui/table'; import api from '../../utils/api'; import { toast } from 'sonner'; import { @@ -184,15 +193,8 @@ const AdminDonations = () => { toast.error('Failed to copy to clipboard'); } }; - - const getStatusBadgeVariant = (status) => { - const variants = { - completed: 'default', - pending: 'secondary', - failed: 'destructive' - }; - return variants[status] || 'outline'; - }; + /* + */ const getTypeBadgeColor = (type) => { return type === 'member' ? 'bg-[var(--green-light)]' : 'bg-brand-purple '; @@ -392,51 +394,37 @@ const AdminDonations = () => { {/* Donations Table */}
- - - - - - - - - - - - - +
- Donor - - Type - - Amount - - Status - - Date - - Payment Method - - Details -
+ + + Donor + Type + Amount + Status + Date + Payment Method + Details + + + {filteredDonations.length === 0 ? ( - - - + + ) : ( filteredDonations.map((donation) => { const isExpanded = expandedRows.has(donation.id); return ( - - - - - - - - - - {/* Expandable Details Row */} + + {isExpanded && ( - - - + + )} ); }) )} - -
+ +

{donations.length === 0 ? 'No donations yet' : 'No donations match your filters'}

-
+ +

{donation.donor_name || 'Anonymous'} @@ -445,39 +433,37 @@ const AdminDonations = () => { {donation.donor_email || 'No email'}

-
+ + {donation.donation_type === 'member' ? 'Member' : 'Public'} - + +

{donation.amount}

-
- - {donation.status.charAt(0).toUpperCase() + donation.status.slice(1)} - - + + + + +
{formatDate(donation.created_at)}
-
-

+ + +

{donation.payment_method || 'N/A'}

-
+ + -
+ +

Transaction Details @@ -601,15 +586,15 @@ const AdminDonations = () => {

-
+ +
diff --git a/src/pages/admin/AdminValidations.js b/src/pages/admin/AdminValidations.js index c1882f9..0d17fc5 100644 --- a/src/pages/admin/AdminValidations.js +++ b/src/pages/admin/AdminValidations.js @@ -18,6 +18,12 @@ import { TableRow, TableCell, } from '../../components/ui/table'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '../../components/ui/tooltip'; import { Pagination, PaginationContent, @@ -417,7 +423,7 @@ const AdminValidations = () => { - + handleSort('first_name')} @@ -482,8 +488,8 @@ const AdminValidations = () => { onValueChange={(action) => handleActionSelect(user, action)} disabled={actionLoading === user.id || resendLoading === user.id} > - - + + {user.status === 'rejected' ? ( @@ -521,29 +527,45 @@ const AdminValidations = () => { )} - {/* view registration */} - + + {/* view registration */} + + + + + + View registration + + - {/* reject */} - {hasPermission('users.approve') && ( - - )} + {/* reject */} + {hasPermission('users.approve') && ( + + + + + + Reject user + + + )} +