import React from 'react'; import { STATUSES, Status } from './constants'; import { Jobs } from './Jobs'; import { AppQueue, AppJob } from 'types'; type MenuItemProps = { status: Status; count: number; onClick: () => void; selected: boolean; }; const MenuItem = ({ status, count, onClick, selected }: MenuItemProps) => (
{status !== 'latest' && {count}} {status}
); const ACTIONABLE_STATUSES = ['failed', 'delayed', 'completed']; interface QueueActionProps { queue: QueueProps['queue']; retryAll: QueueProps['retryAll']; cleanAllFailed: QueueProps['cleanAllFailed']; cleanAllDelayed: QueueProps['cleanAllDelayed']; cleanAllCompleted: QueueProps['cleanAllCompleted']; status: Status; } const isStatusActionable = (status: Status): boolean => ACTIONABLE_STATUSES.includes(status); const QueueActions = ({ status, retryAll, cleanAllFailed, cleanAllDelayed, cleanAllCompleted, }: QueueActionProps) => { if (!isStatusActionable(status)) { return
; } return (
{status === 'failed' && (
)} {status === 'delayed' && ( )} {status === 'completed' && ( )}
); }; interface QueueProps { queue: AppQueue; selectedStatus: Status; selectStatus: (statuses: Record) => void; cleanAllDelayed: () => Promise; cleanAllFailed: () => Promise; cleanAllCompleted: () => Promise; retryAll: () => Promise; retryJob: (job: AppJob) => () => Promise; promoteJob: (job: AppJob) => () => Promise; } // We need to extend so babel doesn't think it's JSX const keysOf = (target: Target) => Object.keys(target) as (keyof Target)[]; export const Queue = ({ cleanAllDelayed, cleanAllFailed, cleanAllCompleted, queue, retryAll, retryJob, promoteJob, selectedStatus, selectStatus, }: QueueProps) => (

{queue.name}

{keysOf(STATUSES).map(status => ( selectStatus({ [queue.name]: status })} selected={selectedStatus === status} /> ))}
{selectedStatus && ( <> )}
);