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 ? (
-
-
+
+
{donations.length === 0 ? 'No donations yet' : 'No donations match your filters'}
- |
-
+
+
) : (
filteredDonations.map((donation) => {
const isExpanded = expandedRows.has(donation.id);
return (
-
-
+
+
{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'}
- |
-
+
+
- |
-
- {/* Expandable Details Row */}
+
+
{isExpanded && (
-
- |
+
+
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
+
+
+ )}
+
|