diff --git a/dashboard/src/api/issue.ts b/dashboard/src/api/issue.ts index 5c3cae53..168fbf30 100644 --- a/dashboard/src/api/issue.ts +++ b/dashboard/src/api/issue.ts @@ -18,7 +18,7 @@ const fetchIssueListing = async ( }; export const useIssueListing = (): UseQueryResult => { - const { origin, intervalInDays } = useSearch({ from: '/_main/issue' }); + const { origin, intervalInDays } = useSearch({ from: '/_main/issues' }); const queryKey = ['issueTable', origin, intervalInDays]; diff --git a/dashboard/src/components/Breadcrumb/IssueBreadcrumb.tsx b/dashboard/src/components/Breadcrumb/IssueBreadcrumb.tsx new file mode 100644 index 00000000..17ad038b --- /dev/null +++ b/dashboard/src/components/Breadcrumb/IssueBreadcrumb.tsx @@ -0,0 +1,42 @@ +import type { MessageDescriptor } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; + +import { memo, type JSX } from 'react'; + +import type { LinkProps } from '@tanstack/react-router'; + +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator, +} from './Breadcrumb'; + +const IssueBreadcrumb = ({ + searchParams, + locationMessage, +}: { + searchParams: LinkProps['search']; + locationMessage: MessageDescriptor['id']; +}): JSX.Element => { + return ( + + + + + + + + + + + + + + + + ); +}; +export const MemoizedIssueBreadcrumb = memo(IssueBreadcrumb); diff --git a/dashboard/src/components/IssueDetails/IssueDetails.tsx b/dashboard/src/components/IssueDetails/IssueDetails.tsx index 9b8a1d04..594b1e2e 100644 --- a/dashboard/src/components/IssueDetails/IssueDetails.tsx +++ b/dashboard/src/components/IssueDetails/IssueDetails.tsx @@ -44,6 +44,8 @@ import { getIssueCulprit } from '@/lib/issue'; import { MemoizedIssueDetailsOGTags } from '@/components/OpenGraphTags/IssueDetailsOGTags'; +import { TooltipIcon } from '@/components/Icons/TooltipIcon'; + import { IssueDetailsTestSection } from './IssueDetailsTestSection'; import { IssueDetailsBuildSection } from './IssueDetailsBuildSection'; @@ -168,6 +170,7 @@ export const IssueDetails = ({ { title: 'issueDetails.culpritTitle', linkText: issueCulprit, + titleIcon: , }, { title: 'issueDetails.id', diff --git a/dashboard/src/components/IssueTable/IssueTable.tsx b/dashboard/src/components/IssueTable/IssueTable.tsx index 678b8cae..0f3331b7 100644 --- a/dashboard/src/components/IssueTable/IssueTable.tsx +++ b/dashboard/src/components/IssueTable/IssueTable.tsx @@ -41,6 +41,7 @@ import { valueOrEmpty } from '@/lib/string'; import { TooltipDateTime } from '@/components/TooltipDateTime'; import { shouldShowRelativeDate } from '@/lib/date'; +import { RedirectFrom } from '@/types/general'; const getLinkProps = ( row: Row, @@ -51,7 +52,7 @@ const getLinkProps = ( row.original.git_commit_hash !== undefined ) { return { - from: '/issue', + from: '/issues', to: '/tree/$treeId', params: { treeId: row.original.git_commit_hash }, state: s => s, @@ -69,11 +70,13 @@ const getLinkProps = ( } return { - from: '/issue', + from: '/issues', to: '/issue/$issueId', params: { issueId: row.original.id }, state: s => ({ ...s, + id: row.original.id, + from: RedirectFrom.Issues, }), }; }; @@ -97,12 +100,6 @@ const columns: ColumnDef[] = [ row.original.id ), }, - { - accessorKey: 'version', - header: ({ column }): JSX.Element => ( - - ), - }, { id: 'culprit', accessorFn: (original, _): boolean[] => { @@ -113,7 +110,11 @@ const columns: ColumnDef[] = [ ]; }, header: ({ column }): JSX.Element => ( - + ), cell: ({ row }): JSX.Element => ( { - const { listingSize } = useSearch({ strict: false }); - const navigate = useNavigate({ from: '/issue' }); + const { listingSize } = useSearch({ from: '/_main/issues' }); + const navigate = useNavigate({ from: '/issues' }); const [sorting, setSorting] = useState([ { @@ -267,7 +268,7 @@ export const IssueTable = ({ issueListing }: IIssueTable): JSX.Element => { />
- + void; unformattedTitle?: string; + titleIcon?: JSX.Element; } const LinkWithIcon = ({ @@ -23,14 +24,18 @@ const LinkWithIcon = ({ linkComponent, onClick, unformattedTitle, + titleIcon, }: ILinkWithIcon): JSX.Element => { const WrapperLink = link ? 'a' : 'div'; return (
{(title && ( - - - +
+ + + + {titleIcon} +
)) || (unformattedTitle &&

{unformattedTitle}

)} {linkComponent ?? ( diff --git a/dashboard/src/components/OpenGraphTags/ListingOGTags.tsx b/dashboard/src/components/OpenGraphTags/ListingOGTags.tsx index d30278de..499b5a30 100644 --- a/dashboard/src/components/OpenGraphTags/ListingOGTags.tsx +++ b/dashboard/src/components/OpenGraphTags/ListingOGTags.tsx @@ -27,7 +27,7 @@ const ListingOGTags = ({ case '/hardware': descriptionId = 'hardwareListing.description'; break; - case '/issue': + case '/issues': descriptionId = 'issueListing.description'; break; } @@ -45,7 +45,7 @@ const ListingOGTags = ({ return formatMessage({ id: 'treeListing.title' }); case '/hardware': return formatMessage({ id: 'hardwareListing.title' }); - case '/issue': + case '/issues': return formatMessage({ id: 'issueListing.title' }); } }, [formatMessage, monitor]); diff --git a/dashboard/src/components/Section/Section.tsx b/dashboard/src/components/Section/Section.tsx index cc8bac98..ac505b79 100644 --- a/dashboard/src/components/Section/Section.tsx +++ b/dashboard/src/components/Section/Section.tsx @@ -48,6 +48,7 @@ export const Subsection = ({ infos, title }: ISubsection): JSX.Element => { key={info.title?.toString()} title={info.title} link={info.link} + titleIcon={info.titleIcon} linkComponent={info.linkComponent} linkText={info.linkText} unformattedTitle={info.unformattedTitle} diff --git a/dashboard/src/components/SideMenu/SideMenu.tsx b/dashboard/src/components/SideMenu/SideMenu.tsx index b08f5727..de0e79d0 100644 --- a/dashboard/src/components/SideMenu/SideMenu.tsx +++ b/dashboard/src/components/SideMenu/SideMenu.tsx @@ -87,7 +87,7 @@ const SideMenu = (): JSX.Element => { selected: false, }, { - navigateTo: '/issue', + navigateTo: '/issues', idIntl: 'routes.issueMonitor', icon: , selected: false, diff --git a/dashboard/src/components/TopBar/TopBar.tsx b/dashboard/src/components/TopBar/TopBar.tsx index d3d01c0d..433ba185 100644 --- a/dashboard/src/components/TopBar/TopBar.tsx +++ b/dashboard/src/components/TopBar/TopBar.tsx @@ -15,12 +15,10 @@ import { zOrigin, zOriginEnum } from '@/types/general'; const getTargetPath = (basePath: string): PossibleMonitorPath => { switch (basePath) { - case 'tree': - return '/tree'; case 'hardware': return '/hardware'; - case 'issue': - return '/issue'; + case 'issues': + return '/issues'; default: return '/tree'; } @@ -79,6 +77,8 @@ const TitleName = ({ basePath }: { basePath: string }): JSX.Element => { return ; case 'hardware': return ; + case 'issues': + return ; case 'build': return ; case 'test': @@ -104,7 +104,7 @@ const TopBar = (): JSX.Element => { {(basePath === 'tree' || basePath === 'hardware' || - basePath === 'issue') && } + basePath === 'issues') && }
); diff --git a/dashboard/src/locales/messages/index.ts b/dashboard/src/locales/messages/index.ts index 82b4f3dd..11202c7a 100644 --- a/dashboard/src/locales/messages/index.ts +++ b/dashboard/src/locales/messages/index.ts @@ -178,6 +178,7 @@ export const messages = { 'issue.firstSeen': 'First seen', 'issue.newIssue': 'New issue: This is the first time this issue was seen', 'issue.noIssueFound': 'No issue found.', + 'issue.path': 'Issues', 'issue.searchPlaceholder': 'Search by issue comment with a regex', 'issue.tooltip': 'Issues groups several builds or tests by matching result status and logs.{br}They may also be linked to an external issue tracker or mailing list discussion.', @@ -196,6 +197,8 @@ export const messages = { 'issueDetails.reportSubject': 'Report Subject', 'issueDetails.reportUrl': 'Report URL', 'issueDetails.version': 'Version', + 'issueListing.culpritInfo': + 'Layers of the execution stack responsible for the issue. If all are false, the issue is considered invalid.', 'issueListing.description': 'List of issues from builds and tests', 'issueListing.title': 'Issue Listing ― KCI Dashboard', 'issueListing.treeBranchTooltip': diff --git a/dashboard/src/pages/IssueDetails/IssueDetails.tsx b/dashboard/src/pages/IssueDetails/IssueDetails.tsx index 5eb3e2f8..eef11dc6 100644 --- a/dashboard/src/pages/IssueDetails/IssueDetails.tsx +++ b/dashboard/src/pages/IssueDetails/IssueDetails.tsx @@ -10,6 +10,7 @@ import { RedirectFrom } from '@/types/general'; import { MemoizedTreeBreadcrumb } from '@/components/Breadcrumb/TreeBreadcrumb'; import { MemoizedHardwareBreadcrumb } from '@/components/Breadcrumb/HardwareBreadcrumb'; import { useSearchStore } from '@/hooks/store/useSearchStore'; +import { MemoizedIssueBreadcrumb } from '@/components/Breadcrumb/IssueBreadcrumb'; const getBuildTableRowLink = (buildId: string): LinkProps => ({ to: '/build/$buildId', @@ -54,6 +55,15 @@ const IssueDetailsPage = (): JSX.Element => { /> ); } + + if (historyState.from === RedirectFrom.Issues) { + return ( + + ); + } } }, [historyState.from, historyState.id, previousSearch]); diff --git a/dashboard/src/pages/IssueListing/IssueListing.tsx b/dashboard/src/pages/IssueListing/IssueListing.tsx index 1cf33e88..1afc084d 100644 --- a/dashboard/src/pages/IssueListing/IssueListing.tsx +++ b/dashboard/src/pages/IssueListing/IssueListing.tsx @@ -20,7 +20,7 @@ const IssueListing = (): JSX.Element => { const issueSearch = z.string().catch('').parse(unsafeIssueSearch); - const navigate = useNavigate({ from: '/issue' }); + const navigate = useNavigate({ from: '/issues' }); const onInputSearchTextChange = useCallback( (e: ChangeEvent) => { @@ -38,7 +38,7 @@ const IssueListing = (): JSX.Element => { return ( <> - +
{ const { data, status, error, isLoading } = useIssueListing(); + const searchParams = useSearch({ from: '/_main/issues' }); + const updatePreviousSearch = useSearchStore(s => s.updatePreviousSearch); + + useEffect( + () => updatePreviousSearch(searchParams), + [searchParams, updatePreviousSearch], + ); const filteredData = useMemo((): IssueListingResponse => { if (!data) { diff --git a/dashboard/src/routeTree.gen.ts b/dashboard/src/routeTree.gen.ts index 1e6aa616..348d5873 100644 --- a/dashboard/src/routeTree.gen.ts +++ b/dashboard/src/routeTree.gen.ts @@ -14,10 +14,10 @@ import { Route as rootRoute } from './routes/__root' import { Route as MainRouteImport } from './routes/_main/route' import { Route as MainIndexImport } from './routes/_main/index' import { Route as MainTreeRouteImport } from './routes/_main/tree/route' -import { Route as MainIssueRouteImport } from './routes/_main/issue/route' +import { Route as MainIssuesRouteImport } from './routes/_main/issues/route' import { Route as MainHardwareRouteImport } from './routes/_main/hardware/route' import { Route as MainTreeIndexImport } from './routes/_main/tree/index' -import { Route as MainIssueIndexImport } from './routes/_main/issue/index' +import { Route as MainIssuesIndexImport } from './routes/_main/issues/index' import { Route as MainHardwareIndexImport } from './routes/_main/hardware/index' import { Route as MainTreeTreeIdRouteImport } from './routes/_main/tree/$treeId/route' import { Route as MainTestTestIdRouteImport } from './routes/_main/test/$testId/route' @@ -66,9 +66,9 @@ const MainTreeRouteRoute = MainTreeRouteImport.update({ getParentRoute: () => MainRouteRoute, } as any) -const MainIssueRouteRoute = MainIssueRouteImport.update({ - id: '/issue', - path: '/issue', +const MainIssuesRouteRoute = MainIssuesRouteImport.update({ + id: '/issues', + path: '/issues', getParentRoute: () => MainRouteRoute, } as any) @@ -84,10 +84,10 @@ const MainTreeIndexRoute = MainTreeIndexImport.update({ getParentRoute: () => MainTreeRouteRoute, } as any) -const MainIssueIndexRoute = MainIssueIndexImport.update({ +const MainIssuesIndexRoute = MainIssuesIndexImport.update({ id: '/', path: '/', - getParentRoute: () => MainIssueRouteRoute, + getParentRoute: () => MainIssuesRouteRoute, } as any) const MainHardwareIndexRoute = MainHardwareIndexImport.update({ @@ -109,9 +109,9 @@ const MainTestTestIdRouteRoute = MainTestTestIdRouteImport.update({ } as any) const MainIssueIssueIdRouteRoute = MainIssueIssueIdRouteImport.update({ - id: '/$issueId', - path: '/$issueId', - getParentRoute: () => MainIssueRouteRoute, + id: '/issue/$issueId', + path: '/issue/$issueId', + getParentRoute: () => MainRouteRoute, } as any) const MainHardwareHardwareIdRouteRoute = @@ -293,11 +293,11 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof MainHardwareRouteImport parentRoute: typeof MainRouteImport } - '/_main/issue': { - id: '/_main/issue' - path: '/issue' - fullPath: '/issue' - preLoaderRoute: typeof MainIssueRouteImport + '/_main/issues': { + id: '/_main/issues' + path: '/issues' + fullPath: '/issues' + preLoaderRoute: typeof MainIssuesRouteImport parentRoute: typeof MainRouteImport } '/_main/tree': { @@ -337,10 +337,10 @@ declare module '@tanstack/react-router' { } '/_main/issue/$issueId': { id: '/_main/issue/$issueId' - path: '/$issueId' + path: '/issue/$issueId' fullPath: '/issue/$issueId' preLoaderRoute: typeof MainIssueIssueIdRouteImport - parentRoute: typeof MainIssueRouteImport + parentRoute: typeof MainRouteImport } '/_main/test/$testId': { id: '/_main/test/$testId' @@ -363,12 +363,12 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof MainHardwareIndexImport parentRoute: typeof MainHardwareRouteImport } - '/_main/issue/': { - id: '/_main/issue/' + '/_main/issues/': { + id: '/_main/issues/' path: '/' - fullPath: '/issue/' - preLoaderRoute: typeof MainIssueIndexImport - parentRoute: typeof MainIssueRouteImport + fullPath: '/issues/' + preLoaderRoute: typeof MainIssuesIndexImport + parentRoute: typeof MainIssuesRouteImport } '/_main/tree/': { id: '/_main/tree/' @@ -573,31 +573,16 @@ const MainHardwareRouteRouteChildren: MainHardwareRouteRouteChildren = { const MainHardwareRouteRouteWithChildren = MainHardwareRouteRoute._addFileChildren(MainHardwareRouteRouteChildren) -interface MainIssueIssueIdRouteRouteChildren { - MainIssueIssueIdIndexRoute: typeof MainIssueIssueIdIndexRoute -} - -const MainIssueIssueIdRouteRouteChildren: MainIssueIssueIdRouteRouteChildren = { - MainIssueIssueIdIndexRoute: MainIssueIssueIdIndexRoute, -} - -const MainIssueIssueIdRouteRouteWithChildren = - MainIssueIssueIdRouteRoute._addFileChildren( - MainIssueIssueIdRouteRouteChildren, - ) - -interface MainIssueRouteRouteChildren { - MainIssueIssueIdRouteRoute: typeof MainIssueIssueIdRouteRouteWithChildren - MainIssueIndexRoute: typeof MainIssueIndexRoute +interface MainIssuesRouteRouteChildren { + MainIssuesIndexRoute: typeof MainIssuesIndexRoute } -const MainIssueRouteRouteChildren: MainIssueRouteRouteChildren = { - MainIssueIssueIdRouteRoute: MainIssueIssueIdRouteRouteWithChildren, - MainIssueIndexRoute: MainIssueIndexRoute, +const MainIssuesRouteRouteChildren: MainIssuesRouteRouteChildren = { + MainIssuesIndexRoute: MainIssuesIndexRoute, } -const MainIssueRouteRouteWithChildren = MainIssueRouteRoute._addFileChildren( - MainIssueRouteRouteChildren, +const MainIssuesRouteRouteWithChildren = MainIssuesRouteRoute._addFileChildren( + MainIssuesRouteRouteChildren, ) interface MainTreeTreeIdRouteRouteChildren { @@ -675,6 +660,19 @@ const MainBuildBuildIdRouteRouteWithChildren = MainBuildBuildIdRouteRouteChildren, ) +interface MainIssueIssueIdRouteRouteChildren { + MainIssueIssueIdIndexRoute: typeof MainIssueIssueIdIndexRoute +} + +const MainIssueIssueIdRouteRouteChildren: MainIssueIssueIdRouteRouteChildren = { + MainIssueIssueIdIndexRoute: MainIssueIssueIdIndexRoute, +} + +const MainIssueIssueIdRouteRouteWithChildren = + MainIssueIssueIdRouteRoute._addFileChildren( + MainIssueIssueIdRouteRouteChildren, + ) + interface MainTestTestIdRouteRouteChildren { MainTestTestIdIndexRoute: typeof MainTestTestIdIndexRoute } @@ -716,11 +714,12 @@ const MainalternativesTTestIdRouteRouteWithChildren = interface MainRouteRouteChildren { MainHardwareRouteRoute: typeof MainHardwareRouteRouteWithChildren - MainIssueRouteRoute: typeof MainIssueRouteRouteWithChildren + MainIssuesRouteRoute: typeof MainIssuesRouteRouteWithChildren MainTreeRouteRoute: typeof MainTreeRouteRouteWithChildren MainIndexRoute: typeof MainIndexRoute MainalternativesIRouteRoute: typeof MainalternativesIRouteRouteWithChildren MainBuildBuildIdRouteRoute: typeof MainBuildBuildIdRouteRouteWithChildren + MainIssueIssueIdRouteRoute: typeof MainIssueIssueIdRouteRouteWithChildren MainTestTestIdRouteRoute: typeof MainTestTestIdRouteRouteWithChildren MainalternativesBBuildIdRouteRoute: typeof MainalternativesBBuildIdRouteRouteWithChildren MainalternativesTTestIdRouteRoute: typeof MainalternativesTTestIdRouteRouteWithChildren @@ -728,11 +727,12 @@ interface MainRouteRouteChildren { const MainRouteRouteChildren: MainRouteRouteChildren = { MainHardwareRouteRoute: MainHardwareRouteRouteWithChildren, - MainIssueRouteRoute: MainIssueRouteRouteWithChildren, + MainIssuesRouteRoute: MainIssuesRouteRouteWithChildren, MainTreeRouteRoute: MainTreeRouteRouteWithChildren, MainIndexRoute: MainIndexRoute, MainalternativesIRouteRoute: MainalternativesIRouteRouteWithChildren, MainBuildBuildIdRouteRoute: MainBuildBuildIdRouteRouteWithChildren, + MainIssueIssueIdRouteRoute: MainIssueIssueIdRouteRouteWithChildren, MainTestTestIdRouteRoute: MainTestTestIdRouteRouteWithChildren, MainalternativesBBuildIdRouteRoute: MainalternativesBBuildIdRouteRouteWithChildren, @@ -747,7 +747,7 @@ const MainRouteRouteWithChildren = MainRouteRoute._addFileChildren( export interface FileRoutesByFullPath { '': typeof MainRouteRouteWithChildren '/hardware': typeof MainHardwareRouteRouteWithChildren - '/issue': typeof MainIssueRouteRouteWithChildren + '/issues': typeof MainIssuesRouteRouteWithChildren '/tree': typeof MainTreeRouteRouteWithChildren '/': typeof MainIndexRoute '/i': typeof MainalternativesIRouteRouteWithChildren @@ -757,7 +757,7 @@ export interface FileRoutesByFullPath { '/test/$testId': typeof MainTestTestIdRouteRouteWithChildren '/tree/$treeId': typeof MainTreeTreeIdRouteRouteWithChildren '/hardware/': typeof MainHardwareIndexRoute - '/issue/': typeof MainIssueIndexRoute + '/issues/': typeof MainIssuesIndexRoute '/tree/': typeof MainTreeIndexRoute '/b/$buildId': typeof MainalternativesBBuildIdRouteRouteWithChildren '/i/$issueId': typeof MainalternativesIIssueIdRouteRouteWithChildren @@ -785,7 +785,7 @@ export interface FileRoutesByFullPath { export interface FileRoutesByTo { '/': typeof MainIndexRoute '/hardware': typeof MainHardwareIndexRoute - '/issue': typeof MainIssueIndexRoute + '/issues': typeof MainIssuesIndexRoute '/tree': typeof MainTreeIndexRoute '/i': typeof MainalternativesIIndexRoute '/build/$buildId': typeof MainBuildBuildIdIndexRoute @@ -811,7 +811,7 @@ export interface FileRoutesById { __root__: typeof rootRoute '/_main': typeof MainRouteRouteWithChildren '/_main/hardware': typeof MainHardwareRouteRouteWithChildren - '/_main/issue': typeof MainIssueRouteRouteWithChildren + '/_main/issues': typeof MainIssuesRouteRouteWithChildren '/_main/tree': typeof MainTreeRouteRouteWithChildren '/_main/': typeof MainIndexRoute '/_main/(alternatives)/i': typeof MainalternativesIRouteRouteWithChildren @@ -821,7 +821,7 @@ export interface FileRoutesById { '/_main/test/$testId': typeof MainTestTestIdRouteRouteWithChildren '/_main/tree/$treeId': typeof MainTreeTreeIdRouteRouteWithChildren '/_main/hardware/': typeof MainHardwareIndexRoute - '/_main/issue/': typeof MainIssueIndexRoute + '/_main/issues/': typeof MainIssuesIndexRoute '/_main/tree/': typeof MainTreeIndexRoute '/_main/(alternatives)/b/$buildId': typeof MainalternativesBBuildIdRouteRouteWithChildren '/_main/(alternatives)/i/$issueId': typeof MainalternativesIIssueIdRouteRouteWithChildren @@ -851,7 +851,7 @@ export interface FileRouteTypes { fullPaths: | '' | '/hardware' - | '/issue' + | '/issues' | '/tree' | '/' | '/i' @@ -861,7 +861,7 @@ export interface FileRouteTypes { | '/test/$testId' | '/tree/$treeId' | '/hardware/' - | '/issue/' + | '/issues/' | '/tree/' | '/b/$buildId' | '/i/$issueId' @@ -888,7 +888,7 @@ export interface FileRouteTypes { to: | '/' | '/hardware' - | '/issue' + | '/issues' | '/tree' | '/i' | '/build/$buildId' @@ -912,7 +912,7 @@ export interface FileRouteTypes { | '__root__' | '/_main' | '/_main/hardware' - | '/_main/issue' + | '/_main/issues' | '/_main/tree' | '/_main/' | '/_main/(alternatives)/i' @@ -922,7 +922,7 @@ export interface FileRouteTypes { | '/_main/test/$testId' | '/_main/tree/$treeId' | '/_main/hardware/' - | '/_main/issue/' + | '/_main/issues/' | '/_main/tree/' | '/_main/(alternatives)/b/$buildId' | '/_main/(alternatives)/i/$issueId' @@ -973,11 +973,12 @@ export const routeTree = rootRoute "filePath": "_main/route.tsx", "children": [ "/_main/hardware", - "/_main/issue", + "/_main/issues", "/_main/tree", "/_main/", "/_main/(alternatives)/i", "/_main/build/$buildId", + "/_main/issue/$issueId", "/_main/test/$testId", "/_main/(alternatives)/b/$buildId", "/_main/(alternatives)/t/$testId" @@ -991,12 +992,11 @@ export const routeTree = rootRoute "/_main/hardware/" ] }, - "/_main/issue": { - "filePath": "_main/issue/route.tsx", + "/_main/issues": { + "filePath": "_main/issues/route.tsx", "parent": "/_main", "children": [ - "/_main/issue/$issueId", - "/_main/issue/" + "/_main/issues/" ] }, "/_main/tree": { @@ -1042,7 +1042,7 @@ export const routeTree = rootRoute }, "/_main/issue/$issueId": { "filePath": "_main/issue/$issueId/route.tsx", - "parent": "/_main/issue", + "parent": "/_main", "children": [ "/_main/issue/$issueId/" ] @@ -1067,9 +1067,9 @@ export const routeTree = rootRoute "filePath": "_main/hardware/index.tsx", "parent": "/_main/hardware" }, - "/_main/issue/": { - "filePath": "_main/issue/index.tsx", - "parent": "/_main/issue" + "/_main/issues/": { + "filePath": "_main/issues/index.tsx", + "parent": "/_main/issues" }, "/_main/tree/": { "filePath": "_main/tree/index.tsx", diff --git a/dashboard/src/routes/_main/(alternatives)/i/index.tsx b/dashboard/src/routes/_main/(alternatives)/i/index.tsx index 1ca1c90d..bee2656b 100644 --- a/dashboard/src/routes/_main/(alternatives)/i/index.tsx +++ b/dashboard/src/routes/_main/(alternatives)/i/index.tsx @@ -4,7 +4,7 @@ export const Route = createFileRoute('/_main/(alternatives)/i/')({ loaderDeps: ({ search }) => ({ search }), loader: ({ deps, params }) => { throw redirect({ - to: '/issue', + to: '/issues', search: deps.search, params, }); diff --git a/dashboard/src/routes/_main/(alternatives)/i/route.tsx b/dashboard/src/routes/_main/(alternatives)/i/route.tsx index 22b85e2d..11619b75 100644 --- a/dashboard/src/routes/_main/(alternatives)/i/route.tsx +++ b/dashboard/src/routes/_main/(alternatives)/i/route.tsx @@ -7,13 +7,13 @@ import { import { issueListingDefaultValues, issueListingSearchSchema, -} from '@/routes/_main/issue/route'; +} from '@/routes/_main/issues/route'; export const Route = createFileRoute('/_main/(alternatives)/i')({ loaderDeps: ({ search }) => ({ search }), loader: ({ deps, params }) => { throw redirect({ - to: '/issue', + to: '/issues', search: deps.search, params, }); diff --git a/dashboard/src/routes/_main/issue/index.tsx b/dashboard/src/routes/_main/issues/index.tsx similarity index 72% rename from dashboard/src/routes/_main/issue/index.tsx rename to dashboard/src/routes/_main/issues/index.tsx index 0a78072c..4abda273 100644 --- a/dashboard/src/routes/_main/issue/index.tsx +++ b/dashboard/src/routes/_main/issues/index.tsx @@ -2,6 +2,6 @@ import { createFileRoute } from '@tanstack/react-router'; import IssueListing from '@/pages/IssueListing/IssueListing'; -export const Route = createFileRoute('/_main/issue/')({ +export const Route = createFileRoute('/_main/issues/')({ component: IssueListing, }); diff --git a/dashboard/src/routes/_main/issue/route.tsx b/dashboard/src/routes/_main/issues/route.tsx similarity index 93% rename from dashboard/src/routes/_main/issue/route.tsx rename to dashboard/src/routes/_main/issues/route.tsx index c64c83c6..0242d3e3 100644 --- a/dashboard/src/routes/_main/issue/route.tsx +++ b/dashboard/src/routes/_main/issues/route.tsx @@ -24,7 +24,7 @@ export const issueListingSearchSchema = z.object({ listingSize: zListingSize, } satisfies SearchSchema); -export const Route = createFileRoute('/_main/issue')({ +export const Route = createFileRoute('/_main/issues')({ validateSearch: issueListingSearchSchema, search: { middlewares: [stripSearchParams(issueListingDefaultValues)] }, }); diff --git a/dashboard/src/types/general.ts b/dashboard/src/types/general.ts index fdfcf066..19f85e05 100644 --- a/dashboard/src/types/general.ts +++ b/dashboard/src/types/general.ts @@ -361,6 +361,7 @@ export const getTargetFilter = ( export enum RedirectFrom { Tree = 'tree', Hardware = 'hardware', + Issues = 'issues', } -export type PossibleMonitorPath = '/tree' | '/hardware' | '/issue'; +export type PossibleMonitorPath = '/tree' | '/hardware' | '/issues';