@parhelia/core 0.1.12889 → 0.1.12890
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/AgentCard.js +2 -7
- package/dist/agents-view/AgentCard.js.map +1 -1
- package/dist/agents-view/AgentGalleryCard.js +2 -3
- package/dist/agents-view/AgentGalleryCard.js.map +1 -1
- package/dist/agents-view/AgentProfileIcon.d.ts +9 -0
- package/dist/agents-view/AgentProfileIcon.js +28 -0
- package/dist/agents-view/AgentProfileIcon.js.map +1 -0
- package/dist/agents-view/AgentsView.d.ts +6 -1
- package/dist/agents-view/AgentsView.js +4 -4
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/agents-view/DateAgentsGroup.js +1 -1
- package/dist/agents-view/DateAgentsGroup.js.map +1 -1
- package/dist/agents-view/ProfileAgentsGroup.js +2 -5
- package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
- package/dist/config/config.js +4 -3
- package/dist/config/config.js.map +1 -1
- package/dist/editor/GlobalMenuBar.js +2 -1
- package/dist/editor/GlobalMenuBar.js.map +1 -1
- package/dist/editor/MainLayout.js +11 -9
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/WorkspaceTitleSwitcher.d.ts +5 -0
- package/dist/editor/WorkspaceTitleSwitcher.js +86 -0
- package/dist/editor/WorkspaceTitleSwitcher.js.map +1 -0
- package/dist/editor/ai/Agents.js +155 -43
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +1 -1
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +3 -3
- package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptComposer.d.ts +2 -1
- package/dist/editor/ai/terminal/components/AgentPromptComposer.js +5 -2
- package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +2 -1
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +5 -3
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +3 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalSummaryLayout.js +2 -1
- package/dist/editor/ai/terminal/components/AgentTerminalSummaryLayout.js.map +1 -1
- package/dist/editor/bridge/protocol.d.ts +0 -5
- package/dist/editor/bridge/protocol.js.map +1 -1
- package/dist/editor/client/EditorShell.js +14 -7
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.d.ts +1 -0
- package/dist/editor/client/pageModelBuilder.js +22 -13
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/content-tree/IndicatorSettings.js +3 -2
- package/dist/editor/content-tree/IndicatorSettings.js.map +1 -1
- package/dist/editor/menubar/ItemLanguageVersion.js +3 -14
- package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
- package/dist/editor/menubar/VersionSelector.d.ts +3 -2
- package/dist/editor/menubar/VersionSelector.js +28 -12
- package/dist/editor/menubar/VersionSelector.js.map +1 -1
- package/dist/editor/notifications/NotificationItem.js +3 -2
- package/dist/editor/notifications/NotificationItem.js.map +1 -1
- package/dist/editor/notifications/watchEventOptions.js +3 -2
- package/dist/editor/notifications/watchEventOptions.js.map +1 -1
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +8 -2
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +67 -0
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/settings/panels/AgentProfileConfigPanel.js +3 -2
- package/dist/editor/settings/panels/AgentProfileConfigPanel.js.map +1 -1
- package/dist/editor/settings/panels/JavaScriptToolAgentPanel.js +3 -2
- package/dist/editor/settings/panels/JavaScriptToolAgentPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplateAgentPanel.js +3 -2
- package/dist/editor/settings/panels/ProjectTemplateAgentPanel.js.map +1 -1
- package/dist/editor/template-wizard/TemplateStructureInlineEditor.js +3 -2
- package/dist/editor/template-wizard/TemplateStructureInlineEditor.js.map +1 -1
- package/dist/editor/tree-indicators/GutterColumns.js +3 -2
- package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
- package/dist/editor/ui/Icons.js +1 -1
- package/dist/editor/ui/Icons.js.map +1 -1
- package/dist/editor/ui/SimpleTabs.d.ts +2 -1
- package/dist/editor/ui/SimpleTabs.js +23 -5
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.js +120 -3
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/editor/ui/splitterResizeEvent.d.ts +7 -0
- package/dist/editor/ui/splitterResizeEvent.js +6 -0
- package/dist/editor/ui/splitterResizeEvent.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/ModernSplashScreen.js +20 -11
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/task-board/TaskBoardWorkspace.js +112 -132
- package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
- package/dist/task-board/components/CreateTaskDialog.js +1 -1
- package/dist/task-board/components/CreateTaskDialog.js.map +1 -1
- package/dist/task-board/components/ProjectDashboard.d.ts +12 -22
- package/dist/task-board/components/ProjectDashboard.js +120 -108
- package/dist/task-board/components/ProjectDashboard.js.map +1 -1
- package/dist/task-board/components/ProjectOverviewContent.js +3 -0
- package/dist/task-board/components/ProjectOverviewContent.js.map +1 -1
- package/dist/task-board/components/ProjectPropertiesPanel.d.ts +2 -0
- package/dist/task-board/components/ProjectPropertiesPanel.js +7 -4
- package/dist/task-board/components/ProjectPropertiesPanel.js.map +1 -1
- package/dist/task-board/components/ProjectSettingsDialog.d.ts +16 -0
- package/dist/task-board/components/ProjectSettingsDialog.js +55 -47
- package/dist/task-board/components/ProjectSettingsDialog.js.map +1 -1
- package/dist/task-board/components/TaskAgentPanel.js +6 -5
- package/dist/task-board/components/TaskAgentPanel.js.map +1 -1
- package/dist/task-board/components/TaskAssigneePicker.js +3 -2
- package/dist/task-board/components/TaskAssigneePicker.js.map +1 -1
- package/dist/task-board/components/TaskAttachmentsSection.js +1 -1
- package/dist/task-board/components/TaskAttachmentsSection.js.map +1 -1
- package/dist/task-board/components/TaskBoardHomeView.d.ts +1 -21
- package/dist/task-board/components/TaskBoardHomeView.js +18 -155
- package/dist/task-board/components/TaskBoardHomeView.js.map +1 -1
- package/dist/task-board/components/TaskBoardProjectListSidebar.js +74 -12
- package/dist/task-board/components/TaskBoardProjectListSidebar.js.map +1 -1
- package/dist/task-board/components/TaskBoardTitlebar.js +9 -52
- package/dist/task-board/components/TaskBoardTitlebar.js.map +1 -1
- package/dist/task-board/components/TaskCard.js +5 -13
- package/dist/task-board/components/TaskCard.js.map +1 -1
- package/dist/task-board/components/TaskRow.js +3 -2
- package/dist/task-board/components/TaskRow.js.map +1 -1
- package/dist/task-board/taskBoardNavStore.d.ts +0 -2
- package/dist/task-board/taskBoardNavStore.js +0 -2
- package/dist/task-board/taskBoardNavStore.js.map +1 -1
- package/dist/task-board/views/DependencyGraphView.js +3 -2
- package/dist/task-board/views/DependencyGraphView.js.map +1 -1
- package/dist/task-board/views/KanbanView.js +161 -38
- package/dist/task-board/views/KanbanView.js.map +1 -1
- package/dist/task-board/views/ListView.js +1 -2
- package/dist/task-board/views/ListView.js.map +1 -1
- package/dist/task-board/views/WizardView.d.ts +2 -0
- package/dist/task-board/views/WizardView.js +7 -4
- package/dist/task-board/views/WizardView.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState, } fr
|
|
|
3
3
|
import { toast } from "sonner";
|
|
4
4
|
import { cn } from "../lib/utils";
|
|
5
5
|
import { Splitter } from "../editor/ui/Splitter";
|
|
6
|
-
import { deleteProject, getExecutionState, getGraphLayout, getProject, getProjects, getTasks, getMyTasks, getDependencies, restartProject, runOrchestrator, triggerPlanning,
|
|
6
|
+
import { deleteProject, getExecutionState, getGraphLayout, getProject, getProjects, getTasks, getMyTasks, getDependencies, restartProject, runOrchestrator, triggerPlanning, updateTask, } from "./services/taskService";
|
|
7
7
|
import { loadAiProfiles } from "../editor/services/aiService";
|
|
8
8
|
import { useEditContext } from "../editor/client/editContext";
|
|
9
9
|
import { LicenseFeatures, useFeature } from "../licensing";
|
|
@@ -13,10 +13,11 @@ import { WizardView } from "./views/WizardView";
|
|
|
13
13
|
import { SimpleTabs } from "../editor/ui/SimpleTabs";
|
|
14
14
|
import { TaskDetailPanel, } from "./components/TaskDetailPanel";
|
|
15
15
|
import { TaskAgentPanel } from "./components/TaskAgentPanel";
|
|
16
|
-
import { ProjectDashboard, } from "./components/ProjectDashboard";
|
|
16
|
+
import { ProjectDashboard, ProjectKpisPanel, } from "./components/ProjectDashboard";
|
|
17
17
|
import { CreateTaskDialog } from "./components/CreateTaskDialog";
|
|
18
18
|
import { CreateProjectDialog } from "./components/CreateProjectDialog";
|
|
19
|
-
import {
|
|
19
|
+
import { ProjectSettingsPanel } from "./components/ProjectSettingsDialog";
|
|
20
|
+
import { ProjectPropertiesPanel } from "./components/ProjectPropertiesPanel";
|
|
20
21
|
import { TaskBoardHomeView } from "./components/TaskBoardHomeView";
|
|
21
22
|
import { EditorSlotContextProvider } from "../editor/views/editorSlotContext";
|
|
22
23
|
import { SingleEditView } from "../editor/views/SingleEditView";
|
|
@@ -30,8 +31,7 @@ import { normalizeTaskStatus } from "./taskStatus";
|
|
|
30
31
|
import { getTaskExecutionDisplay, } from "./taskExecutionStatus";
|
|
31
32
|
import { indexTaskExecutionRecords, overlayTaskExecutionList, } from "./taskExecutionRecords";
|
|
32
33
|
import { WizardCommunicationCenter } from "./components/WizardCommunicationCenter";
|
|
33
|
-
import {
|
|
34
|
-
import { Loader2, Plus } from "lucide-react";
|
|
34
|
+
import { Loader2 } from "lucide-react";
|
|
35
35
|
import { MainContentTree } from "../editor/sidebar/MainContentTree";
|
|
36
36
|
import { useTaskBoardAgentPanelState } from "./useTaskBoardAgentPanelState";
|
|
37
37
|
const DependencyGraphView = lazy(() => import("./views/DependencyGraphView").then((module) => ({
|
|
@@ -48,8 +48,19 @@ function TaskboardPreviewEditor() {
|
|
|
48
48
|
const TASKBOARD_PROJECT_QUERY_KEY = "tbProjectId";
|
|
49
49
|
const TASKBOARD_TASK_QUERY_KEY = "tbTaskId";
|
|
50
50
|
const TASKBOARD_VIEW_QUERY_KEY = "tbView";
|
|
51
|
-
const TASKBOARD_WIZARD_QUERY_KEY = "tbWizard";
|
|
52
51
|
const WS_REFRESH_DELAY_MS = 500;
|
|
52
|
+
const TASKBOARD_VIEW_TAB_IDS = [
|
|
53
|
+
"overview",
|
|
54
|
+
"kanban",
|
|
55
|
+
"list",
|
|
56
|
+
"graph",
|
|
57
|
+
"kpis",
|
|
58
|
+
"settings",
|
|
59
|
+
"properties",
|
|
60
|
+
];
|
|
61
|
+
function getTaskBoardViewTabIndex(view) {
|
|
62
|
+
return TASKBOARD_VIEW_TAB_IDS.indexOf(view);
|
|
63
|
+
}
|
|
53
64
|
function getInitialQueryValue(queryKey) {
|
|
54
65
|
if (typeof window === "undefined")
|
|
55
66
|
return null;
|
|
@@ -58,15 +69,14 @@ function getInitialQueryValue(queryKey) {
|
|
|
58
69
|
}
|
|
59
70
|
function getInitialViewTabIndex() {
|
|
60
71
|
const view = getInitialQueryValue(TASKBOARD_VIEW_QUERY_KEY)?.toLowerCase();
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return value === "true" || value === "1";
|
|
72
|
+
const index = TASKBOARD_VIEW_TAB_IDS.indexOf(view);
|
|
73
|
+
if (index < 0) {
|
|
74
|
+
const legacyWizardMode = getInitialQueryValue("tbWizard")?.toLowerCase();
|
|
75
|
+
if (legacyWizardMode === "true" || legacyWizardMode === "1") {
|
|
76
|
+
return getTaskBoardViewTabIndex("overview");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return index >= 0 ? index : getTaskBoardViewTabIndex("kanban");
|
|
70
80
|
}
|
|
71
81
|
function getTaskBoardStateFromUrl() {
|
|
72
82
|
const projectId = getInitialQueryValue(TASKBOARD_PROJECT_QUERY_KEY);
|
|
@@ -74,7 +84,6 @@ function getTaskBoardStateFromUrl() {
|
|
|
74
84
|
projectId,
|
|
75
85
|
taskId: projectId ? getInitialQueryValue(TASKBOARD_TASK_QUERY_KEY) : null,
|
|
76
86
|
activeTab: getInitialViewTabIndex(),
|
|
77
|
-
isWizardMode: getInitialWizardMode(),
|
|
78
87
|
};
|
|
79
88
|
}
|
|
80
89
|
function getTaskExecutionRecordById(recordsByTaskId, taskId) {
|
|
@@ -145,7 +154,6 @@ export function TaskBoardWorkspace() {
|
|
|
145
154
|
const currentItemDescriptor = editContext?.currentItemDescriptor;
|
|
146
155
|
const [projects, setProjects] = useState([]);
|
|
147
156
|
const [mobileActiveTab, setMobileActiveTab] = useState(0);
|
|
148
|
-
const [homeActiveTab, setHomeActiveTab] = useState(0);
|
|
149
157
|
const [selectedProjectId, setSelectedProjectId] = useState(() => getInitialQueryValue(TASKBOARD_PROJECT_QUERY_KEY));
|
|
150
158
|
const [tasks, setTasks] = useState([]);
|
|
151
159
|
const [isTasksLoading, setIsTasksLoading] = useState(false);
|
|
@@ -155,11 +163,15 @@ export function TaskBoardWorkspace() {
|
|
|
155
163
|
const [selectedTaskId, setSelectedTaskId] = useState(() => getInitialQueryValue(TASKBOARD_TASK_QUERY_KEY));
|
|
156
164
|
const [selectedTaskSource, setSelectedTaskSource] = useState(() => getInitialQueryValue(TASKBOARD_TASK_QUERY_KEY) ? "system" : null);
|
|
157
165
|
const [activeTab, setActiveTab] = useState(() => getInitialViewTabIndex());
|
|
158
|
-
const
|
|
166
|
+
const activeViewTabId = TASKBOARD_VIEW_TAB_IDS[activeTab] ?? "kanban";
|
|
167
|
+
const isOverviewView = activeViewTabId === "overview";
|
|
168
|
+
const isListView = activeViewTabId === "list";
|
|
169
|
+
const isGraphView = activeViewTabId === "graph";
|
|
170
|
+
const isKpisView = activeViewTabId === "kpis";
|
|
171
|
+
const isSettingsView = activeViewTabId === "settings";
|
|
172
|
+
const isPropertiesView = activeViewTabId === "properties";
|
|
159
173
|
const [createDialogOpen, setCreateDialogOpen] = useState(false);
|
|
160
174
|
const [createProjectOpen, setCreateProjectOpen] = useState(false);
|
|
161
|
-
const [settingsProjectId, setSettingsProjectId] = useState(null);
|
|
162
|
-
const [savingProjectStatus, setSavingProjectStatus] = useState(false);
|
|
163
175
|
const [runningOrchestrator, setRunningOrchestrator] = useState(false);
|
|
164
176
|
const [showAllProjects, setShowAllProjects] = useState(false);
|
|
165
177
|
const [isProjectsLoading, setIsProjectsLoading] = useState(false);
|
|
@@ -219,22 +231,11 @@ export function TaskBoardWorkspace() {
|
|
|
219
231
|
const previousTaskStatusesRef = useRef({});
|
|
220
232
|
const previousWizardAttentionSignatureRef = useRef("");
|
|
221
233
|
const autoSelectedProjectIdsRef = useRef(new Set());
|
|
222
|
-
const userFirstName = useMemo(() => {
|
|
223
|
-
const user = editContext?.user;
|
|
224
|
-
if (!user)
|
|
225
|
-
return "";
|
|
226
|
-
if (user.fullName) {
|
|
227
|
-
return user.fullName.trim().split(/\s+/)[0] ?? "";
|
|
228
|
-
}
|
|
229
|
-
const namePart = user.name?.split("\\").pop() ?? user.name ?? "";
|
|
230
|
-
return namePart;
|
|
231
|
-
}, [editContext?.user]);
|
|
232
234
|
const syncTaskBoardStateFromUrl = useCallback(() => {
|
|
233
235
|
const nextState = getTaskBoardStateFromUrl();
|
|
234
236
|
setSelectedProjectId(nextState.projectId);
|
|
235
237
|
setTaskSelection(nextState.taskId, { source: "system" });
|
|
236
238
|
setActiveTab(nextState.activeTab);
|
|
237
|
-
setIsWizardMode(nextState.isWizardMode);
|
|
238
239
|
setWizardForceOverview(false);
|
|
239
240
|
}, [setTaskSelection]);
|
|
240
241
|
const isProjectWithinSelectedTree = useCallback((projectId, currentProjectId) => {
|
|
@@ -322,7 +323,6 @@ export function TaskBoardWorkspace() {
|
|
|
322
323
|
}, [editContext?.user?.name]);
|
|
323
324
|
const tasksWithDisplayAssignees = useMemo(() => addAgentDisplayNames(overlayTaskExecutionList(tasks, executionRecordsByTaskId), agentProfileTitlesById), [tasks, executionRecordsByTaskId, agentProfileTitlesById]);
|
|
324
325
|
const selectedProject = useMemo(() => projects.find((p) => p.project.projectId === selectedProjectId) ?? null, [projects, selectedProjectId]);
|
|
325
|
-
const settingsProject = useMemo(() => projects.find((p) => p.project.projectId === settingsProjectId) ?? null, [projects, settingsProjectId]);
|
|
326
326
|
const selectedProjectTaskCounts = useMemo(() => buildTaskCounts(tasksWithDisplayAssignees), [tasksWithDisplayAssignees]);
|
|
327
327
|
const directSubprojects = useMemo(() => selectedProjectId
|
|
328
328
|
? projects
|
|
@@ -360,9 +360,13 @@ export function TaskBoardWorkspace() {
|
|
|
360
360
|
}
|
|
361
361
|
return merged;
|
|
362
362
|
}, [executionRecordsByTaskId, subprojectExecutionRecordsByProjectId]);
|
|
363
|
-
const taskSelectionUniverse = useMemo(() =>
|
|
363
|
+
const taskSelectionUniverse = useMemo(() => isOverviewView
|
|
364
364
|
? wizardTasksWithDisplayAssignees
|
|
365
|
-
: tasksWithDisplayAssignees, [
|
|
365
|
+
: tasksWithDisplayAssignees, [
|
|
366
|
+
isOverviewView,
|
|
367
|
+
wizardTasksWithDisplayAssignees,
|
|
368
|
+
tasksWithDisplayAssignees,
|
|
369
|
+
]);
|
|
366
370
|
const selectedProjectCumulativeCostUsed = useMemo(() => {
|
|
367
371
|
if (!selectedProjectId)
|
|
368
372
|
return 0;
|
|
@@ -445,14 +449,15 @@ export function TaskBoardWorkspace() {
|
|
|
445
449
|
selectedProject?.permission === "Editor";
|
|
446
450
|
const canEditTasks = canCreate;
|
|
447
451
|
const viewTabs = useMemo(() => [
|
|
452
|
+
{ id: "overview", label: "Task overview", content: null },
|
|
448
453
|
{ id: "kanban", label: "Kanban", content: null },
|
|
449
454
|
{ id: "list", label: "List", content: null },
|
|
450
455
|
{ id: "graph", label: "Graph", content: null },
|
|
456
|
+
{ id: "kpis", label: "KPIs", content: null },
|
|
457
|
+
{ id: "settings", label: "Settings", content: null },
|
|
458
|
+
{ id: "properties", label: "Properties", content: null },
|
|
451
459
|
], []);
|
|
452
|
-
const
|
|
453
|
-
const isListView = viewTabIds[activeTab] === "list";
|
|
454
|
-
const isGraphView = viewTabIds[activeTab] === "graph";
|
|
455
|
-
const sharedViewSwitcher = useMemo(() => (_jsxs("div", { className: "flex items-center justify-end gap-2", children: [_jsx(SimpleTabs, { tabs: viewTabs, activeTab: activeTab, setActiveTab: setActiveTab, hideContent: true, className: "bg-neutral-grey-5/50 rounded-lg border-0 p-1", testId: "taskboard-view-switcher" }), _jsxs(Button, { size: "sm", onClick: () => setCreateDialogOpen(true), disabled: !canEditTasks, className: "h-8 px-3", "data-testid": "taskboard-create-task-button", children: [_jsx(Plus, { className: "h-4 w-4 sm:mr-1.5" }), _jsx("span", { className: "hidden sm:inline", children: "New Task" })] })] })), [activeTab, canEditTasks, viewTabs]);
|
|
460
|
+
const sharedViewSwitcher = useMemo(() => (_jsx("div", { className: "border-border-default mt-[18px] border-b", children: _jsx(SimpleTabs, { tabs: viewTabs, activeTab: activeTab, setActiveTab: setActiveTab, hideContent: true, variant: "large", className: "gap-8", tabClassName: "px-2 pt-3 pb-[9px] text-sm", testId: "taskboard-view-switcher" }) })), [activeTab, viewTabs]);
|
|
456
461
|
const handleSelectProject = useCallback((projectId) => {
|
|
457
462
|
setSelectedProjectId((previousProjectId) => {
|
|
458
463
|
if (previousProjectId !== projectId) {
|
|
@@ -595,10 +600,10 @@ export function TaskBoardWorkspace() {
|
|
|
595
600
|
}
|
|
596
601
|
}, []);
|
|
597
602
|
useEffect(() => {
|
|
598
|
-
if (!
|
|
603
|
+
if (!isOverviewView) {
|
|
599
604
|
clearWizardCloseTransitionTimeout();
|
|
600
605
|
}
|
|
601
|
-
}, [
|
|
606
|
+
}, [isOverviewView, clearWizardCloseTransitionTimeout]);
|
|
602
607
|
useEffect(() => {
|
|
603
608
|
clearWizardCloseTransitionTimeout();
|
|
604
609
|
}, [selectedProjectId, clearWizardCloseTransitionTimeout]);
|
|
@@ -674,7 +679,7 @@ export function TaskBoardWorkspace() {
|
|
|
674
679
|
if (typeof window === "undefined")
|
|
675
680
|
return;
|
|
676
681
|
const current = new URLSearchParams(window.location.search);
|
|
677
|
-
const view =
|
|
682
|
+
const view = TASKBOARD_VIEW_TAB_IDS[activeTab] ?? "kanban";
|
|
678
683
|
if (selectedProjectId) {
|
|
679
684
|
current.set(TASKBOARD_PROJECT_QUERY_KEY, selectedProjectId);
|
|
680
685
|
}
|
|
@@ -688,12 +693,7 @@ export function TaskBoardWorkspace() {
|
|
|
688
693
|
current.delete(TASKBOARD_TASK_QUERY_KEY);
|
|
689
694
|
}
|
|
690
695
|
current.set(TASKBOARD_VIEW_QUERY_KEY, view);
|
|
691
|
-
|
|
692
|
-
current.set(TASKBOARD_WIZARD_QUERY_KEY, "true");
|
|
693
|
-
}
|
|
694
|
-
else {
|
|
695
|
-
current.delete(TASKBOARD_WIZARD_QUERY_KEY);
|
|
696
|
-
}
|
|
696
|
+
current.delete("tbWizard");
|
|
697
697
|
const browserPathname = window.location.pathname;
|
|
698
698
|
const queryString = current.toString();
|
|
699
699
|
const newUrl = queryString
|
|
@@ -703,7 +703,7 @@ export function TaskBoardWorkspace() {
|
|
|
703
703
|
if (newUrl !== oldUrl) {
|
|
704
704
|
window.history.replaceState(null, "", newUrl);
|
|
705
705
|
}
|
|
706
|
-
}, [selectedProjectId, selectedTaskId, activeTab
|
|
706
|
+
}, [selectedProjectId, selectedTaskId, activeTab]);
|
|
707
707
|
useEffect(() => {
|
|
708
708
|
const handlePopState = () => {
|
|
709
709
|
syncTaskBoardStateFromUrl();
|
|
@@ -807,13 +807,13 @@ export function TaskBoardWorkspace() {
|
|
|
807
807
|
nextExecutionByProjectId[projectId] = executionByTaskId;
|
|
808
808
|
}
|
|
809
809
|
setSubprojectTaskCounts(nextCounts);
|
|
810
|
-
setSubprojectTasksByProjectId(
|
|
811
|
-
setSubprojectExecutionRecordsByProjectId(
|
|
810
|
+
setSubprojectTasksByProjectId(isOverviewView ? nextTasksByProjectId : {});
|
|
811
|
+
setSubprojectExecutionRecordsByProjectId(isOverviewView ? nextExecutionByProjectId : {});
|
|
812
812
|
}
|
|
813
813
|
finally {
|
|
814
814
|
setSubprojectCountsLoading(false);
|
|
815
815
|
}
|
|
816
|
-
}, [directSubprojects,
|
|
816
|
+
}, [directSubprojects, isOverviewView, selectedProjectId]);
|
|
817
817
|
// If a project only has a single task, auto-select it once when loading.
|
|
818
818
|
// Do not auto-reselect after the user explicitly closes task details.
|
|
819
819
|
useEffect(() => {
|
|
@@ -843,7 +843,7 @@ export function TaskBoardWorkspace() {
|
|
|
843
843
|
// switch away when another subproject also gets Questions (wizardAttentionState
|
|
844
844
|
// would pick a different task and we'd lose the questionnaire to agent mismatch).
|
|
845
845
|
useEffect(() => {
|
|
846
|
-
if (!
|
|
846
|
+
if (!isOverviewView)
|
|
847
847
|
return;
|
|
848
848
|
if (wizardForceOverview)
|
|
849
849
|
return;
|
|
@@ -860,7 +860,7 @@ export function TaskBoardWorkspace() {
|
|
|
860
860
|
return;
|
|
861
861
|
setWizardPinnedTask(wizardDisplayedTask.taskId, "system");
|
|
862
862
|
}, [
|
|
863
|
-
|
|
863
|
+
isOverviewView,
|
|
864
864
|
wizardForceOverview,
|
|
865
865
|
selectedTaskId,
|
|
866
866
|
wizardPinnedTaskId,
|
|
@@ -869,7 +869,7 @@ export function TaskBoardWorkspace() {
|
|
|
869
869
|
setWizardPinnedTask,
|
|
870
870
|
]);
|
|
871
871
|
useEffect(() => {
|
|
872
|
-
if (!
|
|
872
|
+
if (!isOverviewView)
|
|
873
873
|
return;
|
|
874
874
|
if (selectedTaskId)
|
|
875
875
|
return;
|
|
@@ -890,7 +890,7 @@ export function TaskBoardWorkspace() {
|
|
|
890
890
|
}
|
|
891
891
|
setWizardPinnedTaskId(attentionTaskId);
|
|
892
892
|
}, [
|
|
893
|
-
|
|
893
|
+
isOverviewView,
|
|
894
894
|
selectedTaskId,
|
|
895
895
|
selectedTaskSource,
|
|
896
896
|
wizardDisplayedExecutionDisplay?.label,
|
|
@@ -901,7 +901,7 @@ export function TaskBoardWorkspace() {
|
|
|
901
901
|
wizardAttentionState.task?.taskId,
|
|
902
902
|
]);
|
|
903
903
|
useEffect(() => {
|
|
904
|
-
if (!
|
|
904
|
+
if (!isOverviewView)
|
|
905
905
|
return;
|
|
906
906
|
if (selectedTaskSource === "user")
|
|
907
907
|
return;
|
|
@@ -923,23 +923,23 @@ export function TaskBoardWorkspace() {
|
|
|
923
923
|
setTaskSelection(null, { pinInWizard: false });
|
|
924
924
|
}, [
|
|
925
925
|
findNextAttentionTaskId,
|
|
926
|
-
|
|
926
|
+
isOverviewView,
|
|
927
927
|
selectedTask,
|
|
928
928
|
selectedTaskSource,
|
|
929
929
|
setTaskSelection,
|
|
930
930
|
]);
|
|
931
931
|
useEffect(() => {
|
|
932
|
-
if (
|
|
932
|
+
if (isOverviewView)
|
|
933
933
|
return;
|
|
934
934
|
if (!wizardPinnedTaskId)
|
|
935
935
|
return;
|
|
936
936
|
setWizardPinnedTask(null);
|
|
937
|
-
}, [
|
|
937
|
+
}, [isOverviewView, setWizardPinnedTask, wizardPinnedTaskId]);
|
|
938
938
|
useEffect(() => {
|
|
939
|
-
if (!
|
|
939
|
+
if (!isOverviewView && wizardForceOverview) {
|
|
940
940
|
setWizardForceOverview(false);
|
|
941
941
|
}
|
|
942
|
-
}, [
|
|
942
|
+
}, [isOverviewView, wizardForceOverview]);
|
|
943
943
|
useEffect(() => {
|
|
944
944
|
setWizardPinnedTask(null);
|
|
945
945
|
setWizardForceOverview(false);
|
|
@@ -1297,32 +1297,6 @@ export function TaskBoardWorkspace() {
|
|
|
1297
1297
|
setTaskSelection,
|
|
1298
1298
|
tasks,
|
|
1299
1299
|
]);
|
|
1300
|
-
const handleProjectStatusChange = useCallback(async (status) => {
|
|
1301
|
-
if (!selectedProject)
|
|
1302
|
-
return;
|
|
1303
|
-
if (selectedProject.permission !== "Owner")
|
|
1304
|
-
return;
|
|
1305
|
-
if (selectedProject.project.status === status)
|
|
1306
|
-
return;
|
|
1307
|
-
setSavingProjectStatus(true);
|
|
1308
|
-
try {
|
|
1309
|
-
const result = await updateProject({
|
|
1310
|
-
projectId: selectedProject.project.projectId,
|
|
1311
|
-
title: selectedProject.project.title,
|
|
1312
|
-
description: selectedProject.project.description ?? "",
|
|
1313
|
-
costLimit: selectedProject.project.costLimit ?? null,
|
|
1314
|
-
status,
|
|
1315
|
-
});
|
|
1316
|
-
if (result.type !== "success") {
|
|
1317
|
-
toast.error(result.summary || "Failed to update project status");
|
|
1318
|
-
return;
|
|
1319
|
-
}
|
|
1320
|
-
await refreshProjects();
|
|
1321
|
-
}
|
|
1322
|
-
finally {
|
|
1323
|
-
setSavingProjectStatus(false);
|
|
1324
|
-
}
|
|
1325
|
-
}, [selectedProject, refreshProjects]);
|
|
1326
1300
|
const handleSelectMyTask = useCallback((task) => {
|
|
1327
1301
|
handleSelectProject(task.projectId);
|
|
1328
1302
|
setTaskSelection(task.taskId, { source: "user" });
|
|
@@ -1352,7 +1326,6 @@ export function TaskBoardWorkspace() {
|
|
|
1352
1326
|
: "Select a project to get started",
|
|
1353
1327
|
permissionLabel: selectedProject?.permission ?? "No project selected",
|
|
1354
1328
|
activeTab,
|
|
1355
|
-
isWizardMode,
|
|
1356
1329
|
isAdministrator,
|
|
1357
1330
|
showAllProjects: isAdministrator && showAllProjects,
|
|
1358
1331
|
isProjectsLoading,
|
|
@@ -1379,7 +1352,11 @@ export function TaskBoardWorkspace() {
|
|
|
1379
1352
|
onSetActiveTab: setActiveTab,
|
|
1380
1353
|
onCreateProject: () => setCreateProjectOpen(true),
|
|
1381
1354
|
onOpenProjectTemplates: handleOpenProjectTemplates,
|
|
1382
|
-
onOpenProjectSettings: (projectId) =>
|
|
1355
|
+
onOpenProjectSettings: (projectId) => {
|
|
1356
|
+
handleSelectProject(projectId);
|
|
1357
|
+
setWizardForceOverview(false);
|
|
1358
|
+
setActiveTab(getTaskBoardViewTabIndex("settings"));
|
|
1359
|
+
},
|
|
1383
1360
|
onDeleteProject: (projectId, title) => {
|
|
1384
1361
|
const runDelete = async () => {
|
|
1385
1362
|
const result = await deleteProject(projectId);
|
|
@@ -1443,7 +1420,6 @@ export function TaskBoardWorkspace() {
|
|
|
1443
1420
|
setShowAllProjects(enabled);
|
|
1444
1421
|
void refreshProjects({ includeAll: isAdministrator && enabled });
|
|
1445
1422
|
},
|
|
1446
|
-
onToggleWizardMode: (enabled) => setIsWizardMode(enabled),
|
|
1447
1423
|
onCreateTask: () => setCreateDialogOpen(true),
|
|
1448
1424
|
onRunOrchestrator: handleRunOrchestrator,
|
|
1449
1425
|
});
|
|
@@ -1452,7 +1428,6 @@ export function TaskBoardWorkspace() {
|
|
|
1452
1428
|
selectedProject?.project.description,
|
|
1453
1429
|
selectedProject?.permission,
|
|
1454
1430
|
activeTab,
|
|
1455
|
-
isWizardMode,
|
|
1456
1431
|
isAdministrator,
|
|
1457
1432
|
showAllProjects,
|
|
1458
1433
|
isProjectsLoading,
|
|
@@ -1735,7 +1710,6 @@ export function TaskBoardWorkspace() {
|
|
|
1735
1710
|
setTaskSelection(null);
|
|
1736
1711
|
}
|
|
1737
1712
|
}, [
|
|
1738
|
-
isWizardMode,
|
|
1739
1713
|
selectedTaskId,
|
|
1740
1714
|
selectedTaskSource,
|
|
1741
1715
|
setTaskSelection,
|
|
@@ -1814,28 +1788,40 @@ export function TaskBoardWorkspace() {
|
|
|
1814
1788
|
return (_jsx("div", { className: "border-border-default bg-neutral-grey-5/70 flex h-full min-h-[240px] items-center justify-center rounded-lg border border-dashed", "data-testid": "taskboard-project-loading-state", children: _jsxs("div", { className: "text-muted-foreground flex flex-col items-center gap-3 text-sm", children: [_jsx(Loader2, { className: "h-6 w-6 animate-spin" }), _jsx("div", { children: "Loading project..." })] }) }));
|
|
1815
1789
|
}
|
|
1816
1790
|
if (!selectedProjectId || (!selectedProject && !isProjectsLoading)) {
|
|
1817
|
-
return
|
|
1791
|
+
return _jsx(TaskBoardHomeView, { nav: nav });
|
|
1818
1792
|
}
|
|
1819
|
-
if (
|
|
1820
|
-
return (_jsx(WizardView, { projectId: selectedProjectId, tasks: tasksWithDisplayAssignees, projectTasksLoading: isTasksLoading, dependencies: dependencies, subprojectTaskLists: wizardSubprojectTaskLists, subprojectTasksLoading: subprojectCountsLoading, selectedTaskId: wizardDisplayedTask?.taskId ?? null, onSelectTask: (id) => {
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1793
|
+
if (isOverviewView) {
|
|
1794
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description, selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts, parentProjectId: parentProject?.project.projectId ?? null, parentProjectTitle: parentProject?.project.title ?? null, onSelectProject: handleSelectProject, canCreateTask: canEditTasks, onCreateTask: () => setCreateDialogOpen(true) }), sharedViewSwitcher, _jsx("div", { className: "min-h-0 flex-1", children: _jsx(WizardView, { projectId: selectedProjectId, tasks: tasksWithDisplayAssignees, projectTasksLoading: isTasksLoading, dependencies: dependencies, subprojectTaskLists: wizardSubprojectTaskLists, subprojectTasksLoading: subprojectCountsLoading, selectedTaskId: wizardDisplayedTask?.taskId ?? null, onSelectTask: (id) => {
|
|
1795
|
+
setWizardForceOverview(false);
|
|
1796
|
+
setTaskSelection(id, { source: "user", pinInWizard: true });
|
|
1797
|
+
}, projectTitle: selectedProject?.project.title ?? "No project selected", projectDescription: selectedProject?.project.description, projectCostUsed: selectedProjectCumulativeCostUsed, projectCostLimit: selectedProject?.project.costLimit ?? null, canEditProperties: selectedProject?.permission === "Owner", showProperties: false, showCost: false, communicationPanel: wizardCommunicationPanel }) })] }));
|
|
1798
|
+
}
|
|
1799
|
+
if (isSettingsView) {
|
|
1800
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description, selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts, parentProjectId: parentProject?.project.projectId ?? null, parentProjectTitle: parentProject?.project.title ?? null, onSelectProject: handleSelectProject, canCreateTask: canEditTasks, onCreateTask: () => setCreateDialogOpen(true), showCreateTaskButton: false }), sharedViewSwitcher, _jsx(ProjectSettingsPanel, { projectId: selectedProjectId, selectedProject: selectedProject, projects: projects, canOpenSourceTemplate: isAdministrator, onOpenSourceTemplate: handleOpenSourceTemplate, onChanged: async () => {
|
|
1801
|
+
await refreshProjects();
|
|
1802
|
+
await refreshVisibleTaskData();
|
|
1803
|
+
} })] }));
|
|
1804
|
+
}
|
|
1805
|
+
if (isKpisView) {
|
|
1806
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description, selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts, parentProjectId: parentProject?.project.projectId ?? null, parentProjectTitle: parentProject?.project.title ?? null, onSelectProject: handleSelectProject, canCreateTask: canEditTasks, onCreateTask: () => setCreateDialogOpen(true), showCreateTaskButton: false }), sharedViewSwitcher, _jsx(ProjectKpisPanel, { selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, selectedProjectAttention: selectedProject?.overview?.attention, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts })] }));
|
|
1807
|
+
}
|
|
1808
|
+
if (isPropertiesView) {
|
|
1809
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description, selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts, parentProjectId: parentProject?.project.projectId ?? null, parentProjectTitle: parentProject?.project.title ?? null, onSelectProject: handleSelectProject, canCreateTask: canEditTasks, onCreateTask: () => setCreateDialogOpen(true), showCreateTaskButton: false }), sharedViewSwitcher, _jsx(ProjectPropertiesPanel, { projectId: selectedProjectId, canEdit: selectedProject?.permission === "Owner", defaultExpanded: true, showHeader: false, className: "border-border-default rounded-md border bg-white p-4" })] }));
|
|
1824
1810
|
}
|
|
1825
1811
|
if (isListView) {
|
|
1826
|
-
return (_jsxs("div", { className: "grid gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description,
|
|
1812
|
+
return (_jsxs("div", { className: "grid gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description, selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts, parentProjectId: parentProject?.project.projectId ?? null, parentProjectTitle: parentProject?.project.title ?? null, onSelectProject: handleSelectProject, canCreateTask: canEditTasks, onCreateTask: () => setCreateDialogOpen(true) }), sharedViewSwitcher, _jsx(ListView, { tasks: tasksWithDisplayAssignees, onSelectTask: (id) => setTaskSelection(id, { source: "user" }), selectedTaskId: selectedTaskId, onTasksChanged: () => {
|
|
1827
1813
|
void refreshVisibleTaskData();
|
|
1828
1814
|
}, projectId: selectedProjectId, permission: selectedProject?.permission })] }));
|
|
1829
1815
|
}
|
|
1830
1816
|
if (isGraphView) {
|
|
1831
|
-
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description,
|
|
1817
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description, selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts, parentProjectId: parentProject?.project.projectId ?? null, parentProjectTitle: parentProject?.project.title ?? null, onSelectProject: handleSelectProject, canCreateTask: canEditTasks, onCreateTask: () => setCreateDialogOpen(true) }), sharedViewSwitcher, _jsx("div", { className: "min-h-0 flex-1", children: _jsx(Suspense, { fallback: _jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center text-sm", children: "Loading dependency graph..." }), children: _jsx(DependencyGraphView, { projectId: selectedProjectId, tasks: tasksWithDisplayAssignees, dependencies: dependencies, miniMapWidth: 160, miniMapHeight: 120, orientation: "horizontal", autoLayoutStrategy: "hierarchy", showOrientationToggle: true, savedLayout: graphLayout, selectedTaskId: selectedTaskId, onSelectTask: (id) => setTaskSelection(id, { source: "user" }), permission: selectedProject?.permission, onLayoutSaved: (layout) => setGraphLayout(layout && selectedProjectId
|
|
1832
1818
|
? {
|
|
1833
1819
|
projectId: selectedProjectId,
|
|
1834
1820
|
...layout,
|
|
1835
1821
|
}
|
|
1836
1822
|
: null) }) }) })] }));
|
|
1837
1823
|
}
|
|
1838
|
-
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description,
|
|
1824
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 min-w-0 flex-col gap-3", children: [_jsx(ProjectDashboard, { projectId: selectedProjectId, selectedProjectTitle: selectedProject?.project.title ?? "No project selected", selectedProjectDescription: selectedProject?.project.description, selectedProjectCostUsed: selectedProjectCumulativeCostUsed, selectedProjectCostLimit: selectedProject?.project.costLimit ?? null, selectedProjectTaskCounts: selectedProjectTaskCounts, subprojects: directSubprojects, taskCountsByProjectId: subprojectTaskCounts, parentProjectId: parentProject?.project.projectId ?? null, parentProjectTitle: parentProject?.project.title ?? null, onSelectProject: handleSelectProject, canCreateTask: canEditTasks, onCreateTask: () => setCreateDialogOpen(true) }), sharedViewSwitcher, _jsx(KanbanView, { tasks: tasksWithDisplayAssignees, dependencies: dependencies, onSelectTask: (id) => setTaskSelection(id, { source: "user" }), selectedTaskId: selectedTaskId, onTasksChanged: () => {
|
|
1839
1825
|
void refreshVisibleTaskData();
|
|
1840
1826
|
}, projectId: selectedProjectId, permission: selectedProject?.permission })] }));
|
|
1841
1827
|
}, [
|
|
@@ -1843,12 +1829,15 @@ export function TaskBoardWorkspace() {
|
|
|
1843
1829
|
selectedProjectId,
|
|
1844
1830
|
selectedProject,
|
|
1845
1831
|
isProjectsLoading,
|
|
1846
|
-
|
|
1832
|
+
isOverviewView,
|
|
1847
1833
|
isListView,
|
|
1848
1834
|
isGraphView,
|
|
1835
|
+
isKpisView,
|
|
1836
|
+
isSettingsView,
|
|
1837
|
+
isPropertiesView,
|
|
1838
|
+
graphLayout,
|
|
1839
|
+
isAdministrator,
|
|
1849
1840
|
selectedProjectCumulativeCostUsed,
|
|
1850
|
-
savingProjectStatus,
|
|
1851
|
-
handleProjectStatusChange,
|
|
1852
1841
|
handleOpenSourceTemplate,
|
|
1853
1842
|
selectedProjectTaskCounts,
|
|
1854
1843
|
directSubprojects,
|
|
@@ -1858,19 +1847,18 @@ export function TaskBoardWorkspace() {
|
|
|
1858
1847
|
parentProject?.project.title,
|
|
1859
1848
|
handleSelectProject,
|
|
1860
1849
|
sharedViewSwitcher,
|
|
1850
|
+
projects,
|
|
1861
1851
|
tasksWithDisplayAssignees,
|
|
1862
1852
|
dependencies,
|
|
1863
1853
|
selectedTaskId,
|
|
1864
|
-
activeTab,
|
|
1865
1854
|
canEditTasks,
|
|
1866
1855
|
nav,
|
|
1867
|
-
homeActiveTab,
|
|
1868
|
-
userFirstName,
|
|
1869
1856
|
isTasksLoading,
|
|
1870
1857
|
wizardSubprojectTaskLists,
|
|
1871
1858
|
wizardDisplayedTask?.taskId,
|
|
1872
1859
|
wizardCommunicationPanel,
|
|
1873
1860
|
setTaskSelection,
|
|
1861
|
+
refreshProjects,
|
|
1874
1862
|
refreshVisibleTaskData,
|
|
1875
1863
|
]);
|
|
1876
1864
|
const taskDetailAgentLaunch = useMemo(() => {
|
|
@@ -1913,6 +1901,7 @@ export function TaskBoardWorkspace() {
|
|
|
1913
1901
|
void refreshVisibleTaskData();
|
|
1914
1902
|
}, onSelectTask: (taskId) => setTaskSelection(taskId, { source: "user" }), onClose: () => setTaskSelection(null), variant: "panel", agentLaunch: taskDetailAgentLaunch })), [
|
|
1915
1903
|
selectedTaskProject,
|
|
1904
|
+
projects,
|
|
1916
1905
|
selectedTask,
|
|
1917
1906
|
taskSelectionUniverse,
|
|
1918
1907
|
dependencies,
|
|
@@ -2035,29 +2024,29 @@ export function TaskBoardWorkspace() {
|
|
|
2035
2024
|
const showAgentColumnForSelectedTask = !!selectedProjectId &&
|
|
2036
2025
|
!shouldHideAgentPanelForSelectedTask &&
|
|
2037
2026
|
agentPanelMode === "agent";
|
|
2038
|
-
if (
|
|
2039
|
-
const
|
|
2027
|
+
if (isOverviewView || isKpisView) {
|
|
2028
|
+
const overviewPanels = [
|
|
2040
2029
|
{
|
|
2041
|
-
name: "
|
|
2042
|
-
defaultSize:
|
|
2043
|
-
content: (_jsx("div", { className: "bg-neutral-grey-5/
|
|
2030
|
+
name: "task-list",
|
|
2031
|
+
defaultSize: "auto",
|
|
2032
|
+
content: (_jsx("div", { className: cn("bg-neutral-grey-5/60 flex h-full min-h-0 flex-col overflow-x-hidden overflow-y-auto", selectedProjectId && "p-3 pt-3 md:p-8 md:pt-8 md:pl-10"), children: taskBoardContent })),
|
|
2044
2033
|
},
|
|
2045
2034
|
];
|
|
2046
2035
|
if (showEditorPanel) {
|
|
2047
|
-
|
|
2036
|
+
overviewPanels.push({
|
|
2048
2037
|
name: "editor-preview",
|
|
2049
|
-
defaultSize:
|
|
2038
|
+
defaultSize: 500,
|
|
2050
2039
|
content: (_jsx("div", { className: "border-border-default bg-neutral-grey-5 h-full overflow-hidden border-l", children: itemPreviewPanel })),
|
|
2051
2040
|
});
|
|
2052
2041
|
}
|
|
2053
|
-
return
|
|
2042
|
+
return overviewPanels;
|
|
2054
2043
|
}
|
|
2055
2044
|
if (isListView) {
|
|
2056
2045
|
const listPanels = [
|
|
2057
2046
|
{
|
|
2058
2047
|
name: "task-list",
|
|
2059
2048
|
defaultSize: "auto",
|
|
2060
|
-
content: (_jsx("div", { className: "bg-neutral-grey-5/
|
|
2049
|
+
content: (_jsx("div", { className: "bg-neutral-grey-5/60 h-full overflow-x-auto overflow-y-auto p-3 pt-3 md:p-8 md:pt-8 md:pl-10", children: taskBoardContent })),
|
|
2061
2050
|
},
|
|
2062
2051
|
...buildRightHandPanels(showAgentColumnForSelectedTask),
|
|
2063
2052
|
];
|
|
@@ -2075,7 +2064,7 @@ export function TaskBoardWorkspace() {
|
|
|
2075
2064
|
{
|
|
2076
2065
|
name: "task-list",
|
|
2077
2066
|
defaultSize: "auto",
|
|
2078
|
-
content: (_jsx("div", { className: cn("bg-neutral-grey-5/
|
|
2067
|
+
content: (_jsx("div", { className: cn("bg-neutral-grey-5/60 flex h-full min-h-0 flex-col overflow-x-hidden overflow-y-auto", selectedProjectId && "p-3 pt-3 md:p-8 md:pt-8 md:pl-10"), children: taskBoardContent })),
|
|
2079
2068
|
},
|
|
2080
2069
|
...buildRightHandPanels(showAgentColumnForSelectedTask),
|
|
2081
2070
|
];
|
|
@@ -2092,7 +2081,7 @@ export function TaskBoardWorkspace() {
|
|
|
2092
2081
|
{
|
|
2093
2082
|
name: "task-list",
|
|
2094
2083
|
defaultSize: "auto",
|
|
2095
|
-
content: (_jsx("div", { className: cn("bg-neutral-grey-5/
|
|
2084
|
+
content: (_jsx("div", { className: cn("bg-neutral-grey-5/60 flex h-full min-h-0 flex-col overflow-x-hidden overflow-y-auto", selectedProjectId && "p-3 pt-3 md:p-8 md:pt-8 md:pl-10"), children: taskBoardContent })),
|
|
2096
2085
|
},
|
|
2097
2086
|
...buildRightHandPanels(showAgentColumnForSelectedTask),
|
|
2098
2087
|
];
|
|
@@ -2105,7 +2094,8 @@ export function TaskBoardWorkspace() {
|
|
|
2105
2094
|
}
|
|
2106
2095
|
return kanbanPanels;
|
|
2107
2096
|
}, [
|
|
2108
|
-
|
|
2097
|
+
isOverviewView,
|
|
2098
|
+
isKpisView,
|
|
2109
2099
|
isListView,
|
|
2110
2100
|
isGraphView,
|
|
2111
2101
|
selectedProjectId,
|
|
@@ -2133,30 +2123,20 @@ export function TaskBoardWorkspace() {
|
|
|
2133
2123
|
...(showEditorPanel
|
|
2134
2124
|
? [{ id: "editor", label: "Editor", content: null }]
|
|
2135
2125
|
: []),
|
|
2136
|
-
], activeTab: mobileActiveTab, setActiveTab: setMobileActiveTab, hideContent: true, className: "gap-6" }) })), _jsxs("div", { className: "min-h-0 flex-1 overflow-hidden", children: [mobileActiveTab === 0 && (_jsx("div", { className: cn("bg-neutral-grey-5/50 flex h-full overflow-y-auto", selectedProjectId &&
|
|
2137
|
-
!isWizardMode &&
|
|
2138
|
-
"p-2 pt-2 md:p-4 md:pt-3"), children: taskBoardContent })), mobileActiveTab === 1 && (_jsx("div", { className: "h-full overflow-y-auto bg-white", children: taskDetailPanel })), mobileActiveTab === 2 && (_jsx("div", { className: "h-full overflow-hidden bg-white", children: shouldHideAgentPanelForSelectedTask
|
|
2126
|
+
], activeTab: mobileActiveTab, setActiveTab: setMobileActiveTab, hideContent: true, className: "gap-6" }) })), _jsxs("div", { className: "min-h-0 flex-1 overflow-hidden", children: [mobileActiveTab === 0 && (_jsx("div", { className: cn("bg-neutral-grey-5/50 flex h-full overflow-y-auto", selectedProjectId && "p-2 pt-2 md:p-4 md:pt-3"), children: taskBoardContent })), mobileActiveTab === 1 && (_jsx("div", { className: "h-full overflow-y-auto bg-white", children: taskDetailPanel })), mobileActiveTab === 2 && (_jsx("div", { className: "h-full overflow-hidden bg-white", children: shouldHideAgentPanelForSelectedTask
|
|
2139
2127
|
? taskDetailPanel
|
|
2140
|
-
: agentTerminalPanel })), mobileActiveTab === 3 && showEditorPanel && (_jsx("div", { className: "bg-neutral-grey-5 h-full overflow-hidden", children: itemPreviewPanel }))] })] })) : (_jsx(Splitter, { panels: panels, direction: "horizontal", localStorageKey:
|
|
2141
|
-
? "task-board-wizard-splitter-v2"
|
|
2142
|
-
: "task-board-main-splitter" })) }), selectedProjectId && (_jsx(CreateTaskDialog, { open: createDialogOpen, onOpenChange: setCreateDialogOpen, projectId: selectedProjectId, availableParentTasks: tasks, onCreated: () => {
|
|
2128
|
+
: agentTerminalPanel })), mobileActiveTab === 3 && showEditorPanel && (_jsx("div", { className: "bg-neutral-grey-5 h-full overflow-hidden", children: itemPreviewPanel }))] })] })) : (_jsx(Splitter, { panels: panels, direction: "horizontal", localStorageKey: "task-board-main-splitter" })) }), selectedProjectId && (_jsx(CreateTaskDialog, { open: createDialogOpen, onOpenChange: setCreateDialogOpen, projectId: selectedProjectId, availableParentTasks: tasks, onCreated: () => {
|
|
2143
2129
|
void refreshTasks(selectedProjectId);
|
|
2144
2130
|
void refreshExecutionState(selectedProjectId);
|
|
2145
2131
|
void refreshDependencies(selectedProjectId);
|
|
2146
2132
|
} })), _jsx(CreateProjectDialog, { open: createProjectOpen, onOpenChange: setCreateProjectOpen, projects: projects, onCreated: async ({ projectId: newProjectId, openInWizardMode }) => {
|
|
2147
2133
|
if (openInWizardMode) {
|
|
2148
|
-
|
|
2134
|
+
setActiveTab(getTaskBoardViewTabIndex("overview"));
|
|
2149
2135
|
setWizardForceOverview(false);
|
|
2150
2136
|
}
|
|
2151
2137
|
if (newProjectId)
|
|
2152
2138
|
handleSelectProject(newProjectId);
|
|
2153
2139
|
await refreshProjects();
|
|
2154
|
-
} }), _jsx(ProjectSettingsDialog, { open: !!settingsProjectId, onOpenChange: (open) => {
|
|
2155
|
-
if (!open)
|
|
2156
|
-
setSettingsProjectId(null);
|
|
2157
|
-
}, projectId: settingsProjectId, selectedProject: settingsProject, projects: projects, onChanged: async () => {
|
|
2158
|
-
await refreshProjects();
|
|
2159
|
-
await refreshVisibleTaskData();
|
|
2160
2140
|
} })] }));
|
|
2161
2141
|
}
|
|
2162
2142
|
//# sourceMappingURL=TaskBoardWorkspace.js.map
|