import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { Table, Progress, Tag, Avatar, Button, DatePicker, Select, Spin } from 'antd'; import { Star, Edit, Trash2, Plus } from 'feather-icons-react'; import dayjs from 'dayjs'; const { Option } = Select; const { RangePicker } = DatePicker; const ProjectTracker = () => { const [selectedRowKeys, setSelectedRowKeys] = useState([]); const [filterStatus, setFilterStatus] = useState('All Status'); const [filterManager, setFilterManager] = useState('All Managers'); const [filterPriority, setFilterPriority] = useState('All Priority'); const [sortBy, setSortBy] = useState('Last 7 Days'); const [dateRange, setDateRange] = useState([ dayjs().subtract(7, 'day'), dayjs() ]); // API data state const [projectData, setProjectData] = useState([]); const [loading, setLoading] = useState(false); const [pagination, setPagination] = useState({ currentPage: 1, pageSize: 10, totalCount: 0, totalPages: 1 }); // Load projects from API const loadProjects = async (page = 1, pageSize = 10) => { setLoading(true); try { const apiBaseUrl = process.env.REACT_APP_API_BASE_URL || ''; console.log('Loading projects from:', `${apiBaseUrl}Projects`); const response = await fetch(`${apiBaseUrl}Projects?page=${page}&pageSize=${pageSize}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const result = await response.json(); console.log('API Response:', result); if (result.data) { // Map API data to table format const mappedData = result.data.map(project => ({ key: project.id.toString(), id: project.id, projectName: project.projectName, category: [project.categoryName], categoryColor: getCategoryColor(project.categoryName), manager: [ { name: project.createdByName, avatar: 'assets/img/profiles/avatar-01.jpg' } ], startDate: dayjs(project.startDate).format('DD MMM YYYY'), progress: project.progressPercentage, deadline: dayjs(project.endDate).format('DD MMM YYYY'), status: formatStatus(project.status), statusColor: getStatusColor(project.status), priority: project.priority, starred: false, budget: `$${project.budget.toLocaleString()}`, client: project.clientName })); setProjectData(mappedData); setPagination(result.pagination || { currentPage: 1, pageSize: 10, totalCount: result.data.length, totalPages: 1 }); console.log('Mapped data:', mappedData); } else { console.warn('No data found in API response'); setProjectData([]); } } catch (error) { console.error('Error loading projects:', error); // Set empty data on error setProjectData([]); setPagination({ currentPage: 1, pageSize: 10, totalCount: 0, totalPages: 1 }); } finally { setLoading(false); } }; // Helper functions for mapping const getCategoryColor = (categoryName) => { const colorMap = { 'Web Development': 'blue', 'Mobile App': 'green', 'Design': 'purple', 'Marketing': 'orange', 'DevOps': 'cyan', 'Data Science': 'red', 'Security': 'red', 'AI/ML': 'red' }; return colorMap[categoryName] || 'blue'; }; const getStatusColor = (status) => { const colorMap = { 'planning': 'default', 'in-progress': 'warning', 'review': 'processing', 'completed': 'success', 'on-hold': 'error' }; return colorMap[status] || 'default'; }; const formatStatus = (status) => { const statusMap = { 'planning': 'Planning', 'in-progress': 'In Progress', 'review': 'Review', 'completed': 'Completed', 'on-hold': 'On Hold' }; return statusMap[status] || status; }; // Load data on component mount useEffect(() => { loadProjects(); }, []); // Handle pagination change const handleTableChange = (paginationInfo) => { loadProjects(paginationInfo.current, paginationInfo.pageSize); }; // Table columns configuration const columns = [ { title: '', dataIndex: 'starred', width: 50, render: (starred) => ( ) }, { title: '', dataIndex: 'priority', width: 20, render: (priority) => (
) }, { title: 'Project Name', dataIndex: 'projectName', key: 'projectName', render: (text) => ( {text} ) }, { title: 'Category', dataIndex: 'category', key: 'category', render: (category, record) => ( {category[0]} ) }, { title: 'Project Manager', dataIndex: 'manager', key: 'manager', render: (managers) => ( {managers.map((manager, index) => ( ))} ) }, { title: 'Start Date', dataIndex: 'startDate', key: 'startDate', render: (date) => ( {date} ) }, { title: 'Progress', dataIndex: 'progress', key: 'progress', render: (progress) => (
70 ? '#17a2b8' : progress > 40 ? '#ffc107' : '#dc3545'} showInfo={false} /> Progress: {progress}%
) }, { title: 'Deadline', dataIndex: 'deadline', key: 'deadline', render: (date) => ( {date} ) }, { title: 'Status', dataIndex: 'status', key: 'status', render: (status, record) => ( {status} ) }, { title: 'Budget', dataIndex: 'budget', key: 'budget', render: (budget) => ( {budget} ) }, { title: '', key: 'actions', width: 100, render: () => (
) } ]; // Row selection configuration const rowSelection = { selectedRowKeys, onChange: (selectedKeys) => { setSelectedRowKeys(selectedKeys); }, getCheckboxProps: (record) => ({ name: record.projectName, }), }; return (
{/* Header */}

Project Tracker

Manage Your Projects
{/* Project Lists */}
Project Lists Active Projects
`Row Per Page: ${range[1] - range[0] + 1} Entries | Showing ${range[0]} to ${range[1]} of ${total} entries` }} /> ); }; export default ProjectTracker;