diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 10588ee..9d4567f 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -33,6 +33,7 @@ import ListItemLink from "./components/ListItemLink"; import SchedulersView from "./views/SchedulersView"; import DashboardView from "./views/DashboardView"; import TasksView from "./views/TasksView"; +import TaskDetailsView from "./views/TaskDetailsView"; import SettingsView from "./views/SettingsView"; import ServersView from "./views/ServersView"; import RedisInfoView from "./views/RedisInfoView"; @@ -269,6 +270,9 @@ function App(props: ConnectedProps) {
+ + + diff --git a/ui/src/paths.ts b/ui/src/paths.ts index cf99c65..d97f361 100644 --- a/ui/src/paths.ts +++ b/ui/src/paths.ts @@ -5,8 +5,13 @@ export const paths = { SCHEDULERS: "/schedulers", QUEUE_DETAILS: "/queues/:qname", REDIS: "/redis", + TASK_DETAILS: "/queues/:qname/tasks/:taskId", }; +/************************************************************** + Path Helper functions + **************************************************************/ + export function queueDetailsPath(qname: string, taskStatus?: string): string { const path = paths.QUEUE_DETAILS.replace(":qname", qname); if (taskStatus) { @@ -14,3 +19,20 @@ export function queueDetailsPath(qname: string, taskStatus?: string): string { } return path; } + +export function taskDetailsPath(qname: string, taskId: string): string { + return paths.TASK_DETAILS.replace(":qname", qname).replace(":taskId", taskId); +} + +/************************************************************** + URL Params + **************************************************************/ + +export interface QueueDetailsRouteParams { + qname: string; +} + +export interface TaskDetailsRouteParams { + qname: string; + taskId: string; +} \ No newline at end of file diff --git a/ui/src/views/TaskDetailsView.tsx b/ui/src/views/TaskDetailsView.tsx new file mode 100644 index 0000000..9e2d706 --- /dev/null +++ b/ui/src/views/TaskDetailsView.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import Container from "@material-ui/core/Container"; +import Grid from "@material-ui/core/Grid"; +import Typography from "@material-ui/core/Typography"; +import { useParams } from "react-router-dom"; +import { TaskDetailsRouteParams } from "../paths"; + +const useStyles = makeStyles((theme) => ({ + container: { + paddingTop: theme.spacing(2), + }, +})); + +interface Props {} + +function TaskDetailsView(props: Props) { + const classes = useStyles(); + const { qname, taskId } = useParams(); + + return ( + + + + + Task Details View Queue: {qname} TaskID: {taskId} + + + + + ); +} + +export default TaskDetailsView; diff --git a/ui/src/views/TasksView.tsx b/ui/src/views/TasksView.tsx index f7179e8..4f7a843 100644 --- a/ui/src/views/TasksView.tsx +++ b/ui/src/views/TasksView.tsx @@ -9,6 +9,7 @@ import QueueBreadCrumb from "../components/QueueBreadcrumb"; import { useParams, useLocation } from "react-router-dom"; import { listQueuesAsync } from "../actions/queuesActions"; import { AppState } from "../store"; +import { QueueDetailsRouteParams } from "../paths"; function mapStateToProps(state: AppState) { return { @@ -37,16 +38,12 @@ function useQuery(): URLSearchParams { return new URLSearchParams(useLocation().search); } -interface RouteParams { - qname: string; -} - const validStatus = ["active", "pending", "scheduled", "retry", "archived"]; const defaultStatus = "active"; function TasksView(props: ConnectedProps) { const classes = useStyles(); - const { qname } = useParams(); + const { qname } = useParams(); const query = useQuery(); let selected = query.get("status"); if (!selected || !validStatus.includes(selected)) {