From 882b29d7a14e12290bcff2c147ddbc6e9666740e Mon Sep 17 00:00:00 2001 From: lonelyhentxi Date: Fri, 13 Jun 2025 04:02:01 +0800 Subject: [PATCH] feat: task ui basic done --- .vscode/settings.json | 14 +- .vscode/tasks.json | 112 ++ Cargo.toml | 2 + .../src/graphql/domains/subscribers.rs | 9 +- apps/recorder/src/graphql/schema.rs | 1 + apps/recorder/src/models/subscriber_tasks.rs | 24 +- ...-actions.tsx => dropdown-menu-actions.tsx} | 16 +- apps/webui/src/infra/graphql/gql/graphql.ts | 29 +- apps/webui/src/presentation/routeTree.gen.ts | 1021 +++++++---------- .../routes/_app/credential3rd/edit.$id.tsx | 19 +- .../routes/_app/credential3rd/manage.tsx | 9 +- .../routes/_app/subscriptions/manage.tsx | 9 +- .../routes/_app/tasks/-status-badge.tsx | 44 + .../routes/_app/tasks/detail.$id.tsx | 231 +++- .../presentation/routes/_app/tasks/manage.tsx | 220 +--- justfile | 12 +- package.json | 12 +- 17 files changed, 949 insertions(+), 835 deletions(-) create mode 100644 .vscode/tasks.json rename apps/webui/src/components/ui/{data-table-row-actions.tsx => dropdown-menu-actions.tsx} (80%) create mode 100644 apps/webui/src/presentation/routes/_app/tasks/-status-badge.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index e060323..d69ffa3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -41,11 +41,11 @@ ], "rust-analyzer.cargo.features": "all", // https://github.com/rust-lang/rust/issues/141540 - "rust-analyzer.cargo.targetDir": "target/rust-analyzer", - "rust-analyzer.check.extraEnv": { - "CARGO_TARGET_DIR": "target/rust-analyzer" - }, - "rust-analyzer.cargo.extraEnv": { - "CARGO_TARGET_DIR": "target/analyzer" - } + // "rust-analyzer.cargo.targetDir": "target/rust-analyzer", + // "rust-analyzer.check.extraEnv": { + // "CARGO_TARGET_DIR": "target/rust-analyzer" + // }, + // "rust-analyzer.cargo.extraEnv": { + // "CARGO_TARGET_DIR": "target/analyzer" + // } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..590bc4b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,112 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "dev-all", + "dependsOn": [ + "dev-webui", + "dev-recorder", + "dev-proxy", + "dev-codegen-wait", + "dev-deps", + ], + "dependsOrder": "parallel", + "group": { + "kind": "build", + "isDefault": false, + }, + "presentation": { + "group": "new-group", + "echo": true, + "reveal": "always", + "panel": "shared", + "clear": false + } + }, + { + "label": "dev-webui", + "type": "shell", + "command": "just", + "args": [ + "dev-webui" + ], + "isBackground": true, + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "always", + "focus": true, + "showReuseMessage": true, + "clear": true, + } + }, + { + "label": "dev-deps", + "type": "shell", + "command": "just", + "args": [ + "dev-deps" + ], + "isBackground": true, + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "never", + "focus": false, + "showReuseMessage": true, + "clear": true, + } + }, + { + "label": "dev-codegen-wait", + "type": "shell", + "command": "just", + "args": [ + "dev-codegen-wait" + ], + "isBackground": true, + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "never", + "focus": false, + "showReuseMessage": true, + "clear": true, + } + }, + { + "label": "dev-recorder", + "type": "shell", + "command": "just", + "args": [ + "dev-recorder" + ], + "isBackground": true, + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "never", + "focus": false, + "showReuseMessage": true, + "clear": true, + } + }, + { + "label": "dev-proxy", + "type": "shell", + "command": "just", + "args": [ + "dev-proxy", + ], + "isBackground": true, + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "never", + "focus": false, + "showReuseMessage": true, + "clear": true, + } + } + ] +} \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 04a5b82..9d94ca0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,8 @@ resolver = "2" [profile.dev] debug = 0 +# https://github.com/rust-lang/rust/issues/141540 +incremental = false # [simd not supported by cranelift](https://github.com/rust-lang/rustc_codegen_cranelift/issues/171) # codegen-backend = "cranelift" diff --git a/apps/recorder/src/graphql/domains/subscribers.rs b/apps/recorder/src/graphql/domains/subscribers.rs index 663e984..7c7e7f8 100644 --- a/apps/recorder/src/graphql/domains/subscribers.rs +++ b/apps/recorder/src/graphql/domains/subscribers.rs @@ -267,6 +267,7 @@ where Box::new( move |context: &ResolverContext| -> SeaResult> { let field_name = context.field().name(); + tracing::warn!("field_name: {:?}", field_name); if field_name == entity_create_one_mutation_field_name.as_str() || field_name == entity_create_batch_mutation_field_name.as_str() { @@ -291,7 +292,7 @@ where { let entity_key = get_entity_key::(context); let entity_column_key = get_entity_column_key::(context, column); - let column_name = context.entity_object.column_name.as_ref()(&entity_key, &entity_column_key); + context.guards.entity_guards.insert( entity_key.clone(), guard_entity_with_subscriber_id::(context, column), @@ -311,13 +312,9 @@ where generate_subscriber_id_filter_condition::(context, column), ); context.types.input_none_conversions.insert( - column_name.clone(), + entity_column_key.clone(), generate_default_subscriber_id_input_conversion::(context, column), ); - context - .entity_input - .insert_skips - .push(entity_column_key.clone()); context.entity_input.update_skips.push(entity_column_key); } diff --git a/apps/recorder/src/graphql/schema.rs b/apps/recorder/src/graphql/schema.rs index 9e5a6c8..229a99e 100644 --- a/apps/recorder/src/graphql/schema.rs +++ b/apps/recorder/src/graphql/schema.rs @@ -121,6 +121,7 @@ pub fn build_schema( builder.register_enumeration::(); builder.register_enumeration::(); builder.register_enumeration::(); + builder.register_enumeration::(); } builder = register_subscriptions_to_schema_builder(builder); diff --git a/apps/recorder/src/models/subscriber_tasks.rs b/apps/recorder/src/models/subscriber_tasks.rs index 2eb0fb0..d1dd7b8 100644 --- a/apps/recorder/src/models/subscriber_tasks.rs +++ b/apps/recorder/src/models/subscriber_tasks.rs @@ -1,7 +1,27 @@ use async_trait::async_trait; use sea_orm::entity::prelude::*; -pub use crate::task::{SubscriberTask, SubscriberTaskType}; +pub use crate::task::{ + SubscriberTask, SubscriberTaskType, SubscriberTaskTypeEnum, SubscriberTaskTypeVariant, + SubscriberTaskTypeVariantIter, +}; + +#[derive(Clone, Debug, PartialEq, Eq, DeriveActiveEnum, EnumIter, DeriveDisplay)] +#[sea_orm(rs_type = "String", db_type = "Text")] +pub enum SubscriberTaskStatus { + #[sea_orm(string_value = "Pending")] + Pending, + #[sea_orm(string_value = "Scheduled")] + Scheduled, + #[sea_orm(string_value = "Running")] + Running, + #[sea_orm(string_value = "Done")] + Done, + #[sea_orm(string_value = "Failed")] + Failed, + #[sea_orm(string_value = "Killed")] + Killed, +} #[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)] #[sea_orm(table_name = "subscriber_tasks")] @@ -11,7 +31,7 @@ pub struct Model { pub subscriber_id: i32, pub job: SubscriberTask, pub task_type: SubscriberTaskType, - pub status: String, + pub status: SubscriberTaskStatus, pub attempts: i32, pub max_attempts: i32, pub run_at: DateTimeUtc, diff --git a/apps/webui/src/components/ui/data-table-row-actions.tsx b/apps/webui/src/components/ui/dropdown-menu-actions.tsx similarity index 80% rename from apps/webui/src/components/ui/data-table-row-actions.tsx rename to apps/webui/src/components/ui/dropdown-menu-actions.tsx index cf630d2..02c012f 100644 --- a/apps/webui/src/components/ui/data-table-row-actions.tsx +++ b/apps/webui/src/components/ui/dropdown-menu-actions.tsx @@ -1,6 +1,5 @@ "use client"; -import type { Row } from "@tanstack/react-table"; import { MoreHorizontal } from "lucide-react"; import { Button } from "@/components/ui/button"; @@ -14,12 +13,11 @@ import { } from "@/components/ui/dropdown-menu"; import type * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; -import { ComponentProps, PropsWithChildren, useMemo } from "react"; +import { ComponentProps, PropsWithChildren } from "react"; -interface DataTableRowActionsProps +interface DropdownMenuActionsProps extends ComponentProps { - row: Row; - getId: (row: Row) => Id; + id: Id; showDetail?: boolean; showEdit?: boolean; showDelete?: boolean; @@ -28,9 +26,8 @@ interface DataTableRowActionsProps onEdit?: (id: Id) => void; } -export function DataTableRowActions({ - row, - getId, +export function DropdownMenuActions({ + id, showDetail, showDelete, showEdit, @@ -39,8 +36,7 @@ export function DataTableRowActions({ onEdit, children, ...rest -}: PropsWithChildren>) { - const id = useMemo(() => getId(row), [getId, row]); +}: PropsWithChildren>) { return ( diff --git a/apps/webui/src/infra/graphql/gql/graphql.ts b/apps/webui/src/infra/graphql/gql/graphql.ts index 2191b48..816d952 100644 --- a/apps/webui/src/infra/graphql/gql/graphql.ts +++ b/apps/webui/src/infra/graphql/gql/graphql.ts @@ -133,6 +133,7 @@ export type BangumiInsertInput = { savePath?: InputMaybe; season: Scalars['Int']['input']; seasonRaw?: InputMaybe; + subscriberId: Scalars['Int']['input']; updatedAt?: InputMaybe; }; @@ -266,6 +267,7 @@ export type Credential3rdInsertInput = { credentialType: Credential3rdTypeEnum; id?: InputMaybe; password?: InputMaybe; + subscriberId: Scalars['Int']['input']; updatedAt?: InputMaybe; userAgent?: InputMaybe; username?: InputMaybe; @@ -448,6 +450,7 @@ export type DownloadersInsertInput = { id?: InputMaybe; password: Scalars['String']['input']; savePath: Scalars['String']['input']; + subscriberId: Scalars['Int']['input']; updatedAt?: InputMaybe; username: Scalars['String']['input']; }; @@ -563,6 +566,7 @@ export type DownloadsInsertInput = { rawName: Scalars['String']['input']; savePath?: InputMaybe; status: DownloadStatusEnum; + subscriberId: Scalars['Int']['input']; updatedAt?: InputMaybe; url: Scalars['String']['input']; }; @@ -725,6 +729,7 @@ export type EpisodesInsertInput = { season: Scalars['Int']['input']; seasonRaw?: InputMaybe; source?: InputMaybe; + subscriberId: Scalars['Int']['input']; subtitle?: InputMaybe; updatedAt?: InputMaybe; }; @@ -1191,6 +1196,16 @@ export type SubscriberIdFilterInput = { eq?: InputMaybe; }; +export const SubscriberTaskStatusEnum = { + Done: 'Done', + Failed: 'Failed', + Killed: 'Killed', + Pending: 'Pending', + Running: 'Running', + Scheduled: 'Scheduled' +} as const; + +export type SubscriberTaskStatusEnum = typeof SubscriberTaskStatusEnum[keyof typeof SubscriberTaskStatusEnum]; export const SubscriberTaskTypeEnum = { SyncOneSubscriptionFeedsFull: 'sync_one_subscription_feeds_full', SyncOneSubscriptionFeedsIncremental: 'sync_one_subscription_feeds_incremental', @@ -1210,7 +1225,7 @@ export type SubscriberTasks = { maxAttempts: Scalars['Int']['output']; priority: Scalars['Int']['output']; runAt: Scalars['String']['output']; - status: Scalars['String']['output']; + status: SubscriberTaskStatusEnum; subscriber?: Maybe; subscriberId: Scalars['Int']['output']; taskType: SubscriberTaskTypeEnum; @@ -1228,7 +1243,7 @@ export type SubscriberTasksBasic = { maxAttempts: Scalars['Int']['output']; priority: Scalars['Int']['output']; runAt: Scalars['String']['output']; - status: Scalars['String']['output']; + status: SubscriberTaskStatusEnum; subscriberId: Scalars['Int']['output']; taskType: SubscriberTaskTypeEnum; }; @@ -1276,7 +1291,8 @@ export type SubscriberTasksInsertInput = { maxAttempts: Scalars['Int']['input']; priority: Scalars['Int']['input']; runAt: Scalars['String']['input']; - status: Scalars['String']['input']; + status: SubscriberTaskStatusEnum; + subscriberId: Scalars['Int']['input']; taskType: SubscriberTaskTypeEnum; }; @@ -1307,7 +1323,7 @@ export type SubscriberTasksUpdateInput = { maxAttempts?: InputMaybe; priority?: InputMaybe; runAt?: InputMaybe; - status?: InputMaybe; + status?: InputMaybe; taskType?: InputMaybe; }; @@ -1433,6 +1449,7 @@ export type SubscriptionBangumiFilterInput = { export type SubscriptionBangumiInsertInput = { bangumiId: Scalars['Int']['input']; id?: InputMaybe; + subscriberId: Scalars['Int']['input']; subscriptionId: Scalars['Int']['input']; }; @@ -1515,6 +1532,7 @@ export type SubscriptionEpisodeFilterInput = { export type SubscriptionEpisodeInsertInput = { episodeId: Scalars['Int']['input']; id?: InputMaybe; + subscriberId: Scalars['Int']['input']; subscriptionId: Scalars['Int']['input']; }; @@ -1627,6 +1645,7 @@ export type SubscriptionsInsertInput = { enabled: Scalars['Boolean']['input']; id?: InputMaybe; sourceUrl: Scalars['String']['input']; + subscriberId: Scalars['Int']['input']; updatedAt?: InputMaybe; }; @@ -1790,7 +1809,7 @@ export type GetTasksQueryVariables = Exact<{ }>; -export type GetTasksQuery = { __typename?: 'Query', subscriberTasks: { __typename?: 'SubscriberTasksConnection', nodes: Array<{ __typename?: 'SubscriberTasks', id: string, job: any, taskType: SubscriberTaskTypeEnum, status: string, attempts: number, maxAttempts: number, runAt: string, lastError?: string | null, lockAt?: string | null, lockBy?: string | null, doneAt?: string | null, priority: number }>, paginationInfo?: { __typename?: 'PaginationInfo', total: number, pages: number } | null } }; +export type GetTasksQuery = { __typename?: 'Query', subscriberTasks: { __typename?: 'SubscriberTasksConnection', nodes: Array<{ __typename?: 'SubscriberTasks', id: string, job: any, taskType: SubscriberTaskTypeEnum, status: SubscriberTaskStatusEnum, attempts: number, maxAttempts: number, runAt: string, lastError?: string | null, lockAt?: string | null, lockBy?: string | null, doneAt?: string | null, priority: number }>, paginationInfo?: { __typename?: 'PaginationInfo', total: number, pages: number } | null } }; export const GetCredential3rdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCredential3rd"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filters"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Credential3rdFilterInput"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Credential3rdOrderInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"credential3rd"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filters"}}},{"kind":"Argument","name":{"kind":"Name","value":"orderBy"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"cookies"}},{"kind":"Field","name":{"kind":"Name","value":"username"}},{"kind":"Field","name":{"kind":"Name","value":"password"}},{"kind":"Field","name":{"kind":"Name","value":"userAgent"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"credentialType"}}]}},{"kind":"Field","name":{"kind":"Name","value":"paginationInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"pages"}}]}}]}}]}}]} as unknown as DocumentNode; diff --git a/apps/webui/src/presentation/routeTree.gen.ts b/apps/webui/src/presentation/routeTree.gen.ts index a033c3a..a1c5873 100644 --- a/apps/webui/src/presentation/routeTree.gen.ts +++ b/apps/webui/src/presentation/routeTree.gen.ts @@ -8,400 +8,556 @@ // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. -// Import Routes +import { Route as rootRouteImport } from './routes/__root' +import { Route as AboutRouteImport } from './routes/about' +import { Route as R404RouteImport } from './routes/404' +import { Route as AppRouteRouteImport } from './routes/_app/route' +import { Route as IndexRouteImport } from './routes/index' +import { Route as AuthSignUpRouteImport } from './routes/auth/sign-up' +import { Route as AuthSignInRouteImport } from './routes/auth/sign-in' +import { Route as AppTasksRouteRouteImport } from './routes/_app/tasks/route' +import { Route as AppSubscriptionsRouteRouteImport } from './routes/_app/subscriptions/route' +import { Route as AppSettingsRouteRouteImport } from './routes/_app/settings/route' +import { Route as AppPlaygroundRouteRouteImport } from './routes/_app/playground/route' +import { Route as AppCredential3rdRouteRouteImport } from './routes/_app/credential3rd/route' +import { Route as AppBangumiRouteRouteImport } from './routes/_app/bangumi/route' +import { Route as AuthOidcCallbackRouteImport } from './routes/auth/oidc/callback' +import { Route as AppTasksManageRouteImport } from './routes/_app/tasks/manage' +import { Route as AppSubscriptionsManageRouteImport } from './routes/_app/subscriptions/manage' +import { Route as AppSubscriptionsCreateRouteImport } from './routes/_app/subscriptions/create' +import { Route as AppSettingsDownloaderRouteImport } from './routes/_app/settings/downloader' +import { Route as AppPlaygroundGraphqlApiRouteImport } from './routes/_app/playground/graphql-api' +import { Route as AppCredential3rdManageRouteImport } from './routes/_app/credential3rd/manage' +import { Route as AppCredential3rdCreateRouteImport } from './routes/_app/credential3rd/create' +import { Route as AppBangumiManageRouteImport } from './routes/_app/bangumi/manage' +import { Route as AppExploreExploreRouteImport } from './routes/_app/_explore/explore' +import { Route as AppTasksDetailIdRouteImport } from './routes/_app/tasks/detail.$id' +import { Route as AppSubscriptionsEditIdRouteImport } from './routes/_app/subscriptions/edit.$id' +import { Route as AppSubscriptionsDetailIdRouteImport } from './routes/_app/subscriptions/detail.$id' +import { Route as AppCredential3rdEditIdRouteImport } from './routes/_app/credential3rd/edit.$id' +import { Route as AppCredential3rdDetailIdRouteImport } from './routes/_app/credential3rd/detail.$id' -import { Route as rootRoute } from './routes/__root' -import { Route as AboutImport } from './routes/about' -import { Route as R404Import } from './routes/404' -import { Route as AppRouteImport } from './routes/_app/route' -import { Route as IndexImport } from './routes/index' -import { Route as AuthSignUpImport } from './routes/auth/sign-up' -import { Route as AuthSignInImport } from './routes/auth/sign-in' -import { Route as AppTasksRouteImport } from './routes/_app/tasks/route' -import { Route as AppSubscriptionsRouteImport } from './routes/_app/subscriptions/route' -import { Route as AppSettingsRouteImport } from './routes/_app/settings/route' -import { Route as AppPlaygroundRouteImport } from './routes/_app/playground/route' -import { Route as AppCredential3rdRouteImport } from './routes/_app/credential3rd/route' -import { Route as AppBangumiRouteImport } from './routes/_app/bangumi/route' -import { Route as AuthOidcCallbackImport } from './routes/auth/oidc/callback' -import { Route as AppTasksManageImport } from './routes/_app/tasks/manage' -import { Route as AppSubscriptionsManageImport } from './routes/_app/subscriptions/manage' -import { Route as AppSubscriptionsCreateImport } from './routes/_app/subscriptions/create' -import { Route as AppSettingsDownloaderImport } from './routes/_app/settings/downloader' -import { Route as AppPlaygroundGraphqlApiImport } from './routes/_app/playground/graphql-api' -import { Route as AppCredential3rdManageImport } from './routes/_app/credential3rd/manage' -import { Route as AppCredential3rdCreateImport } from './routes/_app/credential3rd/create' -import { Route as AppBangumiManageImport } from './routes/_app/bangumi/manage' -import { Route as AppExploreExploreImport } from './routes/_app/_explore/explore' -import { Route as AppTasksDetailIdImport } from './routes/_app/tasks/detail.$id' -import { Route as AppSubscriptionsEditIdImport } from './routes/_app/subscriptions/edit.$id' -import { Route as AppSubscriptionsDetailIdImport } from './routes/_app/subscriptions/detail.$id' -import { Route as AppCredential3rdEditIdImport } from './routes/_app/credential3rd/edit.$id' -import { Route as AppCredential3rdDetailIdImport } from './routes/_app/credential3rd/detail.$id' - -// Create/Update Routes - -const AboutRoute = AboutImport.update({ +const AboutRoute = AboutRouteImport.update({ id: '/about', path: '/about', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const R404Route = R404Import.update({ +const R404Route = R404RouteImport.update({ id: '/404', path: '/404', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AppRouteRoute = AppRouteImport.update({ +const AppRouteRoute = AppRouteRouteImport.update({ id: '/_app', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const IndexRoute = IndexImport.update({ +const IndexRoute = IndexRouteImport.update({ id: '/', path: '/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AuthSignUpRoute = AuthSignUpImport.update({ +const AuthSignUpRoute = AuthSignUpRouteImport.update({ id: '/auth/sign-up', path: '/auth/sign-up', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AuthSignInRoute = AuthSignInImport.update({ +const AuthSignInRoute = AuthSignInRouteImport.update({ id: '/auth/sign-in', path: '/auth/sign-in', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AppTasksRouteRoute = AppTasksRouteImport.update({ +const AppTasksRouteRoute = AppTasksRouteRouteImport.update({ id: '/tasks', path: '/tasks', getParentRoute: () => AppRouteRoute, } as any) - -const AppSubscriptionsRouteRoute = AppSubscriptionsRouteImport.update({ +const AppSubscriptionsRouteRoute = AppSubscriptionsRouteRouteImport.update({ id: '/subscriptions', path: '/subscriptions', getParentRoute: () => AppRouteRoute, } as any) - -const AppSettingsRouteRoute = AppSettingsRouteImport.update({ +const AppSettingsRouteRoute = AppSettingsRouteRouteImport.update({ id: '/settings', path: '/settings', getParentRoute: () => AppRouteRoute, } as any) - -const AppPlaygroundRouteRoute = AppPlaygroundRouteImport.update({ +const AppPlaygroundRouteRoute = AppPlaygroundRouteRouteImport.update({ id: '/playground', path: '/playground', getParentRoute: () => AppRouteRoute, } as any) - -const AppCredential3rdRouteRoute = AppCredential3rdRouteImport.update({ +const AppCredential3rdRouteRoute = AppCredential3rdRouteRouteImport.update({ id: '/credential3rd', path: '/credential3rd', getParentRoute: () => AppRouteRoute, } as any) - -const AppBangumiRouteRoute = AppBangumiRouteImport.update({ +const AppBangumiRouteRoute = AppBangumiRouteRouteImport.update({ id: '/bangumi', path: '/bangumi', getParentRoute: () => AppRouteRoute, } as any) - -const AuthOidcCallbackRoute = AuthOidcCallbackImport.update({ +const AuthOidcCallbackRoute = AuthOidcCallbackRouteImport.update({ id: '/auth/oidc/callback', path: '/auth/oidc/callback', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AppTasksManageRoute = AppTasksManageImport.update({ +const AppTasksManageRoute = AppTasksManageRouteImport.update({ id: '/manage', path: '/manage', getParentRoute: () => AppTasksRouteRoute, } as any) - -const AppSubscriptionsManageRoute = AppSubscriptionsManageImport.update({ +const AppSubscriptionsManageRoute = AppSubscriptionsManageRouteImport.update({ id: '/manage', path: '/manage', getParentRoute: () => AppSubscriptionsRouteRoute, } as any) - -const AppSubscriptionsCreateRoute = AppSubscriptionsCreateImport.update({ +const AppSubscriptionsCreateRoute = AppSubscriptionsCreateRouteImport.update({ id: '/create', path: '/create', getParentRoute: () => AppSubscriptionsRouteRoute, } as any) - -const AppSettingsDownloaderRoute = AppSettingsDownloaderImport.update({ +const AppSettingsDownloaderRoute = AppSettingsDownloaderRouteImport.update({ id: '/downloader', path: '/downloader', getParentRoute: () => AppSettingsRouteRoute, } as any) - -const AppPlaygroundGraphqlApiRoute = AppPlaygroundGraphqlApiImport.update({ +const AppPlaygroundGraphqlApiRoute = AppPlaygroundGraphqlApiRouteImport.update({ id: '/graphql-api', path: '/graphql-api', getParentRoute: () => AppPlaygroundRouteRoute, } as any).lazy(() => import('./routes/_app/playground/graphql-api.lazy').then((d) => d.Route), ) - -const AppCredential3rdManageRoute = AppCredential3rdManageImport.update({ +const AppCredential3rdManageRoute = AppCredential3rdManageRouteImport.update({ id: '/manage', path: '/manage', getParentRoute: () => AppCredential3rdRouteRoute, } as any) - -const AppCredential3rdCreateRoute = AppCredential3rdCreateImport.update({ +const AppCredential3rdCreateRoute = AppCredential3rdCreateRouteImport.update({ id: '/create', path: '/create', getParentRoute: () => AppCredential3rdRouteRoute, } as any) - -const AppBangumiManageRoute = AppBangumiManageImport.update({ +const AppBangumiManageRoute = AppBangumiManageRouteImport.update({ id: '/manage', path: '/manage', getParentRoute: () => AppBangumiRouteRoute, } as any) - -const AppExploreExploreRoute = AppExploreExploreImport.update({ +const AppExploreExploreRoute = AppExploreExploreRouteImport.update({ id: '/_explore/explore', path: '/explore', getParentRoute: () => AppRouteRoute, } as any) - -const AppTasksDetailIdRoute = AppTasksDetailIdImport.update({ +const AppTasksDetailIdRoute = AppTasksDetailIdRouteImport.update({ id: '/detail/$id', path: '/detail/$id', getParentRoute: () => AppTasksRouteRoute, } as any) - -const AppSubscriptionsEditIdRoute = AppSubscriptionsEditIdImport.update({ +const AppSubscriptionsEditIdRoute = AppSubscriptionsEditIdRouteImport.update({ id: '/edit/$id', path: '/edit/$id', getParentRoute: () => AppSubscriptionsRouteRoute, } as any) - -const AppSubscriptionsDetailIdRoute = AppSubscriptionsDetailIdImport.update({ - id: '/detail/$id', - path: '/detail/$id', - getParentRoute: () => AppSubscriptionsRouteRoute, -} as any) - -const AppCredential3rdEditIdRoute = AppCredential3rdEditIdImport.update({ +const AppSubscriptionsDetailIdRoute = + AppSubscriptionsDetailIdRouteImport.update({ + id: '/detail/$id', + path: '/detail/$id', + getParentRoute: () => AppSubscriptionsRouteRoute, + } as any) +const AppCredential3rdEditIdRoute = AppCredential3rdEditIdRouteImport.update({ id: '/edit/$id', path: '/edit/$id', getParentRoute: () => AppCredential3rdRouteRoute, } as any) +const AppCredential3rdDetailIdRoute = + AppCredential3rdDetailIdRouteImport.update({ + id: '/detail/$id', + path: '/detail/$id', + getParentRoute: () => AppCredential3rdRouteRoute, + } as any) -const AppCredential3rdDetailIdRoute = AppCredential3rdDetailIdImport.update({ - id: '/detail/$id', - path: '/detail/$id', - getParentRoute: () => AppCredential3rdRouteRoute, -} as any) - -// Populate the FileRoutesByPath interface +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof AppRouteRouteWithChildren + '/404': typeof R404Route + '/about': typeof AboutRoute + '/bangumi': typeof AppBangumiRouteRouteWithChildren + '/credential3rd': typeof AppCredential3rdRouteRouteWithChildren + '/playground': typeof AppPlaygroundRouteRouteWithChildren + '/settings': typeof AppSettingsRouteRouteWithChildren + '/subscriptions': typeof AppSubscriptionsRouteRouteWithChildren + '/tasks': typeof AppTasksRouteRouteWithChildren + '/auth/sign-in': typeof AuthSignInRoute + '/auth/sign-up': typeof AuthSignUpRoute + '/explore': typeof AppExploreExploreRoute + '/bangumi/manage': typeof AppBangumiManageRoute + '/credential3rd/create': typeof AppCredential3rdCreateRoute + '/credential3rd/manage': typeof AppCredential3rdManageRoute + '/playground/graphql-api': typeof AppPlaygroundGraphqlApiRoute + '/settings/downloader': typeof AppSettingsDownloaderRoute + '/subscriptions/create': typeof AppSubscriptionsCreateRoute + '/subscriptions/manage': typeof AppSubscriptionsManageRoute + '/tasks/manage': typeof AppTasksManageRoute + '/auth/oidc/callback': typeof AuthOidcCallbackRoute + '/credential3rd/detail/$id': typeof AppCredential3rdDetailIdRoute + '/credential3rd/edit/$id': typeof AppCredential3rdEditIdRoute + '/subscriptions/detail/$id': typeof AppSubscriptionsDetailIdRoute + '/subscriptions/edit/$id': typeof AppSubscriptionsEditIdRoute + '/tasks/detail/$id': typeof AppTasksDetailIdRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof AppRouteRouteWithChildren + '/404': typeof R404Route + '/about': typeof AboutRoute + '/bangumi': typeof AppBangumiRouteRouteWithChildren + '/credential3rd': typeof AppCredential3rdRouteRouteWithChildren + '/playground': typeof AppPlaygroundRouteRouteWithChildren + '/settings': typeof AppSettingsRouteRouteWithChildren + '/subscriptions': typeof AppSubscriptionsRouteRouteWithChildren + '/tasks': typeof AppTasksRouteRouteWithChildren + '/auth/sign-in': typeof AuthSignInRoute + '/auth/sign-up': typeof AuthSignUpRoute + '/explore': typeof AppExploreExploreRoute + '/bangumi/manage': typeof AppBangumiManageRoute + '/credential3rd/create': typeof AppCredential3rdCreateRoute + '/credential3rd/manage': typeof AppCredential3rdManageRoute + '/playground/graphql-api': typeof AppPlaygroundGraphqlApiRoute + '/settings/downloader': typeof AppSettingsDownloaderRoute + '/subscriptions/create': typeof AppSubscriptionsCreateRoute + '/subscriptions/manage': typeof AppSubscriptionsManageRoute + '/tasks/manage': typeof AppTasksManageRoute + '/auth/oidc/callback': typeof AuthOidcCallbackRoute + '/credential3rd/detail/$id': typeof AppCredential3rdDetailIdRoute + '/credential3rd/edit/$id': typeof AppCredential3rdEditIdRoute + '/subscriptions/detail/$id': typeof AppSubscriptionsDetailIdRoute + '/subscriptions/edit/$id': typeof AppSubscriptionsEditIdRoute + '/tasks/detail/$id': typeof AppTasksDetailIdRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/_app': typeof AppRouteRouteWithChildren + '/404': typeof R404Route + '/about': typeof AboutRoute + '/_app/bangumi': typeof AppBangumiRouteRouteWithChildren + '/_app/credential3rd': typeof AppCredential3rdRouteRouteWithChildren + '/_app/playground': typeof AppPlaygroundRouteRouteWithChildren + '/_app/settings': typeof AppSettingsRouteRouteWithChildren + '/_app/subscriptions': typeof AppSubscriptionsRouteRouteWithChildren + '/_app/tasks': typeof AppTasksRouteRouteWithChildren + '/auth/sign-in': typeof AuthSignInRoute + '/auth/sign-up': typeof AuthSignUpRoute + '/_app/_explore/explore': typeof AppExploreExploreRoute + '/_app/bangumi/manage': typeof AppBangumiManageRoute + '/_app/credential3rd/create': typeof AppCredential3rdCreateRoute + '/_app/credential3rd/manage': typeof AppCredential3rdManageRoute + '/_app/playground/graphql-api': typeof AppPlaygroundGraphqlApiRoute + '/_app/settings/downloader': typeof AppSettingsDownloaderRoute + '/_app/subscriptions/create': typeof AppSubscriptionsCreateRoute + '/_app/subscriptions/manage': typeof AppSubscriptionsManageRoute + '/_app/tasks/manage': typeof AppTasksManageRoute + '/auth/oidc/callback': typeof AuthOidcCallbackRoute + '/_app/credential3rd/detail/$id': typeof AppCredential3rdDetailIdRoute + '/_app/credential3rd/edit/$id': typeof AppCredential3rdEditIdRoute + '/_app/subscriptions/detail/$id': typeof AppSubscriptionsDetailIdRoute + '/_app/subscriptions/edit/$id': typeof AppSubscriptionsEditIdRoute + '/_app/tasks/detail/$id': typeof AppTasksDetailIdRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/404' + | '/about' + | '/bangumi' + | '/credential3rd' + | '/playground' + | '/settings' + | '/subscriptions' + | '/tasks' + | '/auth/sign-in' + | '/auth/sign-up' + | '/explore' + | '/bangumi/manage' + | '/credential3rd/create' + | '/credential3rd/manage' + | '/playground/graphql-api' + | '/settings/downloader' + | '/subscriptions/create' + | '/subscriptions/manage' + | '/tasks/manage' + | '/auth/oidc/callback' + | '/credential3rd/detail/$id' + | '/credential3rd/edit/$id' + | '/subscriptions/detail/$id' + | '/subscriptions/edit/$id' + | '/tasks/detail/$id' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/404' + | '/about' + | '/bangumi' + | '/credential3rd' + | '/playground' + | '/settings' + | '/subscriptions' + | '/tasks' + | '/auth/sign-in' + | '/auth/sign-up' + | '/explore' + | '/bangumi/manage' + | '/credential3rd/create' + | '/credential3rd/manage' + | '/playground/graphql-api' + | '/settings/downloader' + | '/subscriptions/create' + | '/subscriptions/manage' + | '/tasks/manage' + | '/auth/oidc/callback' + | '/credential3rd/detail/$id' + | '/credential3rd/edit/$id' + | '/subscriptions/detail/$id' + | '/subscriptions/edit/$id' + | '/tasks/detail/$id' + id: + | '__root__' + | '/' + | '/_app' + | '/404' + | '/about' + | '/_app/bangumi' + | '/_app/credential3rd' + | '/_app/playground' + | '/_app/settings' + | '/_app/subscriptions' + | '/_app/tasks' + | '/auth/sign-in' + | '/auth/sign-up' + | '/_app/_explore/explore' + | '/_app/bangumi/manage' + | '/_app/credential3rd/create' + | '/_app/credential3rd/manage' + | '/_app/playground/graphql-api' + | '/_app/settings/downloader' + | '/_app/subscriptions/create' + | '/_app/subscriptions/manage' + | '/_app/tasks/manage' + | '/auth/oidc/callback' + | '/_app/credential3rd/detail/$id' + | '/_app/credential3rd/edit/$id' + | '/_app/subscriptions/detail/$id' + | '/_app/subscriptions/edit/$id' + | '/_app/tasks/detail/$id' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AppRouteRoute: typeof AppRouteRouteWithChildren + R404Route: typeof R404Route + AboutRoute: typeof AboutRoute + AuthSignInRoute: typeof AuthSignInRoute + AuthSignUpRoute: typeof AuthSignUpRoute + AuthOidcCallbackRoute: typeof AuthOidcCallbackRoute +} declare module '@tanstack/react-router' { interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexImport - parentRoute: typeof rootRoute - } - '/_app': { - id: '/_app' - path: '' - fullPath: '' - preLoaderRoute: typeof AppRouteImport - parentRoute: typeof rootRoute + '/about': { + id: '/about' + path: '/about' + fullPath: '/about' + preLoaderRoute: typeof AboutRouteImport + parentRoute: typeof rootRouteImport } '/404': { id: '/404' path: '/404' fullPath: '/404' - preLoaderRoute: typeof R404Import - parentRoute: typeof rootRoute + preLoaderRoute: typeof R404RouteImport + parentRoute: typeof rootRouteImport } - '/about': { - id: '/about' - path: '/about' - fullPath: '/about' - preLoaderRoute: typeof AboutImport - parentRoute: typeof rootRoute + '/_app': { + id: '/_app' + path: '' + fullPath: '' + preLoaderRoute: typeof AppRouteRouteImport + parentRoute: typeof rootRouteImport } - '/_app/bangumi': { - id: '/_app/bangumi' - path: '/bangumi' - fullPath: '/bangumi' - preLoaderRoute: typeof AppBangumiRouteImport - parentRoute: typeof AppRouteImport - } - '/_app/credential3rd': { - id: '/_app/credential3rd' - path: '/credential3rd' - fullPath: '/credential3rd' - preLoaderRoute: typeof AppCredential3rdRouteImport - parentRoute: typeof AppRouteImport - } - '/_app/playground': { - id: '/_app/playground' - path: '/playground' - fullPath: '/playground' - preLoaderRoute: typeof AppPlaygroundRouteImport - parentRoute: typeof AppRouteImport - } - '/_app/settings': { - id: '/_app/settings' - path: '/settings' - fullPath: '/settings' - preLoaderRoute: typeof AppSettingsRouteImport - parentRoute: typeof AppRouteImport - } - '/_app/subscriptions': { - id: '/_app/subscriptions' - path: '/subscriptions' - fullPath: '/subscriptions' - preLoaderRoute: typeof AppSubscriptionsRouteImport - parentRoute: typeof AppRouteImport - } - '/_app/tasks': { - id: '/_app/tasks' - path: '/tasks' - fullPath: '/tasks' - preLoaderRoute: typeof AppTasksRouteImport - parentRoute: typeof AppRouteImport - } - '/auth/sign-in': { - id: '/auth/sign-in' - path: '/auth/sign-in' - fullPath: '/auth/sign-in' - preLoaderRoute: typeof AuthSignInImport - parentRoute: typeof rootRoute + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport } '/auth/sign-up': { id: '/auth/sign-up' path: '/auth/sign-up' fullPath: '/auth/sign-up' - preLoaderRoute: typeof AuthSignUpImport - parentRoute: typeof rootRoute + preLoaderRoute: typeof AuthSignUpRouteImport + parentRoute: typeof rootRouteImport } - '/_app/_explore/explore': { - id: '/_app/_explore/explore' - path: '/explore' - fullPath: '/explore' - preLoaderRoute: typeof AppExploreExploreImport - parentRoute: typeof AppRouteImport + '/auth/sign-in': { + id: '/auth/sign-in' + path: '/auth/sign-in' + fullPath: '/auth/sign-in' + preLoaderRoute: typeof AuthSignInRouteImport + parentRoute: typeof rootRouteImport } - '/_app/bangumi/manage': { - id: '/_app/bangumi/manage' - path: '/manage' - fullPath: '/bangumi/manage' - preLoaderRoute: typeof AppBangumiManageImport - parentRoute: typeof AppBangumiRouteImport + '/_app/tasks': { + id: '/_app/tasks' + path: '/tasks' + fullPath: '/tasks' + preLoaderRoute: typeof AppTasksRouteRouteImport + parentRoute: typeof AppRouteRoute } - '/_app/credential3rd/create': { - id: '/_app/credential3rd/create' - path: '/create' - fullPath: '/credential3rd/create' - preLoaderRoute: typeof AppCredential3rdCreateImport - parentRoute: typeof AppCredential3rdRouteImport + '/_app/subscriptions': { + id: '/_app/subscriptions' + path: '/subscriptions' + fullPath: '/subscriptions' + preLoaderRoute: typeof AppSubscriptionsRouteRouteImport + parentRoute: typeof AppRouteRoute } - '/_app/credential3rd/manage': { - id: '/_app/credential3rd/manage' - path: '/manage' - fullPath: '/credential3rd/manage' - preLoaderRoute: typeof AppCredential3rdManageImport - parentRoute: typeof AppCredential3rdRouteImport + '/_app/settings': { + id: '/_app/settings' + path: '/settings' + fullPath: '/settings' + preLoaderRoute: typeof AppSettingsRouteRouteImport + parentRoute: typeof AppRouteRoute } - '/_app/playground/graphql-api': { - id: '/_app/playground/graphql-api' - path: '/graphql-api' - fullPath: '/playground/graphql-api' - preLoaderRoute: typeof AppPlaygroundGraphqlApiImport - parentRoute: typeof AppPlaygroundRouteImport + '/_app/playground': { + id: '/_app/playground' + path: '/playground' + fullPath: '/playground' + preLoaderRoute: typeof AppPlaygroundRouteRouteImport + parentRoute: typeof AppRouteRoute } - '/_app/settings/downloader': { - id: '/_app/settings/downloader' - path: '/downloader' - fullPath: '/settings/downloader' - preLoaderRoute: typeof AppSettingsDownloaderImport - parentRoute: typeof AppSettingsRouteImport + '/_app/credential3rd': { + id: '/_app/credential3rd' + path: '/credential3rd' + fullPath: '/credential3rd' + preLoaderRoute: typeof AppCredential3rdRouteRouteImport + parentRoute: typeof AppRouteRoute } - '/_app/subscriptions/create': { - id: '/_app/subscriptions/create' - path: '/create' - fullPath: '/subscriptions/create' - preLoaderRoute: typeof AppSubscriptionsCreateImport - parentRoute: typeof AppSubscriptionsRouteImport - } - '/_app/subscriptions/manage': { - id: '/_app/subscriptions/manage' - path: '/manage' - fullPath: '/subscriptions/manage' - preLoaderRoute: typeof AppSubscriptionsManageImport - parentRoute: typeof AppSubscriptionsRouteImport - } - '/_app/tasks/manage': { - id: '/_app/tasks/manage' - path: '/manage' - fullPath: '/tasks/manage' - preLoaderRoute: typeof AppTasksManageImport - parentRoute: typeof AppTasksRouteImport + '/_app/bangumi': { + id: '/_app/bangumi' + path: '/bangumi' + fullPath: '/bangumi' + preLoaderRoute: typeof AppBangumiRouteRouteImport + parentRoute: typeof AppRouteRoute } '/auth/oidc/callback': { id: '/auth/oidc/callback' path: '/auth/oidc/callback' fullPath: '/auth/oidc/callback' - preLoaderRoute: typeof AuthOidcCallbackImport - parentRoute: typeof rootRoute + preLoaderRoute: typeof AuthOidcCallbackRouteImport + parentRoute: typeof rootRouteImport } - '/_app/credential3rd/detail/$id': { - id: '/_app/credential3rd/detail/$id' - path: '/detail/$id' - fullPath: '/credential3rd/detail/$id' - preLoaderRoute: typeof AppCredential3rdDetailIdImport - parentRoute: typeof AppCredential3rdRouteImport + '/_app/tasks/manage': { + id: '/_app/tasks/manage' + path: '/manage' + fullPath: '/tasks/manage' + preLoaderRoute: typeof AppTasksManageRouteImport + parentRoute: typeof AppTasksRouteRoute } - '/_app/credential3rd/edit/$id': { - id: '/_app/credential3rd/edit/$id' - path: '/edit/$id' - fullPath: '/credential3rd/edit/$id' - preLoaderRoute: typeof AppCredential3rdEditIdImport - parentRoute: typeof AppCredential3rdRouteImport + '/_app/subscriptions/manage': { + id: '/_app/subscriptions/manage' + path: '/manage' + fullPath: '/subscriptions/manage' + preLoaderRoute: typeof AppSubscriptionsManageRouteImport + parentRoute: typeof AppSubscriptionsRouteRoute } - '/_app/subscriptions/detail/$id': { - id: '/_app/subscriptions/detail/$id' - path: '/detail/$id' - fullPath: '/subscriptions/detail/$id' - preLoaderRoute: typeof AppSubscriptionsDetailIdImport - parentRoute: typeof AppSubscriptionsRouteImport + '/_app/subscriptions/create': { + id: '/_app/subscriptions/create' + path: '/create' + fullPath: '/subscriptions/create' + preLoaderRoute: typeof AppSubscriptionsCreateRouteImport + parentRoute: typeof AppSubscriptionsRouteRoute } - '/_app/subscriptions/edit/$id': { - id: '/_app/subscriptions/edit/$id' - path: '/edit/$id' - fullPath: '/subscriptions/edit/$id' - preLoaderRoute: typeof AppSubscriptionsEditIdImport - parentRoute: typeof AppSubscriptionsRouteImport + '/_app/settings/downloader': { + id: '/_app/settings/downloader' + path: '/downloader' + fullPath: '/settings/downloader' + preLoaderRoute: typeof AppSettingsDownloaderRouteImport + parentRoute: typeof AppSettingsRouteRoute + } + '/_app/playground/graphql-api': { + id: '/_app/playground/graphql-api' + path: '/graphql-api' + fullPath: '/playground/graphql-api' + preLoaderRoute: typeof AppPlaygroundGraphqlApiRouteImport + parentRoute: typeof AppPlaygroundRouteRoute + } + '/_app/credential3rd/manage': { + id: '/_app/credential3rd/manage' + path: '/manage' + fullPath: '/credential3rd/manage' + preLoaderRoute: typeof AppCredential3rdManageRouteImport + parentRoute: typeof AppCredential3rdRouteRoute + } + '/_app/credential3rd/create': { + id: '/_app/credential3rd/create' + path: '/create' + fullPath: '/credential3rd/create' + preLoaderRoute: typeof AppCredential3rdCreateRouteImport + parentRoute: typeof AppCredential3rdRouteRoute + } + '/_app/bangumi/manage': { + id: '/_app/bangumi/manage' + path: '/manage' + fullPath: '/bangumi/manage' + preLoaderRoute: typeof AppBangumiManageRouteImport + parentRoute: typeof AppBangumiRouteRoute + } + '/_app/_explore/explore': { + id: '/_app/_explore/explore' + path: '/explore' + fullPath: '/explore' + preLoaderRoute: typeof AppExploreExploreRouteImport + parentRoute: typeof AppRouteRoute } '/_app/tasks/detail/$id': { id: '/_app/tasks/detail/$id' path: '/detail/$id' fullPath: '/tasks/detail/$id' - preLoaderRoute: typeof AppTasksDetailIdImport - parentRoute: typeof AppTasksRouteImport + preLoaderRoute: typeof AppTasksDetailIdRouteImport + parentRoute: typeof AppTasksRouteRoute + } + '/_app/subscriptions/edit/$id': { + id: '/_app/subscriptions/edit/$id' + path: '/edit/$id' + fullPath: '/subscriptions/edit/$id' + preLoaderRoute: typeof AppSubscriptionsEditIdRouteImport + parentRoute: typeof AppSubscriptionsRouteRoute + } + '/_app/subscriptions/detail/$id': { + id: '/_app/subscriptions/detail/$id' + path: '/detail/$id' + fullPath: '/subscriptions/detail/$id' + preLoaderRoute: typeof AppSubscriptionsDetailIdRouteImport + parentRoute: typeof AppSubscriptionsRouteRoute + } + '/_app/credential3rd/edit/$id': { + id: '/_app/credential3rd/edit/$id' + path: '/edit/$id' + fullPath: '/credential3rd/edit/$id' + preLoaderRoute: typeof AppCredential3rdEditIdRouteImport + parentRoute: typeof AppCredential3rdRouteRoute + } + '/_app/credential3rd/detail/$id': { + id: '/_app/credential3rd/detail/$id' + path: '/detail/$id' + fullPath: '/credential3rd/detail/$id' + preLoaderRoute: typeof AppCredential3rdDetailIdRouteImport + parentRoute: typeof AppCredential3rdRouteRoute } } } -// Create and export the route tree - interface AppBangumiRouteRouteChildren { AppBangumiManageRoute: typeof AppBangumiManageRoute } @@ -512,198 +668,6 @@ const AppRouteRouteWithChildren = AppRouteRoute._addFileChildren( AppRouteRouteChildren, ) -export interface FileRoutesByFullPath { - '/': typeof IndexRoute - '': typeof AppRouteRouteWithChildren - '/404': typeof R404Route - '/about': typeof AboutRoute - '/bangumi': typeof AppBangumiRouteRouteWithChildren - '/credential3rd': typeof AppCredential3rdRouteRouteWithChildren - '/playground': typeof AppPlaygroundRouteRouteWithChildren - '/settings': typeof AppSettingsRouteRouteWithChildren - '/subscriptions': typeof AppSubscriptionsRouteRouteWithChildren - '/tasks': typeof AppTasksRouteRouteWithChildren - '/auth/sign-in': typeof AuthSignInRoute - '/auth/sign-up': typeof AuthSignUpRoute - '/explore': typeof AppExploreExploreRoute - '/bangumi/manage': typeof AppBangumiManageRoute - '/credential3rd/create': typeof AppCredential3rdCreateRoute - '/credential3rd/manage': typeof AppCredential3rdManageRoute - '/playground/graphql-api': typeof AppPlaygroundGraphqlApiRoute - '/settings/downloader': typeof AppSettingsDownloaderRoute - '/subscriptions/create': typeof AppSubscriptionsCreateRoute - '/subscriptions/manage': typeof AppSubscriptionsManageRoute - '/tasks/manage': typeof AppTasksManageRoute - '/auth/oidc/callback': typeof AuthOidcCallbackRoute - '/credential3rd/detail/$id': typeof AppCredential3rdDetailIdRoute - '/credential3rd/edit/$id': typeof AppCredential3rdEditIdRoute - '/subscriptions/detail/$id': typeof AppSubscriptionsDetailIdRoute - '/subscriptions/edit/$id': typeof AppSubscriptionsEditIdRoute - '/tasks/detail/$id': typeof AppTasksDetailIdRoute -} - -export interface FileRoutesByTo { - '/': typeof IndexRoute - '': typeof AppRouteRouteWithChildren - '/404': typeof R404Route - '/about': typeof AboutRoute - '/bangumi': typeof AppBangumiRouteRouteWithChildren - '/credential3rd': typeof AppCredential3rdRouteRouteWithChildren - '/playground': typeof AppPlaygroundRouteRouteWithChildren - '/settings': typeof AppSettingsRouteRouteWithChildren - '/subscriptions': typeof AppSubscriptionsRouteRouteWithChildren - '/tasks': typeof AppTasksRouteRouteWithChildren - '/auth/sign-in': typeof AuthSignInRoute - '/auth/sign-up': typeof AuthSignUpRoute - '/explore': typeof AppExploreExploreRoute - '/bangumi/manage': typeof AppBangumiManageRoute - '/credential3rd/create': typeof AppCredential3rdCreateRoute - '/credential3rd/manage': typeof AppCredential3rdManageRoute - '/playground/graphql-api': typeof AppPlaygroundGraphqlApiRoute - '/settings/downloader': typeof AppSettingsDownloaderRoute - '/subscriptions/create': typeof AppSubscriptionsCreateRoute - '/subscriptions/manage': typeof AppSubscriptionsManageRoute - '/tasks/manage': typeof AppTasksManageRoute - '/auth/oidc/callback': typeof AuthOidcCallbackRoute - '/credential3rd/detail/$id': typeof AppCredential3rdDetailIdRoute - '/credential3rd/edit/$id': typeof AppCredential3rdEditIdRoute - '/subscriptions/detail/$id': typeof AppSubscriptionsDetailIdRoute - '/subscriptions/edit/$id': typeof AppSubscriptionsEditIdRoute - '/tasks/detail/$id': typeof AppTasksDetailIdRoute -} - -export interface FileRoutesById { - __root__: typeof rootRoute - '/': typeof IndexRoute - '/_app': typeof AppRouteRouteWithChildren - '/404': typeof R404Route - '/about': typeof AboutRoute - '/_app/bangumi': typeof AppBangumiRouteRouteWithChildren - '/_app/credential3rd': typeof AppCredential3rdRouteRouteWithChildren - '/_app/playground': typeof AppPlaygroundRouteRouteWithChildren - '/_app/settings': typeof AppSettingsRouteRouteWithChildren - '/_app/subscriptions': typeof AppSubscriptionsRouteRouteWithChildren - '/_app/tasks': typeof AppTasksRouteRouteWithChildren - '/auth/sign-in': typeof AuthSignInRoute - '/auth/sign-up': typeof AuthSignUpRoute - '/_app/_explore/explore': typeof AppExploreExploreRoute - '/_app/bangumi/manage': typeof AppBangumiManageRoute - '/_app/credential3rd/create': typeof AppCredential3rdCreateRoute - '/_app/credential3rd/manage': typeof AppCredential3rdManageRoute - '/_app/playground/graphql-api': typeof AppPlaygroundGraphqlApiRoute - '/_app/settings/downloader': typeof AppSettingsDownloaderRoute - '/_app/subscriptions/create': typeof AppSubscriptionsCreateRoute - '/_app/subscriptions/manage': typeof AppSubscriptionsManageRoute - '/_app/tasks/manage': typeof AppTasksManageRoute - '/auth/oidc/callback': typeof AuthOidcCallbackRoute - '/_app/credential3rd/detail/$id': typeof AppCredential3rdDetailIdRoute - '/_app/credential3rd/edit/$id': typeof AppCredential3rdEditIdRoute - '/_app/subscriptions/detail/$id': typeof AppSubscriptionsDetailIdRoute - '/_app/subscriptions/edit/$id': typeof AppSubscriptionsEditIdRoute - '/_app/tasks/detail/$id': typeof AppTasksDetailIdRoute -} - -export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: - | '/' - | '' - | '/404' - | '/about' - | '/bangumi' - | '/credential3rd' - | '/playground' - | '/settings' - | '/subscriptions' - | '/tasks' - | '/auth/sign-in' - | '/auth/sign-up' - | '/explore' - | '/bangumi/manage' - | '/credential3rd/create' - | '/credential3rd/manage' - | '/playground/graphql-api' - | '/settings/downloader' - | '/subscriptions/create' - | '/subscriptions/manage' - | '/tasks/manage' - | '/auth/oidc/callback' - | '/credential3rd/detail/$id' - | '/credential3rd/edit/$id' - | '/subscriptions/detail/$id' - | '/subscriptions/edit/$id' - | '/tasks/detail/$id' - fileRoutesByTo: FileRoutesByTo - to: - | '/' - | '' - | '/404' - | '/about' - | '/bangumi' - | '/credential3rd' - | '/playground' - | '/settings' - | '/subscriptions' - | '/tasks' - | '/auth/sign-in' - | '/auth/sign-up' - | '/explore' - | '/bangumi/manage' - | '/credential3rd/create' - | '/credential3rd/manage' - | '/playground/graphql-api' - | '/settings/downloader' - | '/subscriptions/create' - | '/subscriptions/manage' - | '/tasks/manage' - | '/auth/oidc/callback' - | '/credential3rd/detail/$id' - | '/credential3rd/edit/$id' - | '/subscriptions/detail/$id' - | '/subscriptions/edit/$id' - | '/tasks/detail/$id' - id: - | '__root__' - | '/' - | '/_app' - | '/404' - | '/about' - | '/_app/bangumi' - | '/_app/credential3rd' - | '/_app/playground' - | '/_app/settings' - | '/_app/subscriptions' - | '/_app/tasks' - | '/auth/sign-in' - | '/auth/sign-up' - | '/_app/_explore/explore' - | '/_app/bangumi/manage' - | '/_app/credential3rd/create' - | '/_app/credential3rd/manage' - | '/_app/playground/graphql-api' - | '/_app/settings/downloader' - | '/_app/subscriptions/create' - | '/_app/subscriptions/manage' - | '/_app/tasks/manage' - | '/auth/oidc/callback' - | '/_app/credential3rd/detail/$id' - | '/_app/credential3rd/edit/$id' - | '/_app/subscriptions/detail/$id' - | '/_app/subscriptions/edit/$id' - | '/_app/tasks/detail/$id' - fileRoutesById: FileRoutesById -} - -export interface RootRouteChildren { - IndexRoute: typeof IndexRoute - AppRouteRoute: typeof AppRouteRouteWithChildren - R404Route: typeof R404Route - AboutRoute: typeof AboutRoute - AuthSignInRoute: typeof AuthSignInRoute - AuthSignUpRoute: typeof AuthSignUpRoute - AuthOidcCallbackRoute: typeof AuthOidcCallbackRoute -} - const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, AppRouteRoute: AppRouteRouteWithChildren, @@ -713,161 +677,6 @@ const rootRouteChildren: RootRouteChildren = { AuthSignUpRoute: AuthSignUpRoute, AuthOidcCallbackRoute: AuthOidcCallbackRoute, } - -export const routeTree = rootRoute +export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) ._addFileTypes() - -/* ROUTE_MANIFEST_START -{ - "routes": { - "__root__": { - "filePath": "__root.tsx", - "children": [ - "/", - "/_app", - "/404", - "/about", - "/auth/sign-in", - "/auth/sign-up", - "/auth/oidc/callback" - ] - }, - "/": { - "filePath": "index.tsx" - }, - "/_app": { - "filePath": "_app/route.tsx", - "children": [ - "/_app/bangumi", - "/_app/credential3rd", - "/_app/playground", - "/_app/settings", - "/_app/subscriptions", - "/_app/tasks", - "/_app/_explore/explore" - ] - }, - "/404": { - "filePath": "404.tsx" - }, - "/about": { - "filePath": "about.tsx" - }, - "/_app/bangumi": { - "filePath": "_app/bangumi/route.tsx", - "parent": "/_app", - "children": [ - "/_app/bangumi/manage" - ] - }, - "/_app/credential3rd": { - "filePath": "_app/credential3rd/route.tsx", - "parent": "/_app", - "children": [ - "/_app/credential3rd/create", - "/_app/credential3rd/manage", - "/_app/credential3rd/detail/$id", - "/_app/credential3rd/edit/$id" - ] - }, - "/_app/playground": { - "filePath": "_app/playground/route.tsx", - "parent": "/_app", - "children": [ - "/_app/playground/graphql-api" - ] - }, - "/_app/settings": { - "filePath": "_app/settings/route.tsx", - "parent": "/_app", - "children": [ - "/_app/settings/downloader" - ] - }, - "/_app/subscriptions": { - "filePath": "_app/subscriptions/route.tsx", - "parent": "/_app", - "children": [ - "/_app/subscriptions/create", - "/_app/subscriptions/manage", - "/_app/subscriptions/detail/$id", - "/_app/subscriptions/edit/$id" - ] - }, - "/_app/tasks": { - "filePath": "_app/tasks/route.tsx", - "parent": "/_app", - "children": [ - "/_app/tasks/manage", - "/_app/tasks/detail/$id" - ] - }, - "/auth/sign-in": { - "filePath": "auth/sign-in.tsx" - }, - "/auth/sign-up": { - "filePath": "auth/sign-up.tsx" - }, - "/_app/_explore/explore": { - "filePath": "_app/_explore/explore.tsx", - "parent": "/_app" - }, - "/_app/bangumi/manage": { - "filePath": "_app/bangumi/manage.tsx", - "parent": "/_app/bangumi" - }, - "/_app/credential3rd/create": { - "filePath": "_app/credential3rd/create.tsx", - "parent": "/_app/credential3rd" - }, - "/_app/credential3rd/manage": { - "filePath": "_app/credential3rd/manage.tsx", - "parent": "/_app/credential3rd" - }, - "/_app/playground/graphql-api": { - "filePath": "_app/playground/graphql-api.tsx", - "parent": "/_app/playground" - }, - "/_app/settings/downloader": { - "filePath": "_app/settings/downloader.tsx", - "parent": "/_app/settings" - }, - "/_app/subscriptions/create": { - "filePath": "_app/subscriptions/create.tsx", - "parent": "/_app/subscriptions" - }, - "/_app/subscriptions/manage": { - "filePath": "_app/subscriptions/manage.tsx", - "parent": "/_app/subscriptions" - }, - "/_app/tasks/manage": { - "filePath": "_app/tasks/manage.tsx", - "parent": "/_app/tasks" - }, - "/auth/oidc/callback": { - "filePath": "auth/oidc/callback.tsx" - }, - "/_app/credential3rd/detail/$id": { - "filePath": "_app/credential3rd/detail.$id.tsx", - "parent": "/_app/credential3rd" - }, - "/_app/credential3rd/edit/$id": { - "filePath": "_app/credential3rd/edit.$id.tsx", - "parent": "/_app/credential3rd" - }, - "/_app/subscriptions/detail/$id": { - "filePath": "_app/subscriptions/detail.$id.tsx", - "parent": "/_app/subscriptions" - }, - "/_app/subscriptions/edit/$id": { - "filePath": "_app/subscriptions/edit.$id.tsx", - "parent": "/_app/subscriptions" - }, - "/_app/tasks/detail/$id": { - "filePath": "_app/tasks/detail.$id.tsx", - "parent": "/_app/tasks" - } - } -} -ROUTE_MANIFEST_END */ diff --git a/apps/webui/src/presentation/routes/_app/credential3rd/edit.$id.tsx b/apps/webui/src/presentation/routes/_app/credential3rd/edit.$id.tsx index 85d2665..c6790f5 100644 --- a/apps/webui/src/presentation/routes/_app/credential3rd/edit.$id.tsx +++ b/apps/webui/src/presentation/routes/_app/credential3rd/edit.$id.tsx @@ -39,7 +39,12 @@ import type { } from '@/infra/graphql/gql/graphql'; import type { RouteStateDataOption } from '@/infra/routes/traits'; import { useMutation, useQuery } from '@apollo/client'; -import { createFileRoute, useNavigate } from '@tanstack/react-router'; +import { + createFileRoute, + useCanGoBack, + useNavigate, + useRouter, +} from '@tanstack/react-router'; import { ArrowLeft, Eye, EyeOff, Save, X } from 'lucide-react'; import { useCallback, useState } from 'react'; import { toast } from 'sonner'; @@ -63,11 +68,17 @@ function FormView({ const togglePasswordVisibility = () => { setShowPassword((prev) => !prev); }; + const router = useRouter(); + const canGoBack = useCanGoBack(); const handleBack = () => { - navigate({ - to: '/credential3rd/manage', - }); + if (canGoBack) { + router.history.back(); + } else { + navigate({ + to: '/credential3rd/manage', + }); + } }; const [updateCredential, { loading: updating }] = useMutation< diff --git a/apps/webui/src/presentation/routes/_app/credential3rd/manage.tsx b/apps/webui/src/presentation/routes/_app/credential3rd/manage.tsx index ee8758e..4784d6e 100644 --- a/apps/webui/src/presentation/routes/_app/credential3rd/manage.tsx +++ b/apps/webui/src/presentation/routes/_app/credential3rd/manage.tsx @@ -1,10 +1,10 @@ import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { DataTablePagination } from '@/components/ui/data-table-pagination'; -import { DataTableRowActions } from '@/components/ui/data-table-row-actions'; import { DataTableViewOptions } from '@/components/ui/data-table-view-options'; import { DialogTrigger } from '@/components/ui/dialog'; import { DropdownMenuItem } from '@/components/ui/dropdown-menu'; +import { DropdownMenuActions } from '@/components/ui/dropdown-menu-actions'; import { QueryErrorView } from '@/components/ui/query-error-view'; import { Skeleton } from '@/components/ui/skeleton'; import { @@ -231,9 +231,8 @@ function CredentialManageRouteComponent() { { id: 'actions', cell: ({ row }) => ( - row.original.id} + - + ), }, ]; diff --git a/apps/webui/src/presentation/routes/_app/subscriptions/manage.tsx b/apps/webui/src/presentation/routes/_app/subscriptions/manage.tsx index fea1640..5028a6b 100644 --- a/apps/webui/src/presentation/routes/_app/subscriptions/manage.tsx +++ b/apps/webui/src/presentation/routes/_app/subscriptions/manage.tsx @@ -1,9 +1,9 @@ import { Button } from '@/components/ui/button'; import { DataTablePagination } from '@/components/ui/data-table-pagination'; -import { DataTableRowActions } from '@/components/ui/data-table-row-actions'; import { DataTableViewOptions } from '@/components/ui/data-table-view-options'; import { Dialog, DialogTrigger } from '@/components/ui/dialog'; import { DropdownMenuItem } from '@/components/ui/dropdown-menu'; +import { DropdownMenuActions } from '@/components/ui/dropdown-menu-actions'; import { QueryErrorView } from '@/components/ui/query-error-view'; import { Skeleton } from '@/components/ui/skeleton'; import { Switch } from '@/components/ui/switch'; @@ -225,9 +225,8 @@ function SubscriptionManageRouteComponent() { { id: 'actions', cell: ({ row }) => ( - row.original.id} + - + ), }, ]; diff --git a/apps/webui/src/presentation/routes/_app/tasks/-status-badge.tsx b/apps/webui/src/presentation/routes/_app/tasks/-status-badge.tsx new file mode 100644 index 0000000..358c873 --- /dev/null +++ b/apps/webui/src/presentation/routes/_app/tasks/-status-badge.tsx @@ -0,0 +1,44 @@ +import { Badge } from '@/components/ui/badge'; +import { SubscriberTaskStatusEnum } from '@/infra/graphql/gql/graphql'; +import { AlertCircle, CheckCircle, Clock, Loader2 } from 'lucide-react'; + +export function getStatusBadge(status: SubscriberTaskStatusEnum) { + switch (status) { + case SubscriberTaskStatusEnum.Done: + return ( + + + {status} + + ); + case SubscriberTaskStatusEnum.Running: + return ( + + + {status} + + ); + case SubscriberTaskStatusEnum.Killed: + case SubscriberTaskStatusEnum.Failed: + return ( + + + {status} + + ); + case SubscriberTaskStatusEnum.Scheduled: + case SubscriberTaskStatusEnum.Pending: + return ( + + + {status} + + ); + default: + return ( + + {status} + + ); + } +} diff --git a/apps/webui/src/presentation/routes/_app/tasks/detail.$id.tsx b/apps/webui/src/presentation/routes/_app/tasks/detail.$id.tsx index d6c4619..235dfe3 100644 --- a/apps/webui/src/presentation/routes/_app/tasks/detail.$id.tsx +++ b/apps/webui/src/presentation/routes/_app/tasks/detail.$id.tsx @@ -1,5 +1,34 @@ +import { DetailCardSkeleton } from '@/components/detail-card-skeleton'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/card'; +import { DetailEmptyView } from '@/components/ui/detail-empty-view'; +import { Label } from '@/components/ui/label'; +import { QueryErrorView } from '@/components/ui/query-error-view'; +import { Separator } from '@/components/ui/separator'; +import { GET_TASKS } from '@/domains/recorder/schema/tasks'; +import { + type GetTasksQuery, + type GetTasksQueryVariables, + SubscriberTaskStatusEnum, +} from '@/infra/graphql/gql/graphql'; import type { RouteStateDataOption } from '@/infra/routes/traits'; -import { createFileRoute } from '@tanstack/react-router'; +import { useQuery } from '@apollo/client'; +import { + createFileRoute, + useCanGoBack, + useNavigate, + useRouter, +} from '@tanstack/react-router'; +import { format } from 'date-fns'; +import { ArrowLeft, RefreshCw } from 'lucide-react'; +import { getStatusBadge } from './-status-badge'; export const Route = createFileRoute('/_app/tasks/detail/$id')({ component: TaskDetailRouteComponent, @@ -9,5 +38,203 @@ export const Route = createFileRoute('/_app/tasks/detail/$id')({ }); function TaskDetailRouteComponent() { - return
Hello "/_app/tasks/detail/$id"!
; + const { id } = Route.useParams(); + const navigate = useNavigate(); + const router = useRouter(); + const canGoBack = useCanGoBack(); + + const handleBack = () => { + if (canGoBack) { + router.history.back(); + } else { + navigate({ + to: '/tasks/manage', + }); + } + }; + + const { data, loading, error, refetch } = useQuery< + GetTasksQuery, + GetTasksQueryVariables + >(GET_TASKS, { + variables: { + filters: { + id: { + eq: id, + }, + }, + pagination: { + page: { + page: 0, + limit: 1, + }, + }, + orderBy: {}, + }, + pollInterval: 5000, // Auto-refresh every 5 seconds for running tasks + }); + + const task = data?.subscriberTasks?.nodes?.[0]; + + if (loading) { + return ; + } + + if (error) { + return ; + } + + if (!task) { + return ; + } + + return ( +
+
+
+ +
+

Task Detail

+

View task #{task.id}

+
+
+ + +
+ + + +
+
+ Task Information + + View task execution details + +
+
+ {getStatusBadge(task.status)} +
+
+
+ +
+ {/* Basic Information */} +
+
+ +
+ {task.id} +
+
+ +
+ +
+ {task.taskType} +
+
+ +
+ +
+ {task.priority} +
+
+ +
+ +
+ + {task.attempts} / {task.maxAttempts} + +
+
+ +
+ +
+ + {format(new Date(task.runAt), 'yyyy-MM-dd HH:mm:ss')} + +
+
+ +
+ +
+ + {task.doneAt + ? format(new Date(task.doneAt), 'yyyy-MM-dd HH:mm:ss') + : '-'} + +
+
+ +
+ +
+ + {task.lockAt + ? format(new Date(task.lockAt), 'yyyy-MM-dd HH:mm:ss') + : '-'} + +
+
+ +
+ +
+ {task.lockBy || '-'} +
+
+
+ + {/* Job Details */} + {task.job && ( + <> + +
+ +
+
+                      {JSON.stringify(task.job, null, 2)}
+                    
+
+
+ + )} + + {/* Error Information */} + {(task.status === SubscriberTaskStatusEnum.Failed || + task.status === SubscriberTaskStatusEnum.Killed) && + task.lastError && ( + <> + +
+ +
+

+ {task.lastError} +

+
+
+ + )} +
+
+
+
+ ); } diff --git a/apps/webui/src/presentation/routes/_app/tasks/manage.tsx b/apps/webui/src/presentation/routes/_app/tasks/manage.tsx index 6238b88..78e40f4 100644 --- a/apps/webui/src/presentation/routes/_app/tasks/manage.tsx +++ b/apps/webui/src/presentation/routes/_app/tasks/manage.tsx @@ -1,12 +1,15 @@ import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { DataTablePagination } from '@/components/ui/data-table-pagination'; -import { DataTableRowActions } from '@/components/ui/data-table-row-actions'; import { DetailEmptyView } from '@/components/ui/detail-empty-view'; +import { DropdownMenuActions } from '@/components/ui/dropdown-menu-actions'; import { QueryErrorView } from '@/components/ui/query-error-view'; import { Skeleton } from '@/components/ui/skeleton'; import { GET_TASKS, type TaskDto } from '@/domains/recorder/schema/tasks'; -import type { GetTasksQuery } from '@/infra/graphql/gql/graphql'; +import { + type GetTasksQuery, + SubscriberTaskStatusEnum, +} from '@/infra/graphql/gql/graphql'; import type { RouteStateDataOption } from '@/infra/routes/traits'; import { useDebouncedSkeleton } from '@/presentation/hooks/use-debounded-skeleton'; import { useQuery } from '@apollo/client'; @@ -21,14 +24,10 @@ import { useReactTable, } from '@tanstack/react-table'; import { format } from 'date-fns'; -import { - AlertCircle, - CheckCircle, - Clock, - Loader2, - RefreshCw, -} from 'lucide-react'; +import { RefreshCw } from 'lucide-react'; + import { useMemo, useState } from 'react'; +import { getStatusBadge } from './-status-badge'; export const Route = createFileRoute('/_app/tasks/manage')({ component: TaskManageRouteComponent, @@ -87,111 +86,9 @@ function TaskManageRouteComponent() { ); }, }, - { - header: 'Status', - accessorKey: 'status', - cell: ({ row }) => { - return getStatusBadge(row.original.status); - }, - }, - { - header: 'Priority', - accessorKey: 'priority', - cell: ({ row }) => { - return getPriorityBadge(row.original.priority); - }, - }, - { - header: 'Attempts', - accessorKey: 'attempts', - cell: ({ row }) => { - const attempts = row.original.attempts; - const maxAttempts = row.original.maxAttempts; - return ( -
- {attempts} / {maxAttempts} -
- ); - }, - }, - { - header: 'Run At', - accessorKey: 'runAt', - cell: ({ row }) => { - const runAt = row.original.runAt; - return ( -
- {format(new Date(runAt), 'yyyy-MM-dd HH:mm:ss')} -
- ); - }, - }, - { - header: 'Done At', - accessorKey: 'doneAt', - cell: ({ row }) => { - const doneAt = row.original.doneAt; - return ( -
- {doneAt ? format(new Date(doneAt), 'yyyy-MM-dd HH:mm:ss') : '-'} -
- ); - }, - }, - { - header: 'Last Error', - accessorKey: 'lastError', - cell: ({ row }) => { - const lastError = row.original.lastError; - return ( -
- {lastError || '-'} -
- ); - }, - }, - { - header: 'Lock At', - accessorKey: 'lockAt', - cell: ({ row }) => { - const lockAt = row.original.lockAt; - return ( -
- {lockAt ? format(new Date(lockAt), 'yyyy-MM-dd HH:mm:ss') : '-'} -
- ); - }, - }, - { - header: 'Lock By', - accessorKey: 'lockBy', - cell: ({ row }) => { - const lockBy = row.original.lockBy; - return
{lockBy || '-'}
; - }, - }, - { - id: 'actions', - cell: ({ row }) => ( - row.original.id} - showDetail - onDetail={() => { - navigate({ - to: '/tasks/detail/$id', - params: { id: row.original.id }, - }); - }} - /> - ), - }, ]; return cs; - }, [navigate]); + }, []); const table = useReactTable({ data: useMemo(() => (tasks?.nodes ?? []) as TaskDto[], [tasks]), @@ -226,8 +123,8 @@ function TaskManageRouteComponent() {
-

Subscription Management

-

Manage your subscription

+

Tasks Management

+

Manage your tasks