Skip to content

Commit 2c79c57

Browse files
team's upload and team's id passed
1 parent b9509b0 commit 2c79c57

File tree

9 files changed

+227
-35
lines changed

9 files changed

+227
-35
lines changed

src/frontend/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function App() {
88
<Router>
99
<Routes>
1010
<Route path="/" element={<HomePage />} />
11-
<Route path="/plan/:planId/create" element={<PlanCreatePage />} />
11+
<Route path="/plan/:planId/create/:teamId?" element={<PlanCreatePage />} />
1212
<Route path="/plan/:planId" element={<PlanPage />} />
1313
<Route path="*" element={<Navigate to="/" replace />} />
1414
</Routes>

src/frontend/src/components/common/SettingsButton.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ import { TeamService } from '../../services/TeamService';
2828

2929
interface SettingsButtonProps {
3030
onTeamSelect?: (team: TeamConfig) => void;
31+
onTeamUpload?: () => Promise<void>;
3132
selectedTeam?: TeamConfig | null;
3233
}
3334

3435
const SettingsButton: React.FC<SettingsButtonProps> = ({
3536
onTeamSelect,
37+
onTeamUpload,
3638
selectedTeam,
3739
}) => {
3840
const [isOpen, setIsOpen] = useState(false);
@@ -46,10 +48,14 @@ const SettingsButton: React.FC<SettingsButtonProps> = ({
4648
setLoading(true);
4749
setError(null);
4850
try {
51+
console.log('SettingsButton: Loading teams...');
4952
// Get all teams from the API (no separation between default and user teams)
5053
const teamsData = await TeamService.getUserTeams();
54+
console.log('SettingsButton: Teams loaded:', teamsData);
55+
console.log('SettingsButton: Number of teams:', teamsData.length);
5156
setTeams(teamsData);
5257
} catch (err: any) {
58+
console.error('SettingsButton: Error loading teams:', err);
5359
setError(err.message || 'Failed to load teams');
5460
} finally {
5561
setLoading(false);
@@ -86,18 +92,29 @@ const SettingsButton: React.FC<SettingsButtonProps> = ({
8692
const file = event.target.files?.[0];
8793
if (!file) return;
8894

95+
console.log('SettingsButton: Starting file upload for:', file.name);
8996
setUploadLoading(true);
9097
setError(null);
9198

9299
try {
93100
const result = await TeamService.uploadCustomTeam(file);
101+
console.log('SettingsButton: Upload result:', result);
94102
if (result.success) {
103+
console.log('SettingsButton: Upload successful, reloading teams...');
95104
// Reload teams to include the new custom team
96105
await loadTeams();
106+
console.log('SettingsButton: Teams reloaded after upload');
107+
// Notify parent component about the upload
108+
if (onTeamUpload) {
109+
console.log('SettingsButton: Notifying parent about upload...');
110+
await onTeamUpload();
111+
}
97112
} else {
113+
console.error('SettingsButton: Upload failed:', result.error);
98114
setError(result.error || 'Failed to upload team configuration');
99115
}
100116
} catch (err: any) {
117+
console.error('SettingsButton: Upload exception:', err);
101118
setError(err.message || 'Failed to upload team configuration');
102119
} finally {
103120
setUploadLoading(false);

src/frontend/src/components/content/HomeInput.tsx

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,13 @@ const HomeInput: React.FC<HomeInputProps> = ({
7373
if (response.plan_id && response.plan_id !== null) {
7474
showToast("Plan created!", "success");
7575
dismissToast(id);
76-
navigate(`/plan/${response.plan_id}/create`);
76+
77+
// Navigate with team ID if a team is selected
78+
const navPath = selectedTeam
79+
? `/plan/${response.plan_id}/create/${selectedTeam.team_id}`
80+
: `/plan/${response.plan_id}/create`;
81+
console.log('HomeInput: Navigating to:', navPath, 'with team:', selectedTeam?.name);
82+
navigate(navPath);
7783
} else {
7884
showToast("Failed to create plan", "error");
7985
dismissToast(id);
@@ -133,33 +139,33 @@ const HomeInput: React.FC<HomeInputProps> = ({
133139

134140
// Convert team starting_tasks to QuickTask format or use default
135141
const tasksToDisplay: QuickTask[] = selectedTeam ?
136-
selectedTeam.starting_tasks.map((task, index) => ({
137-
id: `team-task-${index}`,
138-
title: task,
139-
description: task,
140-
icon: quickTasks[index % quickTasks.length]?.icon || quickTasks[0].icon
141-
})) : quickTasks;
142+
selectedTeam.starting_tasks.map((task, index) => {
143+
// Handle both string tasks and StartingTask objects
144+
if (typeof task === 'string') {
145+
return {
146+
id: `team-task-${index}`,
147+
title: task,
148+
description: task,
149+
icon: quickTasks[index % quickTasks.length]?.icon || quickTasks[0].icon
150+
};
151+
} else {
152+
// Handle StartingTask objects
153+
const startingTask = task as any; // Type assertion for now
154+
return {
155+
id: startingTask.id || `team-task-${index}`,
156+
title: startingTask.name || startingTask.prompt || 'Task',
157+
description: startingTask.prompt || startingTask.name || 'Task description',
158+
icon: startingTask.logo || quickTasks[index % quickTasks.length]?.icon || quickTasks[0].icon
159+
};
160+
}
161+
}) : quickTasks;
142162

143163
return (
144164
<div className="home-input-container">
145165
<div className="home-input-content">
146166
<div className="home-input-center-content">
147167
<div className="home-input-title-wrapper">
148168
<Title2>How can I help?</Title2>
149-
{selectedTeam && (
150-
<div style={{
151-
display: 'flex',
152-
alignItems: 'center',
153-
gap: '8px',
154-
marginTop: '8px',
155-
justifyContent: 'center'
156-
}}>
157-
<span style={{ fontSize: '20px' }}>{selectedTeam.logo}</span>
158-
<Body1Strong style={{ color: '#666' }}>
159-
{selectedTeam.name}
160-
</Body1Strong>
161-
</div>
162-
)}
163169
</div>
164170

165171
{/* Show RAI error if present */}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
3535
reloadTasks,
3636
restReload,
3737
onTeamSelect,
38+
onTeamUpload,
3839
selectedTeam: parentSelectedTeam
3940
}) => {
4041
const { dispatchToast } = useToastController("toast");
@@ -155,6 +156,18 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
155156
<Tooltip content="New task" relationship={"label"} />
156157
</PanelLeftToolbar>
157158

159+
{/* Team Display Section */}
160+
{selectedTeam && (
161+
<div style={{
162+
padding: '8px 16px',
163+
textAlign: 'left'
164+
}}>
165+
<Body1Strong style={{ color: 'white', fontSize: '14px' }}>
166+
{selectedTeam.name}
167+
</Body1Strong>
168+
</div>
169+
)}
170+
158171
<br />
159172
<div
160173
className="tab tab-new-task"
@@ -188,6 +201,7 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
188201
{/* Settings Button on top */}
189202
<SettingsButton
190203
onTeamSelect={handleTeamSelect}
204+
onTeamUpload={onTeamUpload}
191205
selectedTeam={selectedTeam}
192206
/>
193207
{/* User Card below */}

src/frontend/src/models/Team.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ export interface Agent {
66
role?: string;
77
}
88

9+
export interface StartingTask {
10+
id: string;
11+
name: string;
12+
prompt: string;
13+
created: string;
14+
creator: string;
15+
logo: string;
16+
}
17+
918
export interface Team {
1019
id: string;
1120
name: string;
@@ -27,7 +36,7 @@ export interface TeamConfig {
2736
logo: string;
2837
plan: string;
2938
agents: Agent[];
30-
starting_tasks: string[];
39+
starting_tasks: (string | StartingTask)[];
3140
}
3241

3342
export interface TeamUploadResponse {

src/frontend/src/models/planPanelLeft.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ export interface PlanPanelLefProps {
55
onNewTaskButton: () => void;
66
restReload?: () => void;
77
onTeamSelect?: (team: TeamConfig) => void;
8+
onTeamUpload?: () => Promise<void>;
89
selectedTeam?: TeamConfig | null;
910
}

src/frontend/src/pages/HomePage.tsx

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import PlanPanelLeft from '@/components/content/PlanPanelLeft';
2424
import ContentToolbar from '@/coral/components/Content/ContentToolbar';
2525
import { TaskService } from '../services/TaskService';
2626
import { TeamConfig } from '../models/Team';
27+
import { TeamService } from '../services/TeamService';
2728

2829
/**
2930
* HomePage component - displays task lists and provides navigation
@@ -33,6 +34,39 @@ const HomePage: React.FC = () => {
3334
const navigate = useNavigate();
3435
const { dispatchToast } = useToastController("toast");
3536
const [selectedTeam, setSelectedTeam] = useState<TeamConfig | null>(null);
37+
const [isLoadingTeam, setIsLoadingTeam] = useState(true);
38+
39+
/**
40+
* Load teams and set default team on component mount
41+
*/
42+
useEffect(() => {
43+
const loadDefaultTeam = async () => {
44+
setIsLoadingTeam(true);
45+
try {
46+
const teams = await TeamService.getUserTeams();
47+
console.log('All teams loaded:', teams);
48+
if (teams.length > 0) {
49+
// Always prioritize "Business Operations Team" as default
50+
const businessOpsTeam = teams.find(team => team.name === "Business Operations Team");
51+
const defaultTeam = businessOpsTeam || teams[0];
52+
setSelectedTeam(defaultTeam);
53+
console.log('Default team loaded:', defaultTeam.name, 'with', defaultTeam.starting_tasks?.length || 0, 'starting tasks');
54+
console.log('Team logo:', defaultTeam.logo);
55+
console.log('Team description:', defaultTeam.description);
56+
console.log('Is Business Operations Team:', defaultTeam.name === "Business Operations Team");
57+
} else {
58+
console.log('No teams found - user needs to upload a team configuration');
59+
// Even if no teams are found, we clear the loading state to show the "no team" message
60+
}
61+
} catch (error) {
62+
console.error('Error loading default team:', error);
63+
} finally {
64+
setIsLoadingTeam(false);
65+
}
66+
};
67+
68+
loadDefaultTeam();
69+
}, []);
3670

3771
/**
3872
* Handle new task creation from the "New task" button
@@ -58,6 +92,38 @@ const HomePage: React.FC = () => {
5892
);
5993
}, [dispatchToast]);
6094

95+
/**
96+
* Handle team upload completion - refresh team list and keep Business Operations Team as default
97+
*/
98+
const handleTeamUpload = useCallback(async () => {
99+
try {
100+
const teams = await TeamService.getUserTeams();
101+
console.log('Teams refreshed after upload:', teams.length);
102+
103+
if (teams.length > 0) {
104+
// Always keep "Business Operations Team" as default, even after new uploads
105+
const businessOpsTeam = teams.find(team => team.name === "Business Operations Team");
106+
const defaultTeam = businessOpsTeam || teams[0];
107+
setSelectedTeam(defaultTeam);
108+
console.log('Default team after upload:', defaultTeam.name);
109+
console.log('Business Operations Team remains default');
110+
111+
// Show a toast notification about the upload success
112+
dispatchToast(
113+
<Toast>
114+
<ToastTitle>Team Uploaded Successfully!</ToastTitle>
115+
<ToastBody>
116+
Team uploaded. {defaultTeam.name} remains your default team.
117+
</ToastBody>
118+
</Toast>,
119+
{ intent: "success" }
120+
);
121+
}
122+
} catch (error) {
123+
console.error('Error refreshing teams after upload:', error);
124+
}
125+
}, [dispatchToast]);
126+
61127
/**
62128
* Handle new task creation from input submission
63129
* Creates a plan and navigates to the create plan page
@@ -78,7 +144,13 @@ const HomePage: React.FC = () => {
78144
</Toast>,
79145
{ intent: "success" }
80146
);
81-
navigate(`/plan/${response.plan_id}/create`);
147+
148+
// Navigate with team ID if a team is selected
149+
const navPath = selectedTeam
150+
? `/plan/${response.plan_id}/create/${selectedTeam.team_id}`
151+
: `/plan/${response.plan_id}/create`;
152+
console.log('Navigating to:', navPath, 'with team:', selectedTeam?.name);
153+
navigate(navPath);
82154
} else {
83155
dispatchToast(
84156
<Toast>
@@ -115,17 +187,29 @@ const HomePage: React.FC = () => {
115187
<PlanPanelLeft
116188
onNewTaskButton={handleNewTaskButton}
117189
onTeamSelect={handleTeamSelect}
190+
onTeamUpload={handleTeamUpload}
118191
selectedTeam={selectedTeam}
119192
/>
120193
<Content>
121194
<ContentToolbar
122195
panelTitle={"Multi-Agent Planner"}
123196
></ContentToolbar>
124-
<HomeInput
125-
onInputSubmit={handleNewTask}
126-
onQuickTaskSelect={handleNewTask}
127-
selectedTeam={selectedTeam}
128-
/>
197+
{!isLoadingTeam ? (
198+
<HomeInput
199+
onInputSubmit={handleNewTask}
200+
onQuickTaskSelect={handleNewTask}
201+
selectedTeam={selectedTeam}
202+
/>
203+
) : (
204+
<div style={{
205+
display: 'flex',
206+
justifyContent: 'center',
207+
alignItems: 'center',
208+
height: '200px'
209+
}}>
210+
<Spinner label="Loading team configuration..." />
211+
</div>
212+
)}
129213
</Content>
130214

131215
</CoralShellRow>

0 commit comments

Comments
 (0)