|
1 | 1 | import React, { useState } from 'react'; |
2 | 2 | import { Link } from 'react-router-dom'; |
3 | | -import CustomDropdown from '../CustomDropdown'; |
4 | | -import { FunnelIcon } from '@phosphor-icons/react'; |
5 | | -import { getStatusClasses, getPriorityClasses } from '../../utils/roadmapHelpers'; |
| 3 | + |
| 4 | +import { getStatusClasses, getPriorityClasses, statusTextColor } from '../../utils/roadmapHelpers'; |
6 | 5 |
|
7 | 6 | const TableView = ({ issuesData = [] }) => { |
8 | 7 | const [sortBy, setSortBy] = useState('title'); |
9 | 8 | const [sortOrder, setSortOrder] = useState('asc'); // 'asc' or 'desc' |
10 | | - const [filterStatus, setFilterStatus] = useState('All'); |
| 9 | + const [activeFilters, setActiveFilters] = useState([]); // Changed filterStatus to activeFilters |
11 | 10 |
|
12 | | - const filteredApps = issuesData.filter((app) => |
13 | | - filterStatus === 'All' ? true : (app.status || 'Planned') === filterStatus, |
14 | | - ); |
| 11 | + const handleFilterChange = (status) => { |
| 12 | + if (activeFilters.includes(status)) { |
| 13 | + setActiveFilters(activeFilters.filter((s) => s !== status)); // Remove filter |
| 14 | + } else { |
| 15 | + setActiveFilters([...activeFilters, status]); // Add filter |
| 16 | + } |
| 17 | + }; |
| 18 | + |
| 19 | + const filteredApps = issuesData.filter((app) => { |
| 20 | + if (activeFilters.length === 0) return false; // Show none if no filters active |
| 21 | + return activeFilters.includes(app.status || 'Planned'); |
| 22 | + }); |
15 | 23 |
|
16 | 24 | const sortedApps = [...filteredApps].sort((a, b) => { |
17 | 25 | let comparison = 0; |
@@ -52,20 +60,20 @@ const TableView = ({ issuesData = [] }) => { |
52 | 60 |
|
53 | 61 | return ( |
54 | 62 | <div className="overflow-x-auto rounded-xl shadow-lg bg-gray-900/70 backdrop-blur-sm border border-gray-800"> |
55 | | - <div className="mb-4 mt-4 flex justify-center items-center"> |
56 | | - <CustomDropdown |
57 | | - options={[ |
58 | | - { label: 'All Statuses', value: 'All' }, |
59 | | - { label: 'Planned', value: 'Planned' }, |
60 | | - { label: 'In Progress', value: 'In Progress' }, |
61 | | - { label: 'Completed', value: 'Completed' }, |
62 | | - { label: 'On Hold', value: 'On Hold' }, |
63 | | - ]} |
64 | | - value={filterStatus} |
65 | | - onChange={setFilterStatus} |
66 | | - icon={FunnelIcon} |
67 | | - label="Filter by Status" |
68 | | - /> |
| 63 | + <div className="mb-4 mt-4 flex justify-center items-center flex-wrap gap-2"> |
| 64 | + {['Planned', 'In Progress', 'Completed', 'On Hold'].map((status) => ( |
| 65 | + <button |
| 66 | + key={status} |
| 67 | + onClick={() => handleFilterChange(status)} |
| 68 | + className={`px-4 py-2 rounded-md text-sm font-mono transition-colors border ${ |
| 69 | + activeFilters.includes(status) |
| 70 | + ? `${getStatusClasses(status).split(' ')[0]} ${getStatusClasses(status).split(' ')[1]} ${statusTextColor(status)}` |
| 71 | + : 'bg-gray-800/60 border-gray-700 text-gray-300 hover:border-indigo-500 hover:text-white' |
| 72 | + }`} |
| 73 | + > |
| 74 | + {status} |
| 75 | + </button> |
| 76 | + ))} |
69 | 77 | </div> |
70 | 78 | <table className="min-w-full divide-y divide-gray-700 text-white"> |
71 | 79 | <thead className="bg-gray-800/60 border-b border-gray-700"> |
@@ -125,7 +133,7 @@ const TableView = ({ issuesData = [] }) => { |
125 | 133 | </td> |
126 | 134 | <td className="px-6 py-4 whitespace-nowrap"> |
127 | 135 | <span |
128 | | - className={`px-2 py-0 inline-flex text-xs font-mono font-semibold rounded-md shadow-sm border ${getStatusClasses(app.status)}`} |
| 136 | + className={`px-2 py-0 inline-flex text-xs font-mono font-semibold rounded-md shadow-sm border ${getStatusClasses(app.status)} ${statusTextColor(app.status)} `} |
129 | 137 | > |
130 | 138 | {app.status || 'Planned'} |
131 | 139 | </span> |
|
0 commit comments