@parhelia/core 0.1.11873 → 0.1.11955
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents-view/AgentsInbox.d.ts +1 -1
- package/dist/agents-view/AgentsInbox.js +15 -2
- package/dist/agents-view/AgentsInbox.js.map +1 -1
- package/dist/agents-view/AgentsSidebar.d.ts +20 -0
- package/dist/agents-view/AgentsSidebar.js +21 -0
- package/dist/agents-view/AgentsSidebar.js.map +1 -0
- package/dist/agents-view/AgentsView.d.ts +6 -7
- package/dist/agents-view/AgentsView.js +63 -25
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/agents-view/AgentsWorkspaceView.d.ts +2 -6
- package/dist/agents-view/AgentsWorkspaceView.js +242 -112
- package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
- package/dist/components/ui/context-menu.js +24 -9
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/select.js.map +1 -1
- package/dist/config/config.js +15 -11
- package/dist/config/config.js.map +1 -1
- package/dist/editor/ContentTree.js +2 -2
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/ContextMenu.js +11 -5
- package/dist/editor/ContextMenu.js.map +1 -1
- package/dist/editor/FieldListField.js +1 -1
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/MobileLayout.js +19 -9
- package/dist/editor/MobileLayout.js.map +1 -1
- package/dist/editor/ai/AgentStatusBadge.d.ts +1 -1
- package/dist/editor/ai/AgentStatusBadge.js +18 -2
- package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.js +342 -55
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/AiResponseMessage.js +46 -4
- package/dist/editor/ai/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/ContextInfoBar.js +151 -5
- package/dist/editor/ai/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/EditOperationsPanel.d.ts +2 -1
- package/dist/editor/ai/EditOperationsPanel.js +6 -1
- package/dist/editor/ai/EditOperationsPanel.js.map +1 -1
- package/dist/editor/ai/dialogs/AgentDialogHandler.js +64 -15
- package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
- package/dist/editor/ai/dialogs/QuestionnaireInline.js +111 -20
- package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
- package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +24 -0
- package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
- package/dist/editor/ai/useAgentStatus.d.ts +1 -0
- package/dist/editor/ai/useAgentStatus.js +74 -29
- package/dist/editor/ai/useAgentStatus.js.map +1 -1
- package/dist/editor/client/EditorShell.js +72 -8
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/hooks/useQuota.d.ts +7 -0
- package/dist/editor/client/hooks/useQuota.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js +10 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +3 -30
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/client/ui/EditorChrome.js +31 -1
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/commands/componentCommands.js +106 -6
- package/dist/editor/commands/componentCommands.js.map +1 -1
- package/dist/editor/commands/itemCommands.d.ts +1 -0
- package/dist/editor/commands/itemCommands.js +28 -1
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/componentTreeHelper.js +22 -2
- package/dist/editor/componentTreeHelper.js.map +1 -1
- package/dist/editor/insertMenuItems.d.ts +4 -0
- package/dist/editor/insertMenuItems.js +66 -0
- package/dist/editor/insertMenuItems.js.map +1 -0
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js +1 -1
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenus.js +8 -1
- package/dist/editor/page-editor-chrome/FrameMenus.js.map +1 -1
- package/dist/editor/page-editor-chrome/InlineEditor.js +25 -11
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +32 -17
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +17 -11
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
- package/dist/editor/page-viewer/EditorForm.js +6 -5
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +49 -1
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +5 -0
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
- package/dist/editor/pageModel.d.ts +2 -0
- package/dist/editor/reviews/CreateReviewConfirmStep.d.ts +16 -0
- package/dist/editor/reviews/CreateReviewConfirmStep.js +37 -0
- package/dist/editor/reviews/CreateReviewConfirmStep.js.map +1 -0
- package/dist/editor/reviews/CreateReviewDetailsStep.d.ts +51 -0
- package/dist/editor/reviews/CreateReviewDetailsStep.js +121 -0
- package/dist/editor/reviews/CreateReviewDetailsStep.js.map +1 -0
- package/dist/editor/reviews/CreateReviewDialog.js +260 -173
- package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
- package/dist/editor/reviews/CreateReviewSuccessStep.d.ts +6 -0
- package/dist/editor/reviews/CreateReviewSuccessStep.js +8 -0
- package/dist/editor/reviews/CreateReviewSuccessStep.js.map +1 -0
- package/dist/editor/reviews/DecisionsMatrix.js +96 -25
- package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
- package/dist/editor/reviews/MultiReviewManager.js +25 -3
- package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
- package/dist/editor/reviews/PagesPanel.js +31 -15
- package/dist/editor/reviews/PagesPanel.js.map +1 -1
- package/dist/editor/reviews/ReviewCard.js +13 -7
- package/dist/editor/reviews/ReviewCard.js.map +1 -1
- package/dist/editor/reviews/ReviewDetail.js +2 -2
- package/dist/editor/reviews/ReviewDetail.js.map +1 -1
- package/dist/editor/reviews/ReviewsList.js +7 -3
- package/dist/editor/reviews/ReviewsList.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +14 -1
- package/dist/editor/services/agentService.js +27 -1
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/aiService.d.ts +39 -1
- package/dist/editor/services/aiService.js +12 -2
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/services/serviceHelper.d.ts +1 -1
- package/dist/editor/services/serviceHelper.js +2 -1
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/settings/About.js +1 -1
- package/dist/editor/settings/About.js.map +1 -1
- package/dist/editor/settings/QuotaInfo.js +202 -4
- package/dist/editor/settings/QuotaInfo.js.map +1 -1
- package/dist/editor/settings/panels/SearchConfigPanel.js +11 -13
- package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
- package/dist/editor/settings/status/useStartupChecks.js +2 -1
- package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
- package/dist/editor/sidebar/ComponentTree.js +26 -20
- package/dist/editor/sidebar/ComponentTree.js.map +1 -1
- package/dist/editor/sidebar/MobileWorkspacePopover.d.ts +16 -0
- package/dist/editor/sidebar/MobileWorkspacePopover.js +35 -0
- package/dist/editor/sidebar/MobileWorkspacePopover.js.map +1 -0
- package/dist/editor/sidebar/NavigationSidebar.js +30 -14
- package/dist/editor/sidebar/NavigationSidebar.js.map +1 -1
- package/dist/editor/ui/ItemNameDialogNew.js +8 -8
- package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
- package/dist/editor/ui/SharedFolderSelectorDialog.d.ts +11 -0
- package/dist/editor/ui/SharedFolderSelectorDialog.js +79 -0
- package/dist/editor/ui/SharedFolderSelectorDialog.js.map +1 -0
- package/dist/editor/ui/SimpleTabs.js +1 -1
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.js +4 -2
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/editor/ui/TreeListSelector.d.ts +2 -1
- package/dist/editor/ui/TreeListSelector.js +2 -2
- package/dist/editor/ui/TreeListSelector.js.map +1 -1
- package/dist/editor/utils.js +42 -0
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/views/EditorSlot.js +7 -8
- package/dist/editor/views/EditorSlot.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/setup/wizard/steps/ImportModelDialog.js +24 -22
- package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
- package/dist/splash-screen/NewPage.js +2 -2
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/RecentPages.js +1 -1
- package/dist/splash-screen/RecentPages.js.map +1 -1
- package/dist/task-board/TaskBoardWorkspace.d.ts +1 -0
- package/dist/task-board/TaskBoardWorkspace.js +1094 -0
- package/dist/task-board/TaskBoardWorkspace.js.map +1 -0
- package/dist/task-board/components/AddDependencyDialog.d.ts +8 -0
- package/dist/task-board/components/AddDependencyDialog.js +53 -0
- package/dist/task-board/components/AddDependencyDialog.js.map +1 -0
- package/dist/task-board/components/AssignAgentDialog.d.ts +7 -0
- package/dist/task-board/components/AssignAgentDialog.js +96 -0
- package/dist/task-board/components/AssignAgentDialog.js.map +1 -0
- package/dist/task-board/components/CommentsList.d.ts +3 -0
- package/dist/task-board/components/CommentsList.js +36 -0
- package/dist/task-board/components/CommentsList.js.map +1 -0
- package/dist/task-board/components/CreateProjectDialog.d.ts +7 -0
- package/dist/task-board/components/CreateProjectDialog.js +175 -0
- package/dist/task-board/components/CreateProjectDialog.js.map +1 -0
- package/dist/task-board/components/CreateTaskDialog.d.ts +7 -0
- package/dist/task-board/components/CreateTaskDialog.js +76 -0
- package/dist/task-board/components/CreateTaskDialog.js.map +1 -0
- package/dist/task-board/components/ProjectAgentsPanel.d.ts +4 -0
- package/dist/task-board/components/ProjectAgentsPanel.js +159 -0
- package/dist/task-board/components/ProjectAgentsPanel.js.map +1 -0
- package/dist/task-board/components/ProjectDashboard.d.ts +25 -0
- package/dist/task-board/components/ProjectDashboard.js +91 -0
- package/dist/task-board/components/ProjectDashboard.js.map +1 -0
- package/dist/task-board/components/ProjectList.d.ts +7 -0
- package/dist/task-board/components/ProjectList.js +74 -0
- package/dist/task-board/components/ProjectList.js.map +1 -0
- package/dist/task-board/components/ProjectSettingsDialog.d.ts +8 -0
- package/dist/task-board/components/ProjectSettingsDialog.js +146 -0
- package/dist/task-board/components/ProjectSettingsDialog.js.map +1 -0
- package/dist/task-board/components/TaskAgentPanel.d.ts +10 -0
- package/dist/task-board/components/TaskAgentPanel.js +42 -0
- package/dist/task-board/components/TaskAgentPanel.js.map +1 -0
- package/dist/task-board/components/TaskAssigneePicker.d.ts +12 -0
- package/dist/task-board/components/TaskAssigneePicker.js +115 -0
- package/dist/task-board/components/TaskAssigneePicker.js.map +1 -0
- package/dist/task-board/components/TaskBoardTitlebar.d.ts +1 -0
- package/dist/task-board/components/TaskBoardTitlebar.js +60 -0
- package/dist/task-board/components/TaskBoardTitlebar.js.map +1 -0
- package/dist/task-board/components/TaskCard.d.ts +9 -0
- package/dist/task-board/components/TaskCard.js +24 -0
- package/dist/task-board/components/TaskCard.js.map +1 -0
- package/dist/task-board/components/TaskDetailDialog.d.ts +11 -0
- package/dist/task-board/components/TaskDetailDialog.js +8 -0
- package/dist/task-board/components/TaskDetailDialog.js.map +1 -0
- package/dist/task-board/components/TaskDetailPanel.d.ts +13 -0
- package/dist/task-board/components/TaskDetailPanel.js +322 -0
- package/dist/task-board/components/TaskDetailPanel.js.map +1 -0
- package/dist/task-board/components/TaskRow.d.ts +9 -0
- package/dist/task-board/components/TaskRow.js +25 -0
- package/dist/task-board/components/TaskRow.js.map +1 -0
- package/dist/task-board/index.d.ts +15 -0
- package/dist/task-board/index.js +18 -0
- package/dist/task-board/index.js.map +1 -0
- package/dist/task-board/services/taskService.d.ts +52 -0
- package/dist/task-board/services/taskService.js +74 -0
- package/dist/task-board/services/taskService.js.map +1 -0
- package/dist/task-board/taskAgentConfig.d.ts +7 -0
- package/dist/task-board/taskAgentConfig.js +43 -0
- package/dist/task-board/taskAgentConfig.js.map +1 -0
- package/dist/task-board/taskAgentLink.d.ts +2 -0
- package/dist/task-board/taskAgentLink.js +35 -0
- package/dist/task-board/taskAgentLink.js.map +1 -0
- package/dist/task-board/taskBoardNavStore.d.ts +35 -0
- package/dist/task-board/taskBoardNavStore.js +42 -0
- package/dist/task-board/taskBoardNavStore.js.map +1 -0
- package/dist/task-board/taskExecutionStatus.d.ts +12 -0
- package/dist/task-board/taskExecutionStatus.js +96 -0
- package/dist/task-board/taskExecutionStatus.js.map +1 -0
- package/dist/task-board/taskStatus.d.ts +2 -0
- package/dist/task-board/taskStatus.js +26 -0
- package/dist/task-board/taskStatus.js.map +1 -0
- package/dist/task-board/types.d.ts +169 -0
- package/dist/task-board/types.js +2 -0
- package/dist/task-board/types.js.map +1 -0
- package/dist/task-board/utils/projectHierarchy.d.ts +13 -0
- package/dist/task-board/utils/projectHierarchy.js +34 -0
- package/dist/task-board/utils/projectHierarchy.js.map +1 -0
- package/dist/task-board/views/KanbanView.d.ts +14 -0
- package/dist/task-board/views/KanbanView.js +136 -0
- package/dist/task-board/views/KanbanView.js.map +1 -0
- package/dist/task-board/views/ListView.d.ts +13 -0
- package/dist/task-board/views/ListView.js +74 -0
- package/dist/task-board/views/ListView.js.map +1 -0
- package/dist/task-board/views/PlanningView.d.ts +7 -0
- package/dist/task-board/views/PlanningView.js +112 -0
- package/dist/task-board/views/PlanningView.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { toast } from "sonner";
|
|
4
|
+
import { Button } from "../../components/ui/button";
|
|
5
|
+
import { Dialog, DialogContent, DialogFooter } from "../../components/ui/dialog";
|
|
6
|
+
import { StyledDialogTitle } from "../../components/ui/styled-dialog-title";
|
|
7
|
+
import { Input } from "../../components/ui/input";
|
|
8
|
+
import { Label } from "../../components/ui/label";
|
|
9
|
+
import { Textarea } from "../../components/ui/textarea";
|
|
10
|
+
import { Select } from "../../components/ui/select";
|
|
11
|
+
import { Plus } from "lucide-react";
|
|
12
|
+
import { createTask } from "../services/taskService";
|
|
13
|
+
import { TaskAssigneePicker } from "./TaskAssigneePicker";
|
|
14
|
+
export function CreateTaskDialog(props) {
|
|
15
|
+
const { open, onOpenChange, projectId, parentTaskId, onCreated } = props;
|
|
16
|
+
const [title, setTitle] = useState("");
|
|
17
|
+
const [description, setDescription] = useState("");
|
|
18
|
+
const [status, setStatus] = useState("Todo");
|
|
19
|
+
const [priority, setPriority] = useState("");
|
|
20
|
+
const [assignee, setAssignee] = useState(null);
|
|
21
|
+
const [submitting, setSubmitting] = useState(false);
|
|
22
|
+
const submit = async () => {
|
|
23
|
+
if (!title.trim()) {
|
|
24
|
+
toast.error("Task title is required");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const body = {
|
|
28
|
+
projectId,
|
|
29
|
+
parentTaskId: parentTaskId ?? null,
|
|
30
|
+
title: title.trim(),
|
|
31
|
+
description: description.trim() ? description.trim() : undefined,
|
|
32
|
+
status,
|
|
33
|
+
priority: priority ? priority : null,
|
|
34
|
+
assigneeType: assignee?.assigneeType ?? null,
|
|
35
|
+
assigneeId: assignee?.assigneeId ?? null,
|
|
36
|
+
};
|
|
37
|
+
setSubmitting(true);
|
|
38
|
+
try {
|
|
39
|
+
const result = await createTask(body);
|
|
40
|
+
if (result.type !== "success") {
|
|
41
|
+
toast.error(result.summary || "Failed to create task");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
toast.success("Task created");
|
|
45
|
+
onOpenChange(false);
|
|
46
|
+
await onCreated();
|
|
47
|
+
// reset
|
|
48
|
+
setTitle("");
|
|
49
|
+
setDescription("");
|
|
50
|
+
setStatus("Todo");
|
|
51
|
+
setPriority("");
|
|
52
|
+
setAssignee(null);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
setSubmitting(false);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-lg", children: [_jsx(StyledDialogTitle, { icon: _jsx(Plus, { strokeWidth: 1 }), title: "Create Task", subtitle: parentTaskId ? "Create a subtask" : "Add a new task to this project" }), _jsxs("div", { className: "grid gap-6 p-6", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { htmlFor: "taskTitle", children: "Title *" }), _jsx(Input, { id: "taskTitle", value: title, onChange: (e) => setTitle(e.target.value), placeholder: "e.g. Implement user authentication", onKeyDown: (e) => {
|
|
59
|
+
if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
|
|
60
|
+
e.preventDefault();
|
|
61
|
+
void submit();
|
|
62
|
+
}
|
|
63
|
+
} })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { htmlFor: "taskDescription", children: "Description" }), _jsx(Textarea, { id: "taskDescription", value: description, onChange: (e) => setDescription(e.target.value), placeholder: "Optional description", rows: 4 })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { htmlFor: "taskStatus", children: "Status" }), _jsx(Select, { id: "taskStatus", value: status, onValueChange: (v) => setStatus(v), options: [
|
|
64
|
+
{ value: "Todo", label: "Todo" },
|
|
65
|
+
{ value: "InProgress", label: "In progress" },
|
|
66
|
+
{ value: "Review", label: "Review" },
|
|
67
|
+
{ value: "Done", label: "Done" },
|
|
68
|
+
] })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { htmlFor: "taskPriority", children: "Priority" }), _jsx(Select, { id: "taskPriority", value: priority, onValueChange: (v) => setPriority(v), options: [
|
|
69
|
+
{ value: "", label: "None" },
|
|
70
|
+
{ value: "Low", label: "Low" },
|
|
71
|
+
{ value: "Medium", label: "Medium" },
|
|
72
|
+
{ value: "High", label: "High" },
|
|
73
|
+
{ value: "Critical", label: "Critical" },
|
|
74
|
+
] })] })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: "Assignee" }), _jsx(TaskAssigneePicker, { projectId: projectId, assigneeType: assignee?.assigneeType ?? null, value: assignee?.assigneeId ?? null, displayValue: assignee?.displayName ?? null, disabled: submitting, onChange: setAssignee, placeholder: "Unassigned" })] })] }), _jsxs(DialogFooter, { className: "p-6 pt-0", children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: submitting, children: "Cancel" }), _jsx(Button, { onClick: submit, disabled: submitting || !title.trim(), children: submitting ? "Creating..." : "Create Task" })] })] }) }));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=CreateTaskDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateTaskDialog.js","sourceRoot":"","sources":["../../../src/task-board/components/CreateTaskDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { Bot, ExternalLink, RefreshCw } from "lucide-react";
|
|
4
|
+
import { Button } from "../../components/ui/button";
|
|
5
|
+
import { cn } from "../../lib/utils";
|
|
6
|
+
import { getActiveAgents } from "../../editor/services/agentService";
|
|
7
|
+
import { useEditContext } from "../../editor/client/editContext";
|
|
8
|
+
function getAgentContextString(agent) {
|
|
9
|
+
const anyAgent = agent;
|
|
10
|
+
const ctx = anyAgent?.agentContext ?? anyAgent?.AgentContext ?? null;
|
|
11
|
+
return typeof ctx === "string" ? ctx : null;
|
|
12
|
+
}
|
|
13
|
+
function agentMatchesProject(agent, projectId) {
|
|
14
|
+
const ctxStr = getAgentContextString(agent);
|
|
15
|
+
if (!ctxStr)
|
|
16
|
+
return false;
|
|
17
|
+
// Fast path: substring match on canonical JSON payload
|
|
18
|
+
if (ctxStr.includes(`"projectId":"${projectId}"`))
|
|
19
|
+
return true;
|
|
20
|
+
// Safe path: parse and check additionalData
|
|
21
|
+
try {
|
|
22
|
+
const parsed = JSON.parse(ctxStr);
|
|
23
|
+
const fromAdditional = parsed?.additionalData?.projectId;
|
|
24
|
+
if (typeof fromAdditional === "string" && fromAdditional === projectId)
|
|
25
|
+
return true;
|
|
26
|
+
if (typeof parsed?.projectId === "string" && parsed.projectId === projectId)
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// ignore non-JSON contexts
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
function getAgentRole(agent) {
|
|
35
|
+
const ctxStr = getAgentContextString(agent);
|
|
36
|
+
if (!ctxStr)
|
|
37
|
+
return null;
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(ctxStr);
|
|
40
|
+
const role = parsed?.additionalData?.role;
|
|
41
|
+
return typeof role === "string" ? role : null;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function formatAgentStatus(status) {
|
|
48
|
+
// Backend sometimes sends numeric enum status for initial fetch
|
|
49
|
+
if (typeof status === "number") {
|
|
50
|
+
switch (status) {
|
|
51
|
+
case 0:
|
|
52
|
+
return "new";
|
|
53
|
+
case 1:
|
|
54
|
+
return "running";
|
|
55
|
+
case 2:
|
|
56
|
+
return "waitingForApproval";
|
|
57
|
+
case 3:
|
|
58
|
+
return "completed";
|
|
59
|
+
case 4:
|
|
60
|
+
return "error";
|
|
61
|
+
case 5:
|
|
62
|
+
return "closed";
|
|
63
|
+
case 6:
|
|
64
|
+
return "idle";
|
|
65
|
+
case 7:
|
|
66
|
+
return "costLimitReached";
|
|
67
|
+
case 8:
|
|
68
|
+
return "waitingForInput";
|
|
69
|
+
default:
|
|
70
|
+
return String(status);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return String(status);
|
|
74
|
+
}
|
|
75
|
+
export function ProjectAgentsPanel(props) {
|
|
76
|
+
const { project } = props;
|
|
77
|
+
const editContext = useEditContext();
|
|
78
|
+
const [agents, setAgents] = useState([]);
|
|
79
|
+
const [loading, setLoading] = useState(false);
|
|
80
|
+
const projectId = project?.project.projectId ?? null;
|
|
81
|
+
const refresh = useCallback(async () => {
|
|
82
|
+
if (!projectId) {
|
|
83
|
+
setAgents([]);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
setLoading(true);
|
|
87
|
+
try {
|
|
88
|
+
const response = await getActiveAgents({
|
|
89
|
+
limit: 1000,
|
|
90
|
+
includeOwned: true,
|
|
91
|
+
includeShared: true,
|
|
92
|
+
excludeClosed: true,
|
|
93
|
+
});
|
|
94
|
+
const filtered = (response.agents ?? []).filter((a) => agentMatchesProject(a, projectId));
|
|
95
|
+
// Sort: most relevant roles first, then most recently updated
|
|
96
|
+
const sorted = filtered.sort((a, b) => {
|
|
97
|
+
const roleA = getAgentRole(a) ?? "";
|
|
98
|
+
const roleB = getAgentRole(b) ?? "";
|
|
99
|
+
const weight = (r) => {
|
|
100
|
+
if (r === "project-planner")
|
|
101
|
+
return 3;
|
|
102
|
+
if (r === "task-worker")
|
|
103
|
+
return 2;
|
|
104
|
+
return 0;
|
|
105
|
+
};
|
|
106
|
+
const w = weight(roleB) - weight(roleA);
|
|
107
|
+
if (w !== 0)
|
|
108
|
+
return w;
|
|
109
|
+
return (b.updatedDate ?? "").localeCompare(a.updatedDate ?? "");
|
|
110
|
+
});
|
|
111
|
+
setAgents(sorted);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
setLoading(false);
|
|
115
|
+
}
|
|
116
|
+
}, [projectId]);
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
refresh();
|
|
119
|
+
// Also refetch on socket reconnect
|
|
120
|
+
}, [refresh, editContext?.socketConnectionVersion]);
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
if (!editContext?.addSocketMessageListener)
|
|
123
|
+
return;
|
|
124
|
+
// Any agent lifecycle change for this user -> refresh list (project filter applied client-side)
|
|
125
|
+
const unsubscribe = editContext.addSocketMessageListener((message) => {
|
|
126
|
+
const t = message?.type;
|
|
127
|
+
if (t === "agent:run:start" ||
|
|
128
|
+
t === "agent:run:status" ||
|
|
129
|
+
t === "agent:run:complete" ||
|
|
130
|
+
t === "agent:run:error" ||
|
|
131
|
+
t === "agent:run:closed" ||
|
|
132
|
+
t === "agent:info:updated") {
|
|
133
|
+
// best-effort, no await
|
|
134
|
+
refresh();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
return () => unsubscribe();
|
|
138
|
+
}, [editContext?.addSocketMessageListener, refresh]);
|
|
139
|
+
const openAgent = useCallback((agentId) => {
|
|
140
|
+
editContext?.setShowAgentsPanel?.(true);
|
|
141
|
+
window.dispatchEvent(new CustomEvent("editor:openAgent", { detail: { agentId } }));
|
|
142
|
+
}, [editContext]);
|
|
143
|
+
const canSee = Boolean(projectId);
|
|
144
|
+
const countLabel = useMemo(() => {
|
|
145
|
+
if (!canSee)
|
|
146
|
+
return "Select a project";
|
|
147
|
+
if (loading)
|
|
148
|
+
return "Loading…";
|
|
149
|
+
return agents.length === 1 ? "1 agent" : `${agents.length} agents`;
|
|
150
|
+
}, [agents.length, canSee, loading]);
|
|
151
|
+
if (!project)
|
|
152
|
+
return null;
|
|
153
|
+
return (_jsxs("div", { className: "flex h-full flex-col border-l bg-white", children: [_jsxs("div", { className: "flex items-center justify-between border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Bot, { className: "h-5 w-5 text-muted-foreground" }), _jsxs("div", { children: [_jsx("div", { className: "text-sm font-semibold", children: "Project agents" }), _jsx("div", { className: "text-xs text-muted-foreground", children: countLabel })] })] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: refresh, disabled: loading || !projectId, children: _jsx(RefreshCw, { className: cn("h-4 w-4", loading && "animate-spin") }) })] }), _jsx("div", { className: "flex-1 overflow-auto p-3", children: !projectId ? (_jsx("div", { className: "p-3 text-xs text-muted-foreground", children: "Select a project to see its agents." })) : agents.length === 0 ? (_jsx("div", { className: "p-3 text-xs text-muted-foreground", children: "No active agents found for this project yet." })) : (_jsx("div", { className: "space-y-2", children: agents.map((a) => {
|
|
154
|
+
const role = getAgentRole(a);
|
|
155
|
+
const status = formatAgentStatus(a.status);
|
|
156
|
+
return (_jsxs("button", { onClick: () => openAgent(a.id), className: "w-full rounded-md border bg-white p-3 text-left hover:bg-muted/30", children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-medium", children: a.name || a.profileName || a.id }), _jsxs("div", { className: "mt-0.5 flex flex-wrap items-center gap-2 text-xs text-muted-foreground", children: [a.profileName && _jsx("span", { children: a.profileName }), role && _jsx("span", { className: "rounded bg-muted px-1.5 py-0.5", children: role }), _jsx("span", { className: "rounded bg-muted px-1.5 py-0.5", children: status })] })] }), _jsx(ExternalLink, { className: "h-4 w-4 shrink-0 text-muted-foreground" })] }), a.description ? (_jsx("div", { className: "mt-2 line-clamp-2 text-xs text-muted-foreground", children: a.description })) : null] }, a.id));
|
|
157
|
+
}) })) })] }));
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=ProjectAgentsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectAgentsPanel.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectAgentsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ProjectStatus, ProjectWithPermission } from "../types";
|
|
2
|
+
export type SubprojectTaskCounts = {
|
|
3
|
+
total: number;
|
|
4
|
+
todo: number;
|
|
5
|
+
inProgress: number;
|
|
6
|
+
review: number;
|
|
7
|
+
done: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function ProjectDashboard(props: {
|
|
10
|
+
selectedProjectTitle: string;
|
|
11
|
+
selectedProjectDescription?: string;
|
|
12
|
+
selectedProjectStatus?: ProjectStatus;
|
|
13
|
+
selectedProjectCostUsed?: number;
|
|
14
|
+
selectedProjectCostLimit?: number | null;
|
|
15
|
+
canEditProjectStatus?: boolean;
|
|
16
|
+
savingProjectStatus?: boolean;
|
|
17
|
+
onStatusChange?: (status: ProjectStatus) => void | Promise<void>;
|
|
18
|
+
selectedProjectTaskCounts: SubprojectTaskCounts;
|
|
19
|
+
subprojects: ProjectWithPermission[];
|
|
20
|
+
taskCountsByProjectId: Record<string, SubprojectTaskCounts>;
|
|
21
|
+
loading: boolean;
|
|
22
|
+
parentProjectId?: string | null;
|
|
23
|
+
parentProjectTitle?: string | null;
|
|
24
|
+
onSelectProject?: (projectId: string) => void;
|
|
25
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from "react";
|
|
3
|
+
import { ChevronDown, FolderTree, Loader2 } from "lucide-react";
|
|
4
|
+
import { Select } from "../../components/ui/select";
|
|
5
|
+
const EMPTY_COUNTS = {
|
|
6
|
+
total: 0,
|
|
7
|
+
todo: 0,
|
|
8
|
+
inProgress: 0,
|
|
9
|
+
review: 0,
|
|
10
|
+
done: 0,
|
|
11
|
+
};
|
|
12
|
+
const STATE_STOPS = [
|
|
13
|
+
{ key: "todo", label: "Todo", segmentClassName: "bg-slate-300" },
|
|
14
|
+
{ key: "inProgress", label: "In progress", segmentClassName: "bg-blue-400" },
|
|
15
|
+
{ key: "review", label: "Review", segmentClassName: "bg-amber-400" },
|
|
16
|
+
{ key: "done", label: "Done", segmentClassName: "bg-emerald-400" },
|
|
17
|
+
];
|
|
18
|
+
function TaskStateProgressBar(props) {
|
|
19
|
+
const { counts, compact = false } = props;
|
|
20
|
+
const total = counts.total;
|
|
21
|
+
return (_jsx("div", { className: `${compact ? "h-1.5" : "h-2"} w-full overflow-hidden rounded-full bg-slate-100`, children: total > 0 ? (_jsx("div", { className: "flex h-full w-full", children: STATE_STOPS.map((stop) => {
|
|
22
|
+
const value = counts[stop.key];
|
|
23
|
+
const widthPct = (value / total) * 100;
|
|
24
|
+
return (_jsx("div", { className: stop.segmentClassName, style: { width: `${widthPct}%` }, title: `${stop.label}: ${value}` }, stop.key));
|
|
25
|
+
}) })) : null }));
|
|
26
|
+
}
|
|
27
|
+
export function ProjectDashboard(props) {
|
|
28
|
+
const { selectedProjectTitle, selectedProjectDescription, selectedProjectStatus, selectedProjectCostUsed = 0, selectedProjectCostLimit = null, canEditProjectStatus = false, savingProjectStatus = false, onStatusChange, selectedProjectTaskCounts, subprojects, taskCountsByProjectId, loading, parentProjectId, parentProjectTitle, onSelectProject, } = props;
|
|
29
|
+
const hasSubprojects = subprojects.length > 0;
|
|
30
|
+
const [showSubprojects, setShowSubprojects] = useState(false);
|
|
31
|
+
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
32
|
+
const normalizedCostUsed = Number.isFinite(selectedProjectCostUsed) ? Math.max(0, selectedProjectCostUsed) : 0;
|
|
33
|
+
const hasCostLimit = typeof selectedProjectCostLimit === "number" && selectedProjectCostLimit > 0;
|
|
34
|
+
const costProgressPct = useMemo(() => {
|
|
35
|
+
if (!hasCostLimit || !selectedProjectCostLimit)
|
|
36
|
+
return 0;
|
|
37
|
+
const pct = (normalizedCostUsed / selectedProjectCostLimit) * 100;
|
|
38
|
+
return Math.max(0, Math.min(pct, 100));
|
|
39
|
+
}, [hasCostLimit, normalizedCostUsed, selectedProjectCostLimit]);
|
|
40
|
+
const costProgressClassName = costProgressPct >= 100 ? "bg-red-500" : costProgressPct >= 80 ? "bg-amber-500" : "bg-emerald-500";
|
|
41
|
+
const statusValue = selectedProjectStatus ?? "Active";
|
|
42
|
+
const aggregatedCounts = hasSubprojects
|
|
43
|
+
? subprojects.reduce((acc, subproject) => {
|
|
44
|
+
const counts = taskCountsByProjectId[subproject.project.projectId] || EMPTY_COUNTS;
|
|
45
|
+
return {
|
|
46
|
+
total: acc.total + counts.total,
|
|
47
|
+
todo: acc.todo + counts.todo,
|
|
48
|
+
inProgress: acc.inProgress + counts.inProgress,
|
|
49
|
+
review: acc.review + counts.review,
|
|
50
|
+
done: acc.done + counts.done,
|
|
51
|
+
};
|
|
52
|
+
}, {
|
|
53
|
+
total: selectedProjectTaskCounts.total,
|
|
54
|
+
todo: selectedProjectTaskCounts.todo,
|
|
55
|
+
inProgress: selectedProjectTaskCounts.inProgress,
|
|
56
|
+
review: selectedProjectTaskCounts.review,
|
|
57
|
+
done: selectedProjectTaskCounts.done,
|
|
58
|
+
})
|
|
59
|
+
: selectedProjectTaskCounts;
|
|
60
|
+
const rows = [
|
|
61
|
+
{
|
|
62
|
+
projectId: "selected-project",
|
|
63
|
+
title: selectedProjectTitle,
|
|
64
|
+
counts: aggregatedCounts,
|
|
65
|
+
compact: false,
|
|
66
|
+
indented: false,
|
|
67
|
+
isLink: false,
|
|
68
|
+
},
|
|
69
|
+
...(hasSubprojects && showSubprojects
|
|
70
|
+
? subprojects.map((subproject) => ({
|
|
71
|
+
projectId: subproject.project.projectId,
|
|
72
|
+
title: subproject.project.title,
|
|
73
|
+
counts: taskCountsByProjectId[subproject.project.projectId] || EMPTY_COUNTS,
|
|
74
|
+
compact: true,
|
|
75
|
+
indented: true,
|
|
76
|
+
isLink: true,
|
|
77
|
+
}))
|
|
78
|
+
: []),
|
|
79
|
+
];
|
|
80
|
+
return (_jsxs("div", { className: "mb-4", children: [parentProjectId && parentProjectTitle && onSelectProject && (_jsx("div", { className: "mb-3", children: _jsxs("button", { type: "button", className: "text-xs text-slate-600 hover:text-slate-800", onClick: () => onSelectProject(parentProjectId), children: ["\u2190 Back to ", parentProjectTitle] }) })), _jsxs("div", { className: "mb-4", children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-[minmax(0,1fr)_220px]", children: [_jsxs("div", { children: [_jsx("div", { className: "text-[11px] font-semibold uppercase tracking-wider text-slate-500", children: "Description" }), _jsx("div", { className: "mt-1 text-sm text-slate-700", children: selectedProjectDescription?.trim() || "No description" })] }), _jsxs("div", { children: [_jsx("div", { className: "text-[11px] font-semibold uppercase tracking-wider text-slate-500", children: "Status" }), _jsx("div", { className: "mt-1", children: _jsx(Select, { value: statusValue, onValueChange: (value) => onStatusChange?.(value), disabled: !canEditProjectStatus || savingProjectStatus || !onStatusChange, options: [
|
|
81
|
+
{ value: "Planning", label: "Planning" },
|
|
82
|
+
{ value: "PlanPending", label: "Plan Pending" },
|
|
83
|
+
{ value: "Active", label: "Active" },
|
|
84
|
+
{ value: "Finished", label: "Finished" },
|
|
85
|
+
{ value: "Archived", label: "Archived" },
|
|
86
|
+
], className: "h-8 text-xs" }) })] })] }), _jsxs("div", { className: "mt-3", children: [_jsxs("div", { className: "mb-2 flex items-baseline justify-between gap-3", children: [_jsxs("div", { className: "text-sm font-semibold text-slate-900", children: ["$", normalizedCostUsed.toFixed(2)] }), _jsx("div", { className: "text-xs text-slate-600", children: hasCostLimit ? `Limit: $${selectedProjectCostLimit?.toFixed(2)}` : "Limit: No limit" })] }), _jsxs("div", { className: "mb-1.5 flex items-center justify-between text-[11px] font-semibold uppercase tracking-wider text-slate-500", children: [_jsx("span", { children: "Cumulative cost" }), _jsxs("span", { className: "normal-case tracking-normal text-slate-600", children: ["$", normalizedCostUsed.toFixed(2), hasCostLimit ? ` / $${selectedProjectCostLimit?.toFixed(2)}` : " (No limit)"] })] }), _jsx("div", { className: "h-2 w-full overflow-hidden rounded-full bg-slate-100", children: hasCostLimit ? (_jsx("div", { className: `h-full ${costProgressClassName}`, style: { width: `${costProgressPct}%` } })) : (_jsx("div", { className: "h-full w-1/3 bg-slate-300/80" })) })] })] }), _jsxs("div", { className: "mb-3 flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FolderTree, { className: "h-4 w-4 text-slate-600" }), _jsx("button", { type: "button", className: "text-left text-base font-semibold tracking-tight text-slate-900 hover:text-slate-700", onClick: () => setIsCollapsed((prev) => !prev), "aria-label": isCollapsed ? "Expand dashboard" : "Collapse dashboard", title: isCollapsed ? "Expand dashboard" : "Collapse dashboard", children: "Progress" }), _jsx("span", { className: "rounded-full bg-secondary px-2.5 py-0.5 text-xs font-semibold text-secondary-foreground", children: rows.length })] }), _jsxs("div", { className: "flex items-center gap-2", children: [loading && (_jsxs("div", { className: "flex items-center gap-1 text-xs text-slate-500", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), "Updating"] })), _jsx("button", { type: "button", className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-slate-500 hover:bg-slate-100 hover:text-slate-700", onClick: () => setIsCollapsed((prev) => !prev), "aria-label": isCollapsed ? "Expand dashboard" : "Collapse dashboard", title: isCollapsed ? "Expand dashboard" : "Collapse dashboard", children: _jsx(ChevronDown, { className: `h-3.5 w-3.5 transition-transform ${isCollapsed ? "rotate-0" : "rotate-180"}` }) })] })] }), !isCollapsed && (_jsxs(_Fragment, { children: [_jsx("div", { className: hasSubprojects ? "space-y-2" : "space-y-3", children: rows.map((row) => {
|
|
87
|
+
const isRootRow = row.projectId === "selected-project";
|
|
88
|
+
return (_jsxs("div", { className: row.compact ? "space-y-0.5" : "space-y-1", children: [_jsxs("div", { className: `flex items-center justify-between gap-4 ${row.compact ? "text-xs" : "text-sm"} ${row.indented ? "pl-4" : ""}`, children: [isRootRow && hasSubprojects ? (_jsx("button", { type: "button", className: `truncate text-left text-slate-800 hover:text-slate-900 ${row.compact ? "font-medium" : "font-medium"}`, onClick: () => setShowSubprojects((prev) => !prev), "aria-label": showSubprojects ? "Hide subprojects" : "Show subprojects", title: showSubprojects ? "Hide subprojects" : "Show subprojects", children: row.title })) : row.isLink && onSelectProject ? (_jsx("button", { type: "button", className: `truncate text-left text-slate-700 hover:text-slate-900 ${row.compact ? "font-medium" : "font-medium"}`, onClick: () => onSelectProject(row.projectId), children: row.title })) : (_jsx("div", { className: `truncate text-slate-800 ${row.compact ? "font-medium" : "font-medium"}`, children: row.title })), _jsxs("div", { className: `shrink-0 text-slate-600 ${row.compact ? "text-[11px]" : "text-xs"}`, children: [row.counts.total, " tasks"] })] }), _jsxs("div", { className: `flex items-center gap-2 ${row.indented ? "pl-4 pr-6" : ""}`, children: [_jsx("div", { className: "min-w-0 flex-1", children: _jsx(TaskStateProgressBar, { counts: row.counts, compact: row.compact }) }), hasSubprojects && isRootRow && (_jsx("button", { type: "button", className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-slate-500 hover:bg-slate-100 hover:text-slate-700", onClick: () => setShowSubprojects((prev) => !prev), "aria-label": showSubprojects ? "Hide subprojects" : "Show subprojects", title: showSubprojects ? "Hide subprojects" : "Show subprojects", children: _jsx(ChevronDown, { className: `h-3.5 w-3.5 transition-transform ${showSubprojects ? "rotate-180" : "rotate-0"}` }) }))] })] }, row.projectId));
|
|
89
|
+
}) }), _jsx("div", { className: "mt-4 grid grid-cols-2 gap-1 text-[11px] sm:grid-cols-4", children: STATE_STOPS.map((stop) => (_jsxs("div", { className: "flex items-center gap-1.5 text-slate-600", children: [_jsx("span", { className: `inline-block h-2 w-2 rounded-full ${stop.segmentClassName}` }), _jsx("span", { children: stop.label })] }, stop.key))) })] }))] }));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=ProjectDashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectDashboard.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectDashboard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProjectWithPermission } from "../types";
|
|
2
|
+
export declare function ProjectList(props: {
|
|
3
|
+
projects: ProjectWithPermission[];
|
|
4
|
+
selectedProjectId: string | null;
|
|
5
|
+
onSelectProject: (projectId: string) => void;
|
|
6
|
+
onProjectsChanged: () => void;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from "react";
|
|
3
|
+
import { toast } from "sonner";
|
|
4
|
+
import { Plus, Settings, FolderKanban, LayoutGrid, Shield, Trash2 } from "lucide-react";
|
|
5
|
+
import { Button } from "../../components/ui/button";
|
|
6
|
+
import { cn } from "../../lib/utils";
|
|
7
|
+
import { useEditContext } from "../../editor/client/editContext";
|
|
8
|
+
import { deleteProject } from "../services/taskService";
|
|
9
|
+
import { CreateProjectDialog } from "./CreateProjectDialog";
|
|
10
|
+
import { ProjectSettingsDialog } from "./ProjectSettingsDialog";
|
|
11
|
+
import { flattenProjectsHierarchy } from "../utils/projectHierarchy";
|
|
12
|
+
export function ProjectList(props) {
|
|
13
|
+
const { projects, selectedProjectId, onSelectProject, onProjectsChanged } = props;
|
|
14
|
+
const editContext = useEditContext();
|
|
15
|
+
const [createOpen, setCreateOpen] = useState(false);
|
|
16
|
+
const [settingsProjectId, setSettingsProjectId] = useState(null);
|
|
17
|
+
const selected = useMemo(() => projects.find((p) => p.project.projectId === selectedProjectId) ?? null, [projects, selectedProjectId]);
|
|
18
|
+
const orderedProjects = useMemo(() => flattenProjectsHierarchy(projects.map((projectWithPermission) => ({
|
|
19
|
+
...projectWithPermission,
|
|
20
|
+
projectId: projectWithPermission.project.projectId,
|
|
21
|
+
parentProjectId: projectWithPermission.project.parentProjectId ?? null,
|
|
22
|
+
title: projectWithPermission.project.title,
|
|
23
|
+
}))), [projects]);
|
|
24
|
+
const handleDeleteProject = (projectId, title) => {
|
|
25
|
+
const runDelete = async () => {
|
|
26
|
+
const result = await deleteProject(projectId);
|
|
27
|
+
if (result.type !== "success") {
|
|
28
|
+
toast.error(result.summary || "Failed to delete project");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
toast.success("Project deleted");
|
|
32
|
+
const fallbackProjectId = projects.find((p) => p.project.projectId !== projectId)?.project.projectId;
|
|
33
|
+
await onProjectsChanged();
|
|
34
|
+
if (selectedProjectId === projectId && fallbackProjectId) {
|
|
35
|
+
onSelectProject(fallbackProjectId);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
if (editContext?.confirm) {
|
|
39
|
+
editContext.confirm({
|
|
40
|
+
header: "Delete project",
|
|
41
|
+
message: `Are you sure you want to delete \"${title}\"?\n\nThis action cannot be undone.`,
|
|
42
|
+
acceptLabel: "Delete",
|
|
43
|
+
showCancel: true,
|
|
44
|
+
accept: () => {
|
|
45
|
+
void runDelete();
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
void runDelete();
|
|
51
|
+
};
|
|
52
|
+
return (_jsxs("div", { className: "flex h-full flex-col bg-slate-50/30 border-r", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-4 mb-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FolderKanban, { className: "h-5 w-5 text-primary" }), _jsx("h2", { className: "text-sm font-bold uppercase tracking-wider text-slate-500", children: "Projects" })] }), _jsx(Button, { size: "icon", variant: "ghost", className: "h-8 w-8 rounded-full hover:bg-white hover:shadow-sm", onClick: () => setCreateOpen(true), children: _jsx(Plus, { className: "h-4 w-4" }) })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: _jsx("div", { className: "flex flex-col gap-1 px-3 pb-4", children: projects.length === 0 ? (_jsx("div", { className: "px-4 py-8 text-center rounded-xl border border-dashed border-slate-200 bg-white/50", children: _jsx("p", { className: "text-xs text-slate-400", children: "No projects yet" }) })) : (orderedProjects.map((p) => {
|
|
53
|
+
const isSelected = p.project.projectId === selectedProjectId;
|
|
54
|
+
const isOwner = p.permission === "Owner";
|
|
55
|
+
const depthIndent = Math.max(0, Math.min(p.depth ?? 0, 6)) * 14;
|
|
56
|
+
return (_jsxs("div", { className: cn("group relative flex items-center justify-between gap-2 rounded-xl px-3 py-2.5 transition-all cursor-pointer", isSelected
|
|
57
|
+
? "bg-white text-primary shadow-sm ring-1 ring-slate-200"
|
|
58
|
+
: "text-slate-600 hover:bg-white/60"), style: { marginLeft: depthIndent > 0 ? `${depthIndent}px` : undefined }, onClick: () => onSelectProject(p.project.projectId), children: [isSelected && (_jsx("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 w-1 h-6 bg-primary rounded-r-full" })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2 mb-0.5", children: [_jsx(LayoutGrid, { className: cn("h-3.5 w-3.5", isSelected ? "text-primary" : "text-slate-400") }), _jsx("div", { className: cn("truncate text-sm font-semibold tracking-tight", isSelected ? "text-slate-900" : "text-slate-700"), children: p.project.title })] }), _jsxs("div", { className: "flex items-center gap-1.5 pl-5", children: [_jsx(Shield, { className: "h-2.5 w-2.5 text-slate-400" }), _jsx("span", { className: "text-[10px] uppercase font-bold tracking-widest text-slate-400", children: p.permission })] })] }), isOwner ? (_jsxs("div", { className: cn("flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity", isSelected && "opacity-100"), children: [_jsx(Button, { size: "icon", variant: "ghost", className: "h-7 w-7 rounded-lg hover:bg-slate-100", onClick: (e) => {
|
|
59
|
+
e.stopPropagation();
|
|
60
|
+
setSettingsProjectId(p.project.projectId);
|
|
61
|
+
}, title: "Project settings", children: _jsx(Settings, { className: "h-3.5 w-3.5" }) }), _jsx(Button, { size: "icon", variant: "ghost", className: "h-7 w-7 rounded-lg text-destructive hover:bg-destructive/10 hover:text-destructive", onClick: (e) => {
|
|
62
|
+
e.stopPropagation();
|
|
63
|
+
handleDeleteProject(p.project.projectId, p.project.title);
|
|
64
|
+
}, title: "Delete project", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) })] })) : null] }, p.project.projectId));
|
|
65
|
+
})) }) }), _jsx(CreateProjectDialog, { open: createOpen, onOpenChange: setCreateOpen, projects: projects, onCreated: async (newProjectId) => {
|
|
66
|
+
await onProjectsChanged();
|
|
67
|
+
if (newProjectId)
|
|
68
|
+
onSelectProject(newProjectId);
|
|
69
|
+
} }), _jsx(ProjectSettingsDialog, { open: !!settingsProjectId, onOpenChange: (open) => {
|
|
70
|
+
if (!open)
|
|
71
|
+
setSettingsProjectId(null);
|
|
72
|
+
}, projectId: settingsProjectId, selectedProject: selected, onChanged: onProjectsChanged })] }));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=ProjectList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectList.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProjectWithPermission } from "../types";
|
|
2
|
+
export declare function ProjectSettingsDialog(props: {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
projectId: string | null;
|
|
6
|
+
selectedProject: ProjectWithPermission | null;
|
|
7
|
+
onChanged: () => void | Promise<void>;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|