diff --git a/webui2/src/routeTree.gen.ts b/webui2/src/routeTree.gen.ts index 7850f91393ea55bf88339175f23bcb95561cc6ec..26b4b3039a29173ba4e7b6d133df25d32605ec4b 100644 --- a/webui2/src/routeTree.gen.ts +++ b/webui2/src/routeTree.gen.ts @@ -13,11 +13,12 @@ import { Route as RepoRouteImport } from './routes/$repo' import { Route as IndexRouteImport } from './routes/index' import { Route as RepoIndexRouteImport } from './routes/$repo/index' import { Route as AuthSelectIdentityRouteImport } from './routes/auth/select-identity' -import { Route as RepoIssuesIndexRouteImport } from './routes/$repo/issues/index' -import { Route as RepoUserIdRouteImport } from './routes/$repo/user/$id' -import { Route as RepoIssuesNewRouteImport } from './routes/$repo/issues/new' -import { Route as RepoIssuesIdRouteImport } from './routes/$repo/issues/$id' +import { Route as RepoIssuesRouteImport } from './routes/$repo/_issues' import { Route as RepoCommitHashRouteImport } from './routes/$repo/commit/$hash' +import { Route as RepoIssuesIssuesIndexRouteImport } from './routes/$repo/_issues/issues/index' +import { Route as RepoIssuesUserIdRouteImport } from './routes/$repo/_issues/user/$id' +import { Route as RepoIssuesIssuesNewRouteImport } from './routes/$repo/_issues/issues/new' +import { Route as RepoIssuesIssuesIdRouteImport } from './routes/$repo/_issues/issues/$id' const RepoRoute = RepoRouteImport.update({ id: '/$repo', @@ -39,64 +40,69 @@ const AuthSelectIdentityRoute = AuthSelectIdentityRouteImport.update({ path: '/auth/select-identity', getParentRoute: () => rootRouteImport, } as any) -const RepoIssuesIndexRoute = RepoIssuesIndexRouteImport.update({ +const RepoIssuesRoute = RepoIssuesRouteImport.update({ + id: '/_issues', + getParentRoute: () => RepoRoute, +} as any) +const RepoCommitHashRoute = RepoCommitHashRouteImport.update({ + id: '/commit/$hash', + path: '/commit/$hash', + getParentRoute: () => RepoRoute, +} as any) +const RepoIssuesIssuesIndexRoute = RepoIssuesIssuesIndexRouteImport.update({ id: '/issues/', path: '/issues/', - getParentRoute: () => RepoRoute, + getParentRoute: () => RepoIssuesRoute, } as any) -const RepoUserIdRoute = RepoUserIdRouteImport.update({ +const RepoIssuesUserIdRoute = RepoIssuesUserIdRouteImport.update({ id: '/user/$id', path: '/user/$id', - getParentRoute: () => RepoRoute, + getParentRoute: () => RepoIssuesRoute, } as any) -const RepoIssuesNewRoute = RepoIssuesNewRouteImport.update({ +const RepoIssuesIssuesNewRoute = RepoIssuesIssuesNewRouteImport.update({ id: '/issues/new', path: '/issues/new', - getParentRoute: () => RepoRoute, + getParentRoute: () => RepoIssuesRoute, } as any) -const RepoIssuesIdRoute = RepoIssuesIdRouteImport.update({ +const RepoIssuesIssuesIdRoute = RepoIssuesIssuesIdRouteImport.update({ id: '/issues/$id', path: '/issues/$id', - getParentRoute: () => RepoRoute, -} as any) -const RepoCommitHashRoute = RepoCommitHashRouteImport.update({ - id: '/commit/$hash', - path: '/commit/$hash', - getParentRoute: () => RepoRoute, + getParentRoute: () => RepoIssuesRoute, } as any) export interface FileRoutesByFullPath { '/': typeof IndexRoute - '/$repo': typeof RepoRouteWithChildren + '/$repo': typeof RepoIssuesRouteWithChildren '/auth/select-identity': typeof AuthSelectIdentityRoute '/$repo/': typeof RepoIndexRoute '/$repo/commit/$hash': typeof RepoCommitHashRoute - '/$repo/issues/$id': typeof RepoIssuesIdRoute - '/$repo/issues/new': typeof RepoIssuesNewRoute - '/$repo/user/$id': typeof RepoUserIdRoute - '/$repo/issues/': typeof RepoIssuesIndexRoute + '/$repo/issues/$id': typeof RepoIssuesIssuesIdRoute + '/$repo/issues/new': typeof RepoIssuesIssuesNewRoute + '/$repo/user/$id': typeof RepoIssuesUserIdRoute + '/$repo/issues/': typeof RepoIssuesIssuesIndexRoute } export interface FileRoutesByTo { '/': typeof IndexRoute - '/auth/select-identity': typeof AuthSelectIdentityRoute '/$repo': typeof RepoIndexRoute + '/auth/select-identity': typeof AuthSelectIdentityRoute '/$repo/commit/$hash': typeof RepoCommitHashRoute - '/$repo/issues/$id': typeof RepoIssuesIdRoute - '/$repo/issues/new': typeof RepoIssuesNewRoute - '/$repo/user/$id': typeof RepoUserIdRoute - '/$repo/issues': typeof RepoIssuesIndexRoute + '/$repo/issues/$id': typeof RepoIssuesIssuesIdRoute + '/$repo/issues/new': typeof RepoIssuesIssuesNewRoute + '/$repo/user/$id': typeof RepoIssuesUserIdRoute + '/$repo/issues': typeof RepoIssuesIssuesIndexRoute } export interface FileRoutesById { __root__: typeof rootRouteImport '/': typeof IndexRoute '/$repo': typeof RepoRouteWithChildren + '/$repo/_issues': typeof RepoIssuesRouteWithChildren '/auth/select-identity': typeof AuthSelectIdentityRoute '/$repo/': typeof RepoIndexRoute '/$repo/commit/$hash': typeof RepoCommitHashRoute - '/$repo/issues/$id': typeof RepoIssuesIdRoute - '/$repo/issues/new': typeof RepoIssuesNewRoute - '/$repo/user/$id': typeof RepoUserIdRoute - '/$repo/issues/': typeof RepoIssuesIndexRoute + '/$repo/_issues/issues/$id': typeof RepoIssuesIssuesIdRoute + '/$repo/_issues/issues/new': typeof RepoIssuesIssuesNewRoute + '/$repo/_issues/user/$id': typeof RepoIssuesUserIdRoute + '/$repo/_issues/issues/': typeof RepoIssuesIssuesIndexRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath @@ -113,8 +119,8 @@ export interface FileRouteTypes { fileRoutesByTo: FileRoutesByTo to: | '/' - | '/auth/select-identity' | '/$repo' + | '/auth/select-identity' | '/$repo/commit/$hash' | '/$repo/issues/$id' | '/$repo/issues/new' @@ -124,13 +130,14 @@ export interface FileRouteTypes { | '__root__' | '/' | '/$repo' + | '/$repo/_issues' | '/auth/select-identity' | '/$repo/' | '/$repo/commit/$hash' - | '/$repo/issues/$id' - | '/$repo/issues/new' - | '/$repo/user/$id' - | '/$repo/issues/' + | '/$repo/_issues/issues/$id' + | '/$repo/_issues/issues/new' + | '/$repo/_issues/user/$id' + | '/$repo/_issues/issues/' fileRoutesById: FileRoutesById } export interface RootRouteChildren { @@ -169,60 +176,79 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AuthSelectIdentityRouteImport parentRoute: typeof rootRouteImport } - '/$repo/issues/': { - id: '/$repo/issues/' + '/$repo/_issues': { + id: '/$repo/_issues' + path: '' + fullPath: '/$repo' + preLoaderRoute: typeof RepoIssuesRouteImport + parentRoute: typeof RepoRoute + } + '/$repo/commit/$hash': { + id: '/$repo/commit/$hash' + path: '/commit/$hash' + fullPath: '/$repo/commit/$hash' + preLoaderRoute: typeof RepoCommitHashRouteImport + parentRoute: typeof RepoRoute + } + '/$repo/_issues/issues/': { + id: '/$repo/_issues/issues/' path: '/issues' fullPath: '/$repo/issues/' - preLoaderRoute: typeof RepoIssuesIndexRouteImport - parentRoute: typeof RepoRoute + preLoaderRoute: typeof RepoIssuesIssuesIndexRouteImport + parentRoute: typeof RepoIssuesRoute } - '/$repo/user/$id': { - id: '/$repo/user/$id' + '/$repo/_issues/user/$id': { + id: '/$repo/_issues/user/$id' path: '/user/$id' fullPath: '/$repo/user/$id' - preLoaderRoute: typeof RepoUserIdRouteImport - parentRoute: typeof RepoRoute + preLoaderRoute: typeof RepoIssuesUserIdRouteImport + parentRoute: typeof RepoIssuesRoute } - '/$repo/issues/new': { - id: '/$repo/issues/new' + '/$repo/_issues/issues/new': { + id: '/$repo/_issues/issues/new' path: '/issues/new' fullPath: '/$repo/issues/new' - preLoaderRoute: typeof RepoIssuesNewRouteImport - parentRoute: typeof RepoRoute + preLoaderRoute: typeof RepoIssuesIssuesNewRouteImport + parentRoute: typeof RepoIssuesRoute } - '/$repo/issues/$id': { - id: '/$repo/issues/$id' + '/$repo/_issues/issues/$id': { + id: '/$repo/_issues/issues/$id' path: '/issues/$id' fullPath: '/$repo/issues/$id' - preLoaderRoute: typeof RepoIssuesIdRouteImport - parentRoute: typeof RepoRoute - } - '/$repo/commit/$hash': { - id: '/$repo/commit/$hash' - path: '/commit/$hash' - fullPath: '/$repo/commit/$hash' - preLoaderRoute: typeof RepoCommitHashRouteImport - parentRoute: typeof RepoRoute + preLoaderRoute: typeof RepoIssuesIssuesIdRouteImport + parentRoute: typeof RepoIssuesRoute } } } +interface RepoIssuesRouteChildren { + RepoIssuesIssuesIdRoute: typeof RepoIssuesIssuesIdRoute + RepoIssuesIssuesNewRoute: typeof RepoIssuesIssuesNewRoute + RepoIssuesUserIdRoute: typeof RepoIssuesUserIdRoute + RepoIssuesIssuesIndexRoute: typeof RepoIssuesIssuesIndexRoute +} + +const RepoIssuesRouteChildren: RepoIssuesRouteChildren = { + RepoIssuesIssuesIdRoute: RepoIssuesIssuesIdRoute, + RepoIssuesIssuesNewRoute: RepoIssuesIssuesNewRoute, + RepoIssuesUserIdRoute: RepoIssuesUserIdRoute, + RepoIssuesIssuesIndexRoute: RepoIssuesIssuesIndexRoute, +} + +const RepoIssuesRouteWithChildren = RepoIssuesRoute._addFileChildren( + RepoIssuesRouteChildren, +) + interface RepoRouteChildren { + RepoIssuesRoute: typeof RepoIssuesRouteWithChildren RepoIndexRoute: typeof RepoIndexRoute RepoCommitHashRoute: typeof RepoCommitHashRoute - RepoIssuesIdRoute: typeof RepoIssuesIdRoute - RepoIssuesNewRoute: typeof RepoIssuesNewRoute - RepoUserIdRoute: typeof RepoUserIdRoute - RepoIssuesIndexRoute: typeof RepoIssuesIndexRoute } const RepoRouteChildren: RepoRouteChildren = { + RepoIssuesRoute: RepoIssuesRouteWithChildren, RepoIndexRoute: RepoIndexRoute, RepoCommitHashRoute: RepoCommitHashRoute, - RepoIssuesIdRoute: RepoIssuesIdRoute, - RepoIssuesNewRoute: RepoIssuesNewRoute, - RepoUserIdRoute: RepoUserIdRoute, - RepoIssuesIndexRoute: RepoIssuesIndexRoute, } const RepoRouteWithChildren = RepoRoute._addFileChildren(RepoRouteChildren) diff --git a/webui2/src/routes/$repo.tsx b/webui2/src/routes/$repo.tsx index 25332233f84492f4ac0333315f5f7681e889e8cc..881315009cfd0a8870ba5311189a224be795d91f 100644 --- a/webui2/src/routes/$repo.tsx +++ b/webui2/src/routes/$repo.tsx @@ -1,26 +1,9 @@ import { createFileRoute } from "@tanstack/react-router"; -import { - type ValidLabelsQuery, - ValidLabelsDocument, - type AllIdentitiesQuery, - AllIdentitiesDocument, -} from "@/__generated__/graphql"; - export const Route = createFileRoute("/$repo")({ - beforeLoad: ({ params: { repo }, context: { preloadQuery } }) => { + beforeLoad: ({ params: { repo } }) => { // Normalize the repo slug: "_" means the default (null) repo const ref = repo === "_" ? null : repo; - - // Preload labels and identities shared by all child routes (issue list, - // bug detail, etc.). These are stable across filter/page changes. - const labelsRef = preloadQuery(ValidLabelsDocument, { - variables: { ref }, - }); - const identitiesRef = preloadQuery(AllIdentitiesDocument, { - variables: { ref }, - }); - - return { ref, labelsRef, identitiesRef }; + return { ref }; }, }); diff --git a/webui2/src/routes/$repo/_issues.tsx b/webui2/src/routes/$repo/_issues.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b6143d3e517af6fe7104e4f3ba72e88f827fbf40 --- /dev/null +++ b/webui2/src/routes/$repo/_issues.tsx @@ -0,0 +1,23 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { + type ValidLabelsQuery, + ValidLabelsDocument, + type AllIdentitiesQuery, + AllIdentitiesDocument, +} from "@/__generated__/graphql"; + +// Pathless layout route for all issue-related pages under /$repo. +// Preloads labels and identities shared by the issue list, detail, +// new issue form, and user profile pages. +export const Route = createFileRoute("/$repo/_issues")({ + beforeLoad: ({ context: { preloadQuery, ref } }) => { + const labelsRef = preloadQuery(ValidLabelsDocument, { + variables: { ref }, + }); + const identitiesRef = preloadQuery(AllIdentitiesDocument, { + variables: { ref }, + }); + return { labelsRef, identitiesRef }; + }, +}); diff --git a/webui2/src/routes/$repo/issues/$id.tsx b/webui2/src/routes/$repo/_issues/issues/$id.tsx similarity index 98% rename from webui2/src/routes/$repo/issues/$id.tsx rename to webui2/src/routes/$repo/_issues/issues/$id.tsx index 573d39478c57bea1d1a212163df8e35be90fcc11..734b93d87739ea1f2d45c760fc677c71565fc5b2 100644 --- a/webui2/src/routes/$repo/issues/$id.tsx +++ b/webui2/src/routes/$repo/_issues/issues/$id.tsx @@ -13,7 +13,7 @@ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Separator } from "@/components/ui/separator"; import { Skeleton } from "@/components/ui/skeleton"; -export const Route = createFileRoute("/$repo/issues/$id")({ +export const Route = createFileRoute("/$repo/_issues/issues/$id")({ component: RouteComponent, pendingComponent: BugDetailSkeleton, loader: async ({ context: { preloadQuery, ref }, params: { id } }) => { diff --git a/webui2/src/routes/$repo/issues/index.tsx b/webui2/src/routes/$repo/_issues/issues/index.tsx similarity index 99% rename from webui2/src/routes/$repo/issues/index.tsx rename to webui2/src/routes/$repo/_issues/issues/index.tsx index 309c05eed7bb161937120ea8d94fe373f0e70028..ad5de3129c208933ca4dfbf09ff5d35c172d8038 100644 --- a/webui2/src/routes/$repo/issues/index.tsx +++ b/webui2/src/routes/$repo/_issues/issues/index.tsx @@ -19,7 +19,7 @@ const issuesSearchSchema = v.object({ after: v.fallback(v.string(), ""), }); -export const Route = createFileRoute("/$repo/issues/")({ +export const Route = createFileRoute("/$repo/_issues/issues/")({ component: RouteComponent, pendingComponent: BugListSkeleton, validateSearch: (search) => v.parse(issuesSearchSchema, search), diff --git a/webui2/src/routes/$repo/issues/new.tsx b/webui2/src/routes/$repo/_issues/issues/new.tsx similarity index 98% rename from webui2/src/routes/$repo/issues/new.tsx rename to webui2/src/routes/$repo/_issues/issues/new.tsx index 3bc47e6a4a6027b7b119a9888ea2fea24dbcd844..bae94c7a1034022cc20f55852e3a2b3401c240db 100644 --- a/webui2/src/routes/$repo/issues/new.tsx +++ b/webui2/src/routes/$repo/_issues/issues/new.tsx @@ -9,7 +9,7 @@ import { ButtonLink } from "@/components/ui/button-link"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; -export const Route = createFileRoute("/$repo/issues/new")({ +export const Route = createFileRoute("/$repo/_issues/issues/new")({ component: RouteComponent, }); diff --git a/webui2/src/routes/$repo/user/$id.tsx b/webui2/src/routes/$repo/_issues/user/$id.tsx similarity index 99% rename from webui2/src/routes/$repo/user/$id.tsx rename to webui2/src/routes/$repo/_issues/user/$id.tsx index 3a2c1c55520860229c4ab570d164e6afa38d4277..3fd70c8b931c5b4cb23bd7b29140ea04f378a432 100644 --- a/webui2/src/routes/$repo/user/$id.tsx +++ b/webui2/src/routes/$repo/_issues/user/$id.tsx @@ -26,7 +26,7 @@ import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { cn } from "@/lib/utils"; -export const Route = createFileRoute("/$repo/user/$id")({ +export const Route = createFileRoute("/$repo/_issues/user/$id")({ component: RouteComponent, });