diff --git a/packages/frontend/src/components/ui/icon.tsx b/packages/frontend/src/components/ui/icon.tsx index 304ea47..f659017 100644 --- a/packages/frontend/src/components/ui/icon.tsx +++ b/packages/frontend/src/components/ui/icon.tsx @@ -11,6 +11,7 @@ import { Clock as PixelClock, Close as PixelClose, MessagePlus as PixelCommentSend, + Copy as PixelCopy, CreditCard as PixelCreditCard, CreditCardDelete as PixelCreditCardDelete, Dashboard as PixelDashboard, @@ -53,6 +54,7 @@ import { CaretUpIcon as PhosphorChevronUp, CircleIcon as PhosphorCircle, ChatTextIcon as PhosphorComment, + CopyIcon as PhosphorCopy, CreditCardIcon as PhosphorCreditCard, CubeIcon as PhosphorCube, DotsSixVerticalIcon as PhosphorDotsSixVertical, @@ -102,6 +104,7 @@ import { CircleCheckIcon, CircleIcon, CircleQuestionMark, + Copy, CreditCard, Edit, EllipsisVertical, @@ -161,6 +164,7 @@ const icons = { circleIcon: { lucide: CircleIcon, pixel: PixelCircle, phosphor: PhosphorCircle }, circleQuestionMark: { lucide: CircleQuestionMark, pixel: PixelNoteDelete, phosphor: PhosphorQuestion }, comment: { lucide: MessageSquarePlus, pixel: PixelCommentSend, phosphor: PhosphorComment }, + copy: { lucide: Copy, pixel: PixelCopy, phosphor: PhosphorCopy }, creditCard: { lucide: CreditCard, pixel: PixelCreditCard, phosphor: PhosphorCreditCard }, creditCardDelete: { lucide: CreditCard, pixel: PixelCreditCardDelete, phosphor: PhosphorCreditCard }, edit: { lucide: Edit, pixel: PixelEdit, phosphor: PhosphorEdit }, diff --git a/packages/frontend/src/pages/Issues.tsx b/packages/frontend/src/pages/Issues.tsx index 6ea61f0..5d8c8c8 100644 --- a/packages/frontend/src/pages/Issues.tsx +++ b/packages/frontend/src/pages/Issues.tsx @@ -555,6 +555,64 @@ export default function Issues() { > + { + const params = new URLSearchParams(window.location.search); + + if (issueFilters.query) { + params.set("q", issueFilters.query); + } else { + params.delete("q"); + } + + if (issueFilters.statuses.length > 0) { + params.set("status", issueFilters.statuses.join(",")); + } else { + params.delete("status"); + } + + if (issueFilters.types.length > 0) { + params.set("type", issueFilters.types.join(",")); + } else { + params.delete("type"); + } + + if (issueFilters.assignees.length > 0) { + params.set("assignee", issueFilters.assignees.join(",")); + } else { + params.delete("assignee"); + } + + if (issueFilters.sprintId !== defaultIssuesTableFilters.sprintId) { + params.set("sprint", String(issueFilters.sprintId)); + } else { + params.delete("sprint"); + } + + if (issueFilters.sort !== defaultIssuesTableFilters.sort) { + params.set("sort", issueFilters.sort); + } else { + params.delete("sort"); + } + + const url = `${window.location.origin}${window.location.pathname}?${params.toString()}`; + navigator.clipboard.writeText(url); + }} + > + + )}