Skip to content

Commit e092e77

Browse files
Fix: Correct TODO list display order in chat view (ROO-107) (#9991)
Co-authored-by: Roo Code <[email protected]>
1 parent ab18bf3 commit e092e77

File tree

1 file changed

+31
-76
lines changed

1 file changed

+31
-76
lines changed

webview-ui/src/components/chat/TodoChangeDisplay.tsx

Lines changed: 31 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,6 @@ interface TodoChangeDisplayProps {
1414
newTodos: TodoItem[]
1515
}
1616

17-
interface TodoGroup {
18-
todos: TodoItem[]
19-
status: TodoStatus | null
20-
keyPrefix: string
21-
className?: string
22-
}
23-
2417
function getTodoIcon(status: TodoStatus | null) {
2518
switch (status) {
2619
case "completed":
@@ -32,83 +25,32 @@ function getTodoIcon(status: TodoStatus | null) {
3225
}
3326
}
3427

35-
function TodoList({ todos, status, keyPrefix, className }: TodoGroup) {
36-
if (todos.length === 0) return null
37-
38-
return (
39-
<ul className="list-none space-y-1 my-1">
40-
{todos.map((todo) => {
41-
const icon = getTodoIcon(status)
42-
return (
43-
<li
44-
key={`${keyPrefix}-${todo.id || todo.content}`}
45-
className={`flex flex-row gap-2 items-start ${className || ""}`}>
46-
{icon}
47-
<span>{todo.content}</span>
48-
</li>
49-
)
50-
})}
51-
</ul>
52-
)
53-
}
54-
5528
export function TodoChangeDisplay({ previousTodos, newTodos }: TodoChangeDisplayProps) {
5629
const isInitialState = previousTodos.length === 0
5730

5831
// Determine which todos to display
59-
let todoGroups: TodoGroup[]
32+
let todosToDisplay: TodoItem[]
6033

6134
if (isInitialState && newTodos.length > 0) {
62-
// For initial state, show all todos grouped by status
63-
todoGroups = [
64-
{
65-
todos: newTodos.filter((todo) => !todo.status || todo.status === "pending"),
66-
status: null,
67-
keyPrefix: "pending",
68-
},
69-
{
70-
todos: newTodos.filter((todo) => todo.status === "in_progress"),
71-
status: "in_progress",
72-
keyPrefix: "in-progress",
73-
className: "text-vscode-charts-yellow",
74-
},
75-
{
76-
todos: newTodos.filter((todo) => todo.status === "completed"),
77-
status: "completed",
78-
keyPrefix: "completed",
79-
},
80-
]
35+
// For initial state, show all todos in their original order
36+
todosToDisplay = newTodos
8137
} else {
82-
// For updates, only show changes
83-
const completedTodos = newTodos.filter((newTodo) => {
84-
if (newTodo.status !== "completed") return false
85-
const previousTodo = previousTodos.find((p) => p.id === newTodo.id || p.content === newTodo.content)
86-
return !previousTodo || previousTodo.status !== "completed"
38+
// For updates, only show changes (completed or started) in their original order
39+
todosToDisplay = newTodos.filter((newTodo) => {
40+
if (newTodo.status === "completed") {
41+
const previousTodo = previousTodos.find((p) => p.id === newTodo.id || p.content === newTodo.content)
42+
return !previousTodo || previousTodo.status !== "completed"
43+
}
44+
if (newTodo.status === "in_progress") {
45+
const previousTodo = previousTodos.find((p) => p.id === newTodo.id || p.content === newTodo.content)
46+
return !previousTodo || previousTodo.status !== "in_progress"
47+
}
48+
return false
8749
})
88-
89-
const startedTodos = newTodos.filter((newTodo) => {
90-
if (newTodo.status !== "in_progress") return false
91-
const previousTodo = previousTodos.find((p) => p.id === newTodo.id || p.content === newTodo.content)
92-
return !previousTodo || previousTodo.status !== "in_progress"
93-
})
94-
95-
todoGroups = [
96-
{
97-
todos: completedTodos,
98-
status: "completed",
99-
keyPrefix: "completed",
100-
},
101-
{
102-
todos: startedTodos,
103-
status: "in_progress",
104-
keyPrefix: "started",
105-
className: "text-vscode-charts-yellow",
106-
},
107-
]
10850
}
10951

11052
// If no todos to display, don't render anything
111-
if (todoGroups.every((group) => group.todos.length === 0)) {
53+
if (todosToDisplay.length === 0) {
11254
return null
11355
}
11456

@@ -122,9 +64,22 @@ export function TodoChangeDisplay({ previousTodos, newTodos }: TodoChangeDisplay
12264
</div>
12365

12466
<div className="pl-1 pr-1 pt-1 font-light leading-normal">
125-
{todoGroups.map((group, index) => (
126-
<TodoList key={index} {...group} />
127-
))}
67+
<ul className="list-none space-y-1 my-1">
68+
{todosToDisplay.map((todo) => {
69+
const status = (todo.status || "pending") as TodoStatus
70+
const icon = getTodoIcon(status)
71+
return (
72+
<li
73+
key={todo.id || todo.content}
74+
className={`flex flex-row gap-2 items-start ${
75+
status === "in_progress" ? "text-vscode-charts-yellow" : ""
76+
}`}>
77+
{icon}
78+
<span>{todo.content}</span>
79+
</li>
80+
)
81+
})}
82+
</ul>
12883
</div>
12984
</div>
13085
)

0 commit comments

Comments
 (0)