- TaskCard: replace checkbox toggle with right-click ContextMenu (Edit / Change Status submenu / Delete), matching TaskTableRow flow; status now visible via shared StatusBadge in card footer - TaskTableRow + TaskCard: add RefreshCw icon to Change Status submenu trigger - TaskDetailSheet: subscribe to fresh row via tasks.byIds and render liveTask so priority/status chip popovers reflect mutations immediately; invalidate byIds alongside tasks.list on update - ChatInputBox 'comment' variant: items-end -> items-center so single-line placeholder aligns with send button - TaskTableRow: remove project-cell click handler and underline; remove onProjectClick prop chain from TaskTable - TaskDetailSheet header breadcrumb: now a button navigating to /projects?projectId=... (closes sheet first) - TaskDetailSheet addComment: drop success toast on create, keep error toast and cache invalidation
63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import { useTranslation } from 'react-i18next';
|
|
import {
|
|
Table,
|
|
TableHeader,
|
|
TableBody,
|
|
TableRow,
|
|
TableHead,
|
|
} from '@/components/ui/table';
|
|
import { useFormatPrefs } from '@/lib/date';
|
|
import { type TaskItem } from './task-types';
|
|
import { TaskTableRow } from './TaskTableRow';
|
|
|
|
interface Props {
|
|
tasks: TaskItem[];
|
|
hideProjectColumn?: boolean;
|
|
onRowClick: (task: TaskItem) => void;
|
|
onEdit: (task: TaskItem) => void;
|
|
onDelete: (id: string) => void;
|
|
onStatusChange: (id: string, status: string) => void;
|
|
}
|
|
|
|
export function TaskTable({
|
|
tasks,
|
|
hideProjectColumn,
|
|
onRowClick,
|
|
onEdit,
|
|
onDelete,
|
|
onStatusChange,
|
|
}: Props) {
|
|
const { t } = useTranslation();
|
|
const prefs = useFormatPrefs();
|
|
|
|
return (
|
|
<div className="rounded-lg border border-border/50 bg-card/65 backdrop-blur-xl shadow-sm overflow-hidden">
|
|
<Table>
|
|
<TableHeader>
|
|
<TableRow className="hover:bg-transparent">
|
|
<TableHead>{t('tasks.colTask')}</TableHead>
|
|
{!hideProjectColumn && <TableHead>{t('tasks.colProject')}</TableHead>}
|
|
<TableHead>{t('tasks.colPriority')}</TableHead>
|
|
<TableHead>{t('tasks.colDue')}</TableHead>
|
|
<TableHead>{t('tasks.colAssignee')}</TableHead>
|
|
</TableRow>
|
|
</TableHeader>
|
|
<TableBody>
|
|
{tasks.map((task) => (
|
|
<TaskTableRow
|
|
key={task.id}
|
|
task={task}
|
|
hideProjectColumn={hideProjectColumn}
|
|
onClick={() => onRowClick(task)}
|
|
onEdit={() => onEdit(task)}
|
|
onDelete={() => onDelete(task.id)}
|
|
onStatusChange={(s) => onStatusChange(task.id, s)}
|
|
prefs={prefs}
|
|
/>
|
|
))}
|
|
</TableBody>
|
|
</Table>
|
|
</div>
|
|
);
|
|
}
|