@@ -48,6 +48,7 @@ const REMOVE_FROM_PROJECT = `
4848
4949export default function Sprints ( { allIssues, orgMeta, projects, token } ) {
5050 const [ statusMap , setStatusMap ] = useState ( new Map ( ) ) ;
51+ const [ search , setSearch ] = useState ( "" ) ;
5152
5253 useEffect ( ( ) => {
5354 const map = new Map ( ) ;
@@ -152,6 +153,33 @@ export default function Sprints({ allIssues, orgMeta, projects, token }) {
152153
153154 const activeSprint = sprintData . find ( sp => sp . id === activeTab ) ;
154155
156+ const filteredActiveSprint = useMemo ( ( ) => {
157+ if ( ! activeSprint ) return null ;
158+ const q = search . trim ( ) . toLowerCase ( ) ;
159+ if ( ! q ) return activeSprint ;
160+ const matches = ( i ) => {
161+ const num = String ( i . number || "" ) ;
162+ const title = ( i . title || "" ) . toLowerCase ( ) ;
163+ const body = ( i . body || "" ) . toLowerCase ( ) ;
164+ const assignees = ( i . assignees || [ ] ) . map ( a => ( a . login || "" ) . toLowerCase ( ) ) ;
165+ return (
166+ num . includes ( q ) ||
167+ title . includes ( q ) ||
168+ body . includes ( q ) ||
169+ assignees . some ( a => a . includes ( q ) )
170+ ) ;
171+ } ;
172+ const filteredIssues = ( activeSprint . issues || [ ] ) . filter ( matches ) ;
173+ const open = filteredIssues . filter ( i => i . state === 'OPEN' ) . length ;
174+ const closed = filteredIssues . filter ( i => i . state === 'CLOSED' ) . length ;
175+ return {
176+ ...activeSprint ,
177+ open,
178+ closed,
179+ grouped : activeSprint . grouped . map ( ( [ status , list ] ) => [ status , list . filter ( matches ) ] ) ,
180+ } ;
181+ } , [ activeSprint , search ] ) ;
182+
155183 if ( ! sprintData . length ) {
156184 return (
157185 < Card >
@@ -164,10 +192,10 @@ export default function Sprints({ allIssues, orgMeta, projects, token }) {
164192
165193 return (
166194 < div className = { `${ isFullScreen ? 'fixed inset-0 z-50 bg-white p-6' : '' } ` } >
167- < MilestoneTabs sprints = { sprintData } activeTab = { activeTab } setActiveTab = { setActiveTab } />
168- { activeSprint && (
195+ < MilestoneTabs sprints = { sprintData } activeTab = { activeTab } setActiveTab = { setActiveTab } search = { search } setSearch = { setSearch } />
196+ { ( filteredActiveSprint || activeSprint ) && (
169197 < SprintBoard
170- sprint = { activeSprint }
198+ sprint = { filteredActiveSprint || activeSprint }
171199 isFullScreen = { isFullScreen }
172200 toggleFullScreen = { toggleFullScreen }
173201 handleDrop = { handleDrop }
0 commit comments