From baa4618f3e2f75b19f520ea095fa12e4efb78ecb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:52:43 +0000 Subject: [PATCH 1/4] Initial plan From 2f965fcdcbe1607abec2fb60f04eae3724790fb4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:02:01 +0000 Subject: [PATCH 2/4] Add filtering functionality to issues table Co-authored-by: ChrisTimperley <523560+ChrisTimperley@users.noreply.github.com> --- frontend/src/components/IssuesSection.tsx | 187 +++++++++++++++++++++- 1 file changed, 181 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/IssuesSection.tsx b/frontend/src/components/IssuesSection.tsx index cb6f1f5..e8f67c3 100644 --- a/frontend/src/components/IssuesSection.tsx +++ b/frontend/src/components/IssuesSection.tsx @@ -13,8 +13,19 @@ import { Link, Chip, TableSortLabel, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + TextField, + FormControl, + FormLabel, + RadioGroup, + FormControlLabel, + Radio, + Badge, } from '@mui/material'; -import { Settings } from '@mui/icons-material'; +import { Settings, FilterAlt } from '@mui/icons-material'; import { Issue } from '../types'; import { formatDate } from '../utils/dateUtils'; @@ -29,6 +40,14 @@ interface IssuesSectionProps { repo: string; } +interface IssueFilters { + author: string; + status: 'all' | 'open' | 'closed'; + linkedPR: 'all' | 'with' | 'without'; + dateFrom: string; + dateTo: string; +} + export const IssuesSection: React.FC = ({ issues, owner, @@ -36,6 +55,14 @@ export const IssuesSection: React.FC = ({ }) => { const [sortBy, setSortBy] = useState('created_at'); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc'); + const [filterDialogOpen, setFilterDialogOpen] = useState(false); + const [filters, setFilters] = useState({ + author: '', + status: 'all', + linkedPR: 'all', + dateFrom: '', + dateTo: '', + }); // Sort issues based on current sort criteria const sortedIssues = useMemo(() => { @@ -68,6 +95,55 @@ export const IssuesSection: React.FC = ({ }); }, [issues, sortBy, sortDirection]); + // Apply filters to sorted issues + const filteredIssues = useMemo(() => { + return sortedIssues.filter((issue) => { + // Author filter + if (filters.author && !issue.author.toLowerCase().includes(filters.author.toLowerCase())) { + return false; + } + + // Status filter + if (filters.status === 'open' && issue.is_closed) { + return false; + } + if (filters.status === 'closed' && !issue.is_closed) { + return false; + } + + // Linked PR filter + if (filters.linkedPR === 'with' && (!issue.linked_prs || issue.linked_prs.length === 0)) { + return false; + } + if (filters.linkedPR === 'without' && issue.linked_prs && issue.linked_prs.length > 0) { + return false; + } + + // Date from filter + if (filters.dateFrom && new Date(issue.created_at) < new Date(filters.dateFrom)) { + return false; + } + + // Date to filter + if (filters.dateTo && new Date(issue.created_at) > new Date(filters.dateTo)) { + return false; + } + + return true; + }); + }, [sortedIssues, filters]); + + // Count active filters + const activeFilterCount = useMemo(() => { + let count = 0; + if (filters.author) count++; + if (filters.status !== 'all') count++; + if (filters.linkedPR !== 'all') count++; + if (filters.dateFrom) count++; + if (filters.dateTo) count++; + return count; + }, [filters]); + const handleSort = (column: keyof Issue) => { if (sortBy === column) { setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc'); @@ -76,6 +152,20 @@ export const IssuesSection: React.FC = ({ setSortDirection('asc'); } }; + + const handleClearFilters = () => { + setFilters({ + author: '', + status: 'all', + linkedPR: 'all', + dateFrom: '', + dateTo: '', + }); + }; + + const handleApplyFilters = () => { + setFilterDialogOpen(false); + }; return ( @@ -92,12 +182,18 @@ export const IssuesSection: React.FC = ({ Issues - {issues.length} issues in this period + {filteredIssues.length} of {issues.length} issues - + + + @@ -188,7 +284,7 @@ export const IssuesSection: React.FC = ({ - {sortedIssues.map((issue) => { + {filteredIssues.map((issue) => { // Render assignees const renderAssignees = () => { if (!issue.assignees || issue.assignees.length === 0) { @@ -326,6 +422,85 @@ export const IssuesSection: React.FC = ({ })}
+ + {/* Filter Dialog */} + setFilterDialogOpen(false)} + maxWidth="sm" + fullWidth + > + Filter Issues + + + {/* Author Filter */} + setFilters({ ...filters, author: e.target.value })} + fullWidth + size="small" + /> + + {/* Status Filter */} + + Status + setFilters({ ...filters, status: e.target.value as IssueFilters['status'] })} + > + } label="All" /> + } label="Open" /> + } label="Closed" /> + + + + {/* Linked PR Filter */} + + Linked Pull Request + setFilters({ ...filters, linkedPR: e.target.value as IssueFilters['linkedPR'] })} + > + } label="All" /> + } label="Has linked PR" /> + } label="No linked PR" /> + + + + {/* Date Range Filter */} + + Created Date Range + + setFilters({ ...filters, dateFrom: e.target.value })} + InputLabelProps={{ shrink: true }} + size="small" + fullWidth + /> + setFilters({ ...filters, dateTo: e.target.value })} + InputLabelProps={{ shrink: true }} + size="small" + fullWidth + /> + + + + + + + + + +
); From e5513253c5bd860d91829e63fdccd5db04f47281 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:03:35 +0000 Subject: [PATCH 3/4] Remove unused Settings import Co-authored-by: ChrisTimperley <523560+ChrisTimperley@users.noreply.github.com> --- frontend/src/components/IssuesSection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/IssuesSection.tsx b/frontend/src/components/IssuesSection.tsx index e8f67c3..15f787c 100644 --- a/frontend/src/components/IssuesSection.tsx +++ b/frontend/src/components/IssuesSection.tsx @@ -25,7 +25,7 @@ import { Radio, Badge, } from '@mui/material'; -import { Settings, FilterAlt } from '@mui/icons-material'; +import { FilterAlt } from '@mui/icons-material'; import { Issue } from '../types'; import { formatDate } from '../utils/dateUtils'; From 0659f28e7648a21d1420decb36852c040ce1d4db Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:20:50 +0000 Subject: [PATCH 4/4] Remove date filtering from issues table Co-authored-by: ChrisTimperley <523560+ChrisTimperley@users.noreply.github.com> --- frontend/src/components/IssuesSection.tsx | 43 ----------------------- 1 file changed, 43 deletions(-) diff --git a/frontend/src/components/IssuesSection.tsx b/frontend/src/components/IssuesSection.tsx index 15f787c..06ef929 100644 --- a/frontend/src/components/IssuesSection.tsx +++ b/frontend/src/components/IssuesSection.tsx @@ -44,8 +44,6 @@ interface IssueFilters { author: string; status: 'all' | 'open' | 'closed'; linkedPR: 'all' | 'with' | 'without'; - dateFrom: string; - dateTo: string; } export const IssuesSection: React.FC = ({ @@ -60,8 +58,6 @@ export const IssuesSection: React.FC = ({ author: '', status: 'all', linkedPR: 'all', - dateFrom: '', - dateTo: '', }); // Sort issues based on current sort criteria @@ -119,16 +115,6 @@ export const IssuesSection: React.FC = ({ return false; } - // Date from filter - if (filters.dateFrom && new Date(issue.created_at) < new Date(filters.dateFrom)) { - return false; - } - - // Date to filter - if (filters.dateTo && new Date(issue.created_at) > new Date(filters.dateTo)) { - return false; - } - return true; }); }, [sortedIssues, filters]); @@ -139,8 +125,6 @@ export const IssuesSection: React.FC = ({ if (filters.author) count++; if (filters.status !== 'all') count++; if (filters.linkedPR !== 'all') count++; - if (filters.dateFrom) count++; - if (filters.dateTo) count++; return count; }, [filters]); @@ -158,8 +142,6 @@ export const IssuesSection: React.FC = ({ author: '', status: 'all', linkedPR: 'all', - dateFrom: '', - dateTo: '', }); }; @@ -468,31 +450,6 @@ export const IssuesSection: React.FC = ({ } label="No linked PR" /> - - {/* Date Range Filter */} - - Created Date Range - - setFilters({ ...filters, dateFrom: e.target.value })} - InputLabelProps={{ shrink: true }} - size="small" - fullWidth - /> - setFilters({ ...filters, dateTo: e.target.value })} - InputLabelProps={{ shrink: true }} - size="small" - fullWidth - /> - -