import React from "react"; import { Draggable } from "react-beautiful-dnd"; import formatDate from 'dateformat'; import { paramCase } from '@basementuniverse/kanbn/src/utility'; import VSCodeApi from "./VSCodeApi"; const TaskItem = ({ task, columnName, customFields, position, dateFormat, vscode }: { task: KanbnTask, columnName: string, customFields: { name: string, type: 'boolean' | 'date' | 'number' | 'string' }[], position: number, dateFormat: string, vscode: VSCodeApi }) => { const createdDate = 'created' in task.metadata ? formatDate(task.metadata.created, dateFormat) : null; const updatedDate = 'updated' in task.metadata ? formatDate(task.metadata.updated, dateFormat) : null; const startedDate = 'started' in task.metadata ? formatDate(task.metadata.started, dateFormat) : null; const dueDate = 'due' in task.metadata ? formatDate(task.metadata.due, dateFormat) : null; const completedDate = 'completed' in task.metadata ? formatDate(task.metadata.completed, dateFormat) : null; // Check if a task's due date is in the past const checkOverdue = (task: KanbnTask) => { if ('due' in task.metadata && task.metadata.due !== undefined) { return Date.parse(task.metadata.due) < (new Date()).getTime(); } return false; }; return ( {(provided, snapshot) => { return (
i).join(' ')} style={{ userSelect: "none", ...provided.draggableProps.style }} >
{ 'tags' in task.metadata && task.metadata.tags!.length > 0 &&
{task.metadata.tags!.map(tag => { return ( { vscode.postMessage({ command: 'kanbn.goToRaw', taskId: task.id, columnName: task.column }); }} className={[ 'kanbn-task-tag', `kanbn-task-tag-${paramCase(tag)}` ].join(' ')}> {tag} ); })}
} { customFields.map(customField => { if (customField.name in task.metadata) { return (
{ customField.type === 'boolean' ? ( <> {customField.name} ) : ( <> {customField.type === 'date' ? formatDate(task.metadata[customField.name], dateFormat) : task.metadata[customField.name]} ) }
); } return (<>); }) } { 'assigned' in task.metadata && !!task.metadata.assigned &&
{task.metadata.assigned}
} { createdDate &&
{createdDate}
} { updatedDate &&
{updatedDate}
} { startedDate &&
{startedDate}
} { dueDate &&
{dueDate}
} { completedDate &&
{completedDate}
} { task.comments.length > 0 &&
{task.comments.length}
} { task.subTasks.length > 0 &&
{task.subTasks.filter(subTask => subTask.completed).length} / {task.subTasks.length}
} { task.workload !== undefined &&
{ vscode.postMessage({ command: 'kanbn.goToRaw', taskId: task.id, columnName: task.column }); }}>{task.workload}
} { task.relations.length > 0 && task.relations.map(relation => (
{ vscode.postMessage({ command: 'kanbn.goToRaw', taskId: task.id, columnName: task.column }); }} className={[ 'kanbn-task-data kanbn-task-data-relation', relation.type ? `kanbn-task-data-relation-${relation.type}` : null, ].join(' ')}> {relation.type} {relation.task}
)) } { task.workload !== undefined && task.progress !== undefined &&
}
); }}
); } export default TaskItem;