Skip to content

Commit

Permalink
Shows outdated tasks as interrupted
Browse files Browse the repository at this point in the history
Signed-off-by: Aaron Chong <aaronchongth@gmail.com>
  • Loading branch information
aaronchongth committed Jun 7, 2024
1 parent d39a031 commit 5368449
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 4 deletions.
4 changes: 3 additions & 1 deletion packages/dashboard/src/components/tasks/tasks-app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import {
Tasks,
Window,
} from 'react-components';
import { AppControllerContext } from '../app-contexts';
import { AppControllerContext, ResourcesContext } from '../app-contexts';
import { AppEvents } from '../app-events';
import { MicroAppProps } from '../micro-app';
import { RmfAppContext } from '../rmf-app';
Expand Down Expand Up @@ -85,6 +85,7 @@ export const TasksApp = React.memo(
) => {
const rmf = React.useContext(RmfAppContext);
const appController = React.useContext(AppControllerContext);
const resourcesContext = React.useContext(ResourcesContext);
const [autoRefresh, setAutoRefresh] = React.useState(true);
const [refreshTaskAppCount, setRefreshTaskAppCount] = React.useState(0);
const [selectedPanelIndex, setSelectedPanelIndex] = React.useState(TaskTablePanel.QueueTable);
Expand Down Expand Up @@ -424,6 +425,7 @@ export const TasksApp = React.memo(
<TableContainer>
<TaskDataGridTable
tasks={tasksState}
dismissStaleTasks={resourcesContext?.dismissStaleTasks ?? false}
onTaskClick={(_: MuiMouseEvent, task: TaskState) => {
setSelectedTask(task);
if (task.assigned_to) {
Expand Down
3 changes: 3 additions & 0 deletions packages/dashboard/src/managers/resource-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export interface ResourceConfigurationsType {
attributionPrefix?: string;
cartIds?: string[];
loggedInDisplayLevel?: string;
dismissStaleTasks?: boolean;
}

export default class ResourceManager {
Expand All @@ -32,6 +33,7 @@ export default class ResourceManager {
attributionPrefix?: string;
cartIds?: string[];
loggedInDisplayLevel?: string;
dismissStaleTasks?: boolean;

/**
* Gets the default resource manager using the embedded resource file (aka "assets/resources/main.json").
Expand Down Expand Up @@ -71,6 +73,7 @@ export default class ResourceManager {
this.attributionPrefix = resources.attributionPrefix || 'OSRC-SG';
this.cartIds = resources.cartIds || [];
this.loggedInDisplayLevel = resources.loggedInDisplayLevel;
this.dismissStaleTasks = resources.dismissStaleTasks ?? false;
}
}

Expand Down
57 changes: 54 additions & 3 deletions packages/react-components/lib/tasks/task-table-datagrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,16 @@ import {
GridFilterModel,
GridSortModel,
} from '@mui/x-data-grid';
import { styled, Stack, Typography, Tooltip, useMediaQuery, SxProps, Theme } from '@mui/material';
import {
Box,
styled,
Stack,
Typography,
Tooltip,
useMediaQuery,
SxProps,
Theme,
} from '@mui/material';
import * as React from 'react';
import { TaskState, ApiServerModelsRmfApiTaskStateStatus as Status } from 'api-client';
import { InsertInvitation as ScheduleIcon, Person as UserIcon } from '@mui/icons-material/';
Expand Down Expand Up @@ -54,6 +63,20 @@ const StyledDataGrid = styled(DataGrid)(({ theme }) => ({
},
}));

function isTaskOutdated(taskState: TaskState): boolean {
if (
!taskState.unix_millis_finish_time ||
!taskState.status ||
(taskState.status !== Status.Underway && taskState.status !== Status.Queued)
) {
return false;
}

const finishDateTime = new Date(taskState.unix_millis_finish_time);
const nowDateTime = new Date();
return nowDateTime > finishDateTime;
}

export interface Tasks {
isLoading: boolean;
data: TaskState[];
Expand All @@ -74,6 +97,7 @@ export type MuiMouseEvent = MuiEvent<React.MouseEvent<HTMLElement>>;

export interface TableDataGridState {
tasks: Tasks;
dismissStaleTasks: boolean;
onTaskClick?(ev: MuiMouseEvent, task: TaskState): void;
onPageChange: (newPage: number) => void;
onPageSizeChange: (newPageSize: number) => void;
Expand Down Expand Up @@ -122,6 +146,7 @@ const TaskRequester = (requester: string | null, sx: SxProps<Theme>): JSX.Elemen

export function TaskDataGridTable({
tasks,
dismissStaleTasks,
onTaskClick,
onPageChange,
onPageSizeChange,
Expand Down Expand Up @@ -251,8 +276,30 @@ export function TaskDataGridTable({
field: 'status',
headerName: 'State',
editable: false,
valueGetter: (params: GridValueGetterParams) =>
params.row.status ? params.row.status : 'unknown',
renderCell: (cellValues) => {
const statusString = cellValues.row.status ? cellValues.row.status : 'unknown';
if (dismissStaleTasks && isTaskOutdated(cellValues.row)) {
return (
<Tooltip
title={
<React.Fragment>
<Typography>
Finish time is in the past, but task is still queued or underway.
</Typography>
<Typography>
The task may have been interrupted or stalled during the execution.
</Typography>
<Typography>Last status update: {statusString}</Typography>
</React.Fragment>
}
>
<Box component="div">{'interrupted'}</Box>
</Tooltip>
);
}

return <Box component="div">{statusString}</Box>;
},
flex: 1,
filterOperators: getMinimalStringFilterOperators,
filterable: true,
Expand Down Expand Up @@ -299,6 +346,10 @@ export function TaskDataGridTable({
onRowClick={handleEvent}
getCellClassName={(params: GridCellParams<string>) => {
if (params.field === 'status') {
if (isTaskOutdated(params.row)) {
return classes.taskUnknownCell;
}

switch (params.value) {
case Status.Underway:
return classes.taskActiveCell;
Expand Down

0 comments on commit 5368449

Please sign in to comment.