Skip to content

Commit 06dc9b4

Browse files
search
1 parent 5a9d549 commit 06dc9b4

3 files changed

Lines changed: 46 additions & 8 deletions

File tree

src/components/MilestoneTabs.jsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
import React from "react";
2+
import { Input } from "./ui/input";
3+
import { Search as SearchIcon } from "lucide-react";
24

3-
export default function MilestoneTabs({ sprints, activeTab, setActiveTab }) {
5+
export default function MilestoneTabs({ sprints, activeTab, setActiveTab, search = "", setSearch = () => {} }) {
46
return (
57
<div className="mb-6">
6-
<div className="mb-4">
8+
<div className="mb-4 flex items-center gap-2">
79
<h3 className="text-lg font-semibold text-gray-900">Milestones</h3>
10+
<div className="relative w-full max-w-md ml-auto">
11+
<SearchIcon className="w-4 h-4 absolute left-2 top-1/2 -translate-y-1/2 text-gray-400" />
12+
<Input
13+
placeholder="Search sprint issues (number, title, description, assignee)"
14+
value={search}
15+
onChange={(e) => setSearch(e.target.value)}
16+
className="pl-7 h-9 text-sm"
17+
/>
18+
</div>
819
</div>
920
<div className="flex gap-2 overflow-x-auto pb-2">
1021
{sprints.map((sp) => (
@@ -24,4 +35,3 @@ export default function MilestoneTabs({ sprints, activeTab, setActiveTab }) {
2435
</div>
2536
);
2637
}
27-

src/components/SprintBoard.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,8 @@ export default function SprintBoard({ sprint, isFullScreen, toggleFullScreen, ha
443443
</div>
444444
<div className="p-2">
445445
<ul
446-
className={`space-y-3 overflow-auto pr-1 ${
447-
isFullScreen ? "max-h-[calc(100vh-200px)]" : "max-h-[calc(100vh-250px)]"
446+
className={`space-y-3 pr-1 ${
447+
isFullScreen ? "overflow-auto max-h-[calc(100vh-200px)]" : "overflow-visible max-h-none"
448448
}`}
449449
onDragOver={(e) => e.preventDefault()}
450450
onDrop={(e) => {

src/components/Sprints.jsx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const REMOVE_FROM_PROJECT = `
4848

4949
export 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

Comments
 (0)