diff --git a/ipi-survey-platform/src/components/admin/StatCard.jsx b/ipi-survey-platform/src/components/admin/StatCard.jsx index 2e79009..5fbfe3b 100644 --- a/ipi-survey-platform/src/components/admin/StatCard.jsx +++ b/ipi-survey-platform/src/components/admin/StatCard.jsx @@ -5,14 +5,21 @@ const StatCard = ({ icon = null, label, value, width = 200.4 }) => { return (
- {icon} - {label} - {value} +
+ {icon &&
{icon}
} + + {label} + +
+ + + {value} +
); }; -export default StatCard; +export default StatCard; \ No newline at end of file diff --git a/ipi-survey-platform/src/components/admin/SubmissionTable.jsx b/ipi-survey-platform/src/components/admin/SubmissionTable.jsx index a7c3361..f38fdea 100644 --- a/ipi-survey-platform/src/components/admin/SubmissionTable.jsx +++ b/ipi-survey-platform/src/components/admin/SubmissionTable.jsx @@ -1,10 +1,10 @@ import React, { useEffect, useState, useMemo } from 'react'; import Table from '../common/Table'; import SearchIcon from '../../assets/images/material-symbols_search-rounded.svg'; -import { CheckCircle, XCircle, Eye } from 'lucide-react'; // ✅ Icons +import { CheckCircle, XCircle, Eye } from 'lucide-react'; import apiClient from '../../services/api/apiClient.js'; -const SubmissionTable = () => { +const SubmissionTable = ({ selectedQuarter, selectedYear }) => { const [search, setSearch] = useState(''); const [submissions, setSubmissions] = useState([]); const [loading, setLoading] = useState(true); @@ -49,13 +49,23 @@ const SubmissionTable = () => { })}`; }; + const filteredByQuarterYear = useMemo(() => { + return submissions.filter((item) => { + const quarterMatch = + selectedQuarter === 'None' || item.quarter === selectedQuarter; + const yearMatch = + selectedYear === 'None' || `${item.year}` === selectedYear; + return quarterMatch && yearMatch; + }); + }, [submissions, selectedQuarter, selectedYear]); + const filtered = useMemo(() => { - if (!search.trim()) return submissions; + if (!search.trim()) return filteredByQuarterYear; const normalized = search.trim().toLowerCase(); - return submissions.filter((item) => + return filteredByQuarterYear.filter((item) => Object.values(item).join(' ').toLowerCase().includes(normalized) ); - }, [search, submissions]); + }, [search, filteredByQuarterYear]); const headers = [ 'Establishment', @@ -71,6 +81,35 @@ const SubmissionTable = () => { 'Actions', ]; + const renderStatusBadge = (status) => { + const normalized = status?.toLowerCase(); + if (normalized === 'approved') { + return ( + + Approved + + ); + } else if (normalized === 'rejected') { + return ( + + Rejected + + ); + } else if (normalized === 'pending') { + return ( + + Pending + + ); + } else { + return ( + + {status || '-'} + + ); + } + }; + const tableRows = filtered.map((item) => [ item.establishment, item.emirate, @@ -79,10 +118,9 @@ const SubmissionTable = () => { item.productCount, item.submittedBy, item.submissionDateTime, - item.status, + renderStatusBadge(item.status), item.reviewer, item.reviewedOn, - // 🧩 Actions column
@@ -90,14 +128,26 @@ const SubmissionTable = () => {
, ]); - const columnWidths = [240, 120, 100, 100, 130, 150, 180, 120, 150, 180, 120]; + const columnWidths = [240, 120, 100, 100, 130, 150, 180, 150, 150, 180, 120]; + + const titleText = useMemo(() => { + const count = filtered.length; + if (selectedQuarter !== 'None' && selectedYear !== 'None') { + return `Recent 10 Submissions for Selected Quarter ${selectedQuarter} ${selectedYear} (${count})`; + } else if (selectedQuarter !== 'None') { + return `Recent 10 Submissions for Selected Quarter ${selectedQuarter} (${count})`; + } else if (selectedYear !== 'None') { + return `Recent 10 Submissions for Selected Year ${selectedYear} (${count})`; + } else { + return `Recent 10 Submissions (${count})`; + } + }, [selectedQuarter, selectedYear, filtered]); const toolbar = (

- Recent Submissions{' '} - ({submissions.length}) + {titleText}

{ return (
-
{/* ✅ Horizontal scroll */} +
{toolbar} {loading ? (
Loading submissions...
) : ( -
{/* Keeps layout inside scroll area */} +
{ )} +