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) => (