summaryrefslogtreecommitdiff
path: root/makima/frontend/src/components/workflow/WorkflowBoard.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'makima/frontend/src/components/workflow/WorkflowBoard.tsx')
-rw-r--r--makima/frontend/src/components/workflow/WorkflowBoard.tsx66
1 files changed, 55 insertions, 11 deletions
diff --git a/makima/frontend/src/components/workflow/WorkflowBoard.tsx b/makima/frontend/src/components/workflow/WorkflowBoard.tsx
index af4aec7..e36ca21 100644
--- a/makima/frontend/src/components/workflow/WorkflowBoard.tsx
+++ b/makima/frontend/src/components/workflow/WorkflowBoard.tsx
@@ -1,11 +1,17 @@
-import { useMemo } from "react";
+import { useMemo, useState } from "react";
import type { ContractSummary, ContractPhase } from "../../lib/api";
import { PhaseColumn } from "./PhaseColumn";
+import { ContractContextMenu } from "../contracts/ContractContextMenu";
interface WorkflowBoardProps {
contracts: ContractSummary[];
onContractClick: (contractId: string) => void;
onPhaseChange: (contractId: string, newPhase: ContractPhase) => void;
+ onMarkComplete?: (contract: ContractSummary) => void;
+ onMarkActive?: (contract: ContractSummary) => void;
+ onArchive?: (contract: ContractSummary) => void;
+ onDelete?: (contract: ContractSummary) => void;
+ onGoToSupervisor?: (contract: ContractSummary) => void;
}
const phases: ContractPhase[] = ["research", "specify", "plan", "execute", "review"];
@@ -14,7 +20,27 @@ export function WorkflowBoard({
contracts,
onContractClick,
onPhaseChange,
+ onMarkComplete,
+ onMarkActive,
+ onArchive,
+ onDelete,
+ onGoToSupervisor,
}: WorkflowBoardProps) {
+ const [contextMenuPosition, setContextMenuPosition] = useState<{ x: number; y: number } | null>(null);
+ const [contextMenuContract, setContextMenuContract] = useState<ContractSummary | null>(null);
+
+ const handleContextMenu = (e: React.MouseEvent, contract: ContractSummary) => {
+ e.preventDefault();
+ e.stopPropagation(); // Prevent interference with drag-and-drop
+ setContextMenuPosition({ x: e.clientX, y: e.clientY });
+ setContextMenuContract(contract);
+ };
+
+ const closeContextMenu = () => {
+ setContextMenuPosition(null);
+ setContextMenuContract(null);
+ };
+
// Group contracts by phase
const contractsByPhase = useMemo(() => {
const grouped: Record<ContractPhase, ContractSummary[]> = {
@@ -39,16 +65,34 @@ export function WorkflowBoard({
}, [contracts]);
return (
- <div className="flex gap-2 h-full overflow-x-auto">
- {phases.map((phase) => (
- <PhaseColumn
- key={phase}
- phase={phase}
- contracts={contractsByPhase[phase]}
- onContractClick={onContractClick}
- onDrop={onPhaseChange}
+ <>
+ <div className="flex gap-2 h-full overflow-x-auto">
+ {phases.map((phase) => (
+ <PhaseColumn
+ key={phase}
+ phase={phase}
+ contracts={contractsByPhase[phase]}
+ onContractClick={onContractClick}
+ onDrop={onPhaseChange}
+ onContextMenu={handleContextMenu}
+ />
+ ))}
+ </div>
+
+ {/* Context Menu */}
+ {contextMenuPosition && contextMenuContract && (
+ <ContractContextMenu
+ x={contextMenuPosition.x}
+ y={contextMenuPosition.y}
+ contract={contextMenuContract}
+ onClose={closeContextMenu}
+ onMarkComplete={() => onMarkComplete?.(contextMenuContract)}
+ onMarkActive={() => onMarkActive?.(contextMenuContract)}
+ onArchive={() => onArchive?.(contextMenuContract)}
+ onDelete={() => onDelete?.(contextMenuContract)}
+ onGoToSupervisor={() => onGoToSupervisor?.(contextMenuContract)}
/>
- ))}
- </div>
+ )}
+ </>
);
}