From ae2f7d9570e26b937ed195637441a8c0da3a704e Mon Sep 17 00:00:00 2001 From: iliya Date: Sat, 28 Feb 2026 21:47:44 +0200 Subject: [PATCH] feat: enhance GlobalTaskDetailDialog and TaskDetailDialog with loading state management - Added a loading state to the TaskDetailDialog to display a loading indicator while fetching team data. - Updated GlobalTaskDetailDialog to pass the loading state to TaskDetailDialog. - Modified the selectTeam function in teamSlice to accept options for skipping project auto-selection, improving team data handling. --- .../team/dialogs/GlobalTaskDetailDialog.tsx | 3 ++- .../team/dialogs/TaskDetailDialog.tsx | 18 ++++++++++++++++++ src/renderer/store/slices/teamSlice.ts | 10 +++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx b/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx index 7a3f6201..fefd89d2 100644 --- a/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +++ b/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx @@ -69,7 +69,8 @@ export const GlobalTaskDetailDialog = (): React.JSX.Element | null => { return ( !v && onClose()}> + + + Loading task… + +
+ + Fetching team data +
+
+ + ); + } + if (!currentTask) { return ( !v && handleClose()}> diff --git a/src/renderer/store/slices/teamSlice.ts b/src/renderer/store/slices/teamSlice.ts index 3a402151..e4c649ec 100644 --- a/src/renderer/store/slices/teamSlice.ts +++ b/src/renderer/store/slices/teamSlice.ts @@ -126,7 +126,7 @@ export interface TeamSlice { openTeamsTab: () => void; openTeamTab: (teamName: string, projectPath?: string, taskId?: string) => void; clearKanbanFilter: () => void; - selectTeam: (teamName: string) => Promise; + selectTeam: (teamName: string, opts?: { skipProjectAutoSelect?: boolean }) => Promise; refreshTeamData: (teamName: string) => Promise; sendTeamMessage: (teamName: string, request: SendMessageRequest) => Promise; requestReview: (teamName: string, taskId: string) => Promise; @@ -207,7 +207,7 @@ export const createTeamSlice: StateCreator = (set, // Ensure team data is loaded for the dialog const state = get(); if (state.selectedTeamName !== teamName || !state.selectedTeamData) { - void state.selectTeam(teamName); + void state.selectTeam(teamName, { skipProjectAutoSelect: true }); } }, closeGlobalTaskDetail: () => set({ globalTaskDetail: null }), @@ -358,7 +358,7 @@ export const createTeamSlice: StateCreator = (set, set({ kanbanFilterQuery: null }); }, - selectTeam: async (teamName: string) => { + selectTeam: async (teamName: string, opts) => { // Clear stale data immediately to prevent flash of previous team's content const prev = get().selectedTeamName; set({ @@ -407,6 +407,10 @@ export const createTeamSlice: StateCreator = (set, get().updateTabLabel(teamTab.id, displayName); } + if (opts?.skipProjectAutoSelect) { + return; + } + // Auto-select the project associated with this team's cwd/projectPath. // Must search both flat projects and grouped repositoryGroups/worktrees // because the default viewMode is 'grouped' and flat projects may be empty.