@@ -17,6 +17,7 @@ import { Task } from '@shared/types/task'
1717import { use_tasks } from './hooks/use-tasks'
1818import { use_sticky_mode } from './hooks/use-sticky-mode'
1919import { SettingsButton as UiSettingsButton } from '@ui/components/editor/panel/SettingsButton'
20+ import { InlineDropdown as UiInlineDropdown } from '@ui/components/editor/panel/InlineDropdown'
2021
2122type Props = {
2223 vscode : any
@@ -48,8 +49,12 @@ type Props = {
4849export const Home : React . FC < Props > = ( props ) => {
4950 const { t } = use_translation ( )
5051 const [ active_tab , set_active_tab ] = useState < 'tasks' | 'checkpoints' > ( 'tasks' )
52+ const [ active_workspace_root , set_active_workspace_root ] = useState < string > ( )
5153 const { is_mode_sticky, is_hiding, responses_ref, mode_ref, handle_scroll } = use_sticky_mode ( )
5254
55+ const roots = Object . keys ( props . tasks )
56+ const active_root = active_workspace_root && roots . includes ( active_workspace_root ) ? active_workspace_root : roots [ 0 ]
57+
5358 useEffect ( ( ) => {
5459 const handle_mouse_up = ( event : MouseEvent ) => {
5560 if ( props . is_active && event . button == 4 ) {
@@ -163,19 +168,32 @@ export const Home: React.FC<Props> = (props) => {
163168 on_tab_change = { ( id ) => set_active_tab ( id as 'tasks' | 'checkpoints' ) }
164169 actions = {
165170 active_tab == 'tasks' ? (
166- Object . keys ( props . tasks ) . length == 1 ? (
167- < UiIconButton
168- codicon_icon = "add"
169- title = { t ( 'home.tasks.add' ) }
170- on_click = { ( e ) => {
171- e . stopPropagation ( )
172- const roots = Object . keys ( props . tasks )
173- if ( roots . length > 0 ) {
174- handle_add ( roots [ 0 ] , props . tasks [ roots [ 0 ] ] , 'top' )
175- }
176- } }
177- />
178- ) : undefined
171+ < >
172+ { roots . length > 1 && (
173+ < div className = { styles [ 'inner__workspace-dropdown' ] } >
174+ < UiInlineDropdown
175+ options = { roots . map ( ( root ) => ( {
176+ value : root ,
177+ label : root . split ( / [ \\ / ] / ) . pop ( ) || root
178+ } ) ) }
179+ selected_value = { active_root ! }
180+ on_change = { ( val ) => set_active_workspace_root ( val ) }
181+ />
182+ </ div >
183+ ) }
184+ { roots . length > 0 && (
185+ < UiIconButton
186+ codicon_icon = "add"
187+ title = { t ( 'home.tasks.add' ) }
188+ on_click = { ( e ) => {
189+ e . stopPropagation ( )
190+ if ( active_root ) {
191+ handle_add ( active_root , props . tasks [ active_root ] , 'top' )
192+ }
193+ } }
194+ />
195+ ) }
196+ </ >
179197 ) : (
180198 < >
181199 { props . has_temp_checkpoint && (
@@ -213,70 +231,43 @@ export const Home: React.FC<Props> = (props) => {
213231
214232 { active_tab == 'tasks' && (
215233 < >
216- { Object . keys ( props . tasks ) . length == 1 &&
217- props . tasks [ Object . keys ( props . tasks ) [ 0 ] ] . length == 0 && (
218- < div className = { styles . inner__empty } >
219- { t ( 'home.tasks.empty' ) }
220- </ div >
221- ) }
222- { Object . entries ( props . tasks )
223- . filter ( ( [ _ , tasks ] , __ , arr ) =>
224- arr . length == 1 ? tasks . length > 0 : true
225- )
226- . map ( ( [ workspace_root_folder , tasks ] , _ , entries ) => (
227- < div
228- key = { workspace_root_folder }
229- className = { styles . inner__tasks }
230- >
231- { entries . length > 1 && (
232- < div className = { styles [ 'inner__tasks-header' ] } >
233- < span >
234- { workspace_root_folder . split ( / [ \\ / ] / ) . pop ( ) ||
235- workspace_root_folder }
236- </ span >
237- < button
238- className = { styles [ 'add-button' ] }
239- title = { t ( 'home.tasks.add' ) }
240- onClick = { ( ) => {
241- handle_add ( workspace_root_folder , tasks , 'top' )
242- } }
243- />
244- </ div >
245- ) }
246- { tasks . length > 0 && (
247- < UiTasks
248- tasks = { tasks }
249- on_reorder = { ( new_tasks ) =>
250- handle_reorder ( workspace_root_folder , new_tasks )
251- }
252- on_change = { ( updated_task ) => {
253- handle_change (
254- workspace_root_folder ,
255- tasks ,
256- updated_task
257- )
258- } }
259- on_add = { ( ) => {
260- handle_add ( workspace_root_folder , tasks )
261- } }
262- on_add_subtask = { ( parent_task ) => {
263- handle_add_subtask (
264- workspace_root_folder ,
265- tasks ,
266- parent_task
267- )
268- } }
269- on_delete = { ( timestamp ) => {
270- handle_delete ( workspace_root_folder , timestamp )
271- } }
272- on_forward = { ( text ) => {
273- props . on_task_forward ( text )
274- } }
275- placeholder = { t ( 'home.tasks.placeholder' ) }
276- />
277- ) }
278- </ div >
279- ) ) }
234+ { roots . length == 0 && (
235+ < div className = { styles . inner__empty } >
236+ { t ( 'home.tasks.empty' ) }
237+ </ div >
238+ ) }
239+ { active_root && (
240+ < div className = { styles . inner__tasks } >
241+ { props . tasks [ active_root ] . length == 0 ? (
242+ < div className = { styles . inner__empty } >
243+ { t ( 'home.tasks.empty' ) }
244+ </ div >
245+ ) : (
246+ < UiTasks
247+ tasks = { props . tasks [ active_root ] }
248+ on_reorder = { ( new_tasks ) =>
249+ handle_reorder ( active_root , new_tasks )
250+ }
251+ on_change = { ( updated_task ) => {
252+ handle_change ( active_root , props . tasks [ active_root ] , updated_task )
253+ } }
254+ on_add = { ( ) => {
255+ handle_add ( active_root , props . tasks [ active_root ] )
256+ } }
257+ on_add_subtask = { ( parent_task ) => {
258+ handle_add_subtask ( active_root , props . tasks [ active_root ] , parent_task )
259+ } }
260+ on_delete = { ( timestamp ) => {
261+ handle_delete ( active_root , timestamp )
262+ } }
263+ on_forward = { ( text ) => {
264+ props . on_task_forward ( text )
265+ } }
266+ placeholder = { t ( 'home.tasks.placeholder' ) }
267+ />
268+ ) }
269+ </ div >
270+ ) }
280271 </ >
281272 ) }
282273
0 commit comments