Skip to content

Commit dca1b95

Browse files
Merge pull request #560 from microsoft/psl-bug-23829
fix: Code change to load newly created task on left side panel (fix for bug 23829).
2 parents 6e93105 + 3d56281 commit dca1b95

File tree

5 files changed

+53
-21
lines changed

5 files changed

+53
-21
lines changed

src/frontend/src/components/common/PlanCancellationDialog.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
DialogBody,
99
DialogActions,
1010
Button,
11+
DialogOpenChangeEvent,
12+
DialogOpenChangeData
1113
} from '@fluentui/react-components';
1214
import { Warning20Regular } from '@fluentui/react-icons';
1315
import "../../styles/Panel.css";
@@ -29,7 +31,7 @@ const PlanCancellationDialog: React.FC<PlanCancellationDialogProps> = ({
2931
loading = false
3032
}) => {
3133
return (
32-
<Dialog open={isOpen} onOpenChange={(_, data) => !data.open && onCancel()}>
34+
<Dialog open={isOpen} onOpenChange={(_: DialogOpenChangeEvent, data: DialogOpenChangeData) => !data.open && onCancel()}>
3335
<DialogSurface>
3436
<DialogBody>
3537
<DialogTitle>

src/frontend/src/components/common/TeamSelector.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ import {
1919
RadioGroup,
2020
Tab,
2121
TabList,
22-
Tooltip
22+
Tooltip,
23+
DialogOpenChangeEvent,
24+
DialogOpenChangeData,
25+
TabValue,
26+
SelectTabEvent,
27+
SelectTabData,
28+
InputOnChangeData
2329
} from '@fluentui/react-components';
2430
import {
2531
ChevronUpDown16Regular,
@@ -474,15 +480,15 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
474480
size="small"
475481
disabled={true}
476482
className={`${styles.moreButton} ${styles.moreButtonDisabled || ''}`}
477-
onClick={(e) => e.stopPropagation()}
483+
onClick={(e: React.MouseEvent) => e.stopPropagation()}
478484
/>
479485
</Tooltip>
480486
) : (
481487
<Button
482488
icon={<MoreHorizontal20Regular />}
483489
appearance="subtle"
484490
size="small"
485-
onClick={(e) => handleDeleteTeam(team, e)}
491+
onClick={(e: React.MouseEvent) => handleDeleteTeam(team, e)}
486492
className={styles.moreButton}
487493
/>
488494
)}
@@ -492,7 +498,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
492498

493499
return (
494500
<>
495-
<Dialog open={isOpen} onOpenChange={(event, data) => handleOpenChange(data.open)}>
501+
<Dialog open={isOpen} onOpenChange={(event: DialogOpenChangeEvent, data: DialogOpenChangeData) => handleOpenChange(data.open)}>
496502
<DialogTrigger disableButtonEnhancement>
497503
<Button
498504
appearance="subtle"
@@ -527,7 +533,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
527533
<TabList
528534
className={styles.tabList}
529535
selectedValue={activeTab}
530-
onTabSelect={(event, data) => setActiveTab(data.value as string)}
536+
onTabSelect={(event: SelectTabEvent, data: SelectTabData) => setActiveTab(data.value as string)}
531537
>
532538
<Tab
533539
value="teams"
@@ -559,7 +565,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
559565
className={styles.searchInput}
560566
placeholder="Search teams..."
561567
value={searchQuery}
562-
onChange={(e, data) => {
568+
onChange={(e: React.ChangeEvent<HTMLInputElement>, data: InputOnChangeData) => {
563569
console.log('Search changed:', data.value);
564570
setSearchQuery(data.value || '');
565571
}}
@@ -716,7 +722,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
716722
</DialogSurface>
717723
</Dialog>
718724

719-
<Dialog open={deleteConfirmOpen} onOpenChange={(event, data) => setDeleteConfirmOpen(data.open)}>
725+
<Dialog open={deleteConfirmOpen} onOpenChange={(event: DialogOpenChangeEvent, data: DialogOpenChangeData) => setDeleteConfirmOpen(data.open)}>
720726
<DialogSurface className={styles.deleteDialogSurface}>
721727
<DialogContent className={styles.deleteDialogContent}>
722728
<DialogBody className={styles.deleteDialogBody}>

src/frontend/src/components/content/PlanPanelLeft.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,27 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
6060
console.log("Loading plans, forceRefresh:", forceRefresh);
6161
setPlansLoading(true);
6262
setPlansError(null);
63-
const plansData = await apiService.getPlans(undefined, forceRefresh);
63+
const plansData = await apiService.getPlans(undefined, !forceRefresh); // Invert forceRefresh for useCache
6464
setPlans(plansData);
65+
66+
// Reset the reload flag after successful load
67+
if (forceRefresh && restReload) {
68+
restReload();
69+
}
6570
} catch (error) {
6671
console.log("Failed to load plans:", error);
6772
setPlansError(
6873
error instanceof Error ? error : new Error("Failed to load plans")
6974
);
75+
76+
// Reset the reload flag even on error to prevent infinite loops
77+
if (forceRefresh && restReload) {
78+
restReload();
79+
}
7080
} finally {
7181
setPlansLoading(false);
7282
}
73-
}, []);
83+
}, [restReload]);
7484

7585

7686
// Fetch plans
@@ -85,7 +95,7 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
8595
useEffect(() => {
8696
console.log("Reload tasks changed:", reloadTasks);
8797
if (reloadTasks) {
88-
loadPlansData();
98+
loadPlansData(true); // Force refresh when reloadTasks is true
8999
}
90100
}, [loadPlansData, setUserInfo, reloadTasks]);
91101
useEffect(() => {

src/frontend/src/coral/components/PromptCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ const PromptCard: React.FC<PromptCardProps> = ({
3737
transition: "background-color 0.2s ease-in-out",
3838
}}
3939
// 🧠 Only apply hover if not disabled
40-
onMouseOver={(e) => {
40+
onMouseOver={(e: React.MouseEvent<HTMLDivElement>) => {
4141
if (!disabled) {
4242
e.currentTarget.style.backgroundColor =
4343
"var(--colorNeutralBackground3Hover)";
4444
e.currentTarget.style.border = "1px solid var(--colorNeutralStroke1)"; // subtle shadow on hover
4545
}
4646
}}
47-
onMouseOut={(e) => {
47+
onMouseOut={(e: React.MouseEvent<HTMLDivElement>) => {
4848
if (!disabled) {
4949
e.currentTarget.style.backgroundColor =
5050
"var(--colorNeutralBackground3)";

src/frontend/src/pages/PlanPage.tsx

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,36 @@ const PlanPage: React.FC = () => {
132132
// Persist / forward to backend (fire-and-forget with logging)
133133
const agentMessageResponse = PlanDataService.createAgentMessageResponse(agentMessageData, planData, is_final, streaming_message);
134134
console.log('📤 Persisting agent message:', agentMessageResponse);
135-
void apiService.sendAgentMessage(agentMessageResponse)
135+
const sendPromise = apiService.sendAgentMessage(agentMessageResponse)
136136
.then(saved => {
137137
console.log('[agent_message][persisted]', {
138138
agent: agentMessageData.agent,
139139
type: agentMessageData.agent_type,
140140
ts: agentMessageData.timestamp
141141
});
142+
143+
// If this is a final message, refresh the task list after successful persistence
144+
if (is_final) {
145+
// Single refresh with a delay to ensure backend processing is complete
146+
setTimeout(() => {
147+
setReloadLeftList(true);
148+
}, 1000);
149+
}
142150
})
143151
.catch(err => {
144152
console.warn('[agent_message][persist-failed]', err);
153+
// Even if persistence fails, still refresh the task list for final messages
154+
// The local plan data has been updated, so the UI should reflect that
155+
if (is_final) {
156+
setTimeout(() => {
157+
setReloadLeftList(true);
158+
}, 1000);
159+
}
145160
});
146161

147-
}, []);
162+
return sendPromise;
163+
164+
}, [setReloadLeftList]);
148165

149166
const resetPlanVariables = useCallback(() => {
150167
setInput("");
@@ -335,20 +352,17 @@ const PlanPage: React.FC = () => {
335352
setPlanData({ ...planData });
336353
}
337354

355+
// Wait for the agent message to be processed and persisted
356+
// The processAgentMessage function will handle refreshing the task list
338357
processAgentMessage(agentMessageData, planData, is_final, streamingMessageBuffer);
339358

340-
setTimeout(() => {
341-
console.log('✅ Plan completed, refreshing left list');
342-
setReloadLeftList(true);
343-
}, 1000);
344-
345359
}
346360

347361

348362
});
349363

350364
return () => unsubscribe();
351-
}, [scrollToBottom, planData, processAgentMessage, streamingMessageBuffer, setSelectedTeam, setReloadLeftList]);
365+
}, [scrollToBottom, planData, processAgentMessage, streamingMessageBuffer, setSelectedTeam]);
352366

353367
//WebsocketMessageType.AGENT_MESSAGE
354368
useEffect(() => {

0 commit comments

Comments
 (0)