Skip to content

Commit c4b1eca

Browse files
committed
fix: allow export task history while API is active (#5324)
- Add exportAlwaysEnabled prop to TaskActions component - Export button remains enabled when exportAlwaysEnabled is true - Other action buttons still respect buttonsDisabled state - Add tests to verify the new behavior This fixes the regression where users couldn't export task history during API operations, which is a common debugging workflow.
1 parent b2dadf9 commit c4b1eca

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ import { ShareButton } from "./ShareButton"
1414
interface TaskActionsProps {
1515
item?: HistoryItem
1616
buttonsDisabled: boolean
17+
exportAlwaysEnabled?: boolean
1718
}
1819

19-
export const TaskActions = ({ item, buttonsDisabled }: TaskActionsProps) => {
20+
export const TaskActions = ({ item, buttonsDisabled, exportAlwaysEnabled = false }: TaskActionsProps) => {
2021
const [deleteTaskId, setDeleteTaskId] = useState<string | null>(null)
2122
const { t } = useTranslation()
2223
const { copyWithFeedback, showCopyFeedback } = useCopyToClipboard()
@@ -27,7 +28,7 @@ export const TaskActions = ({ item, buttonsDisabled }: TaskActionsProps) => {
2728
<IconButton
2829
iconClass="codicon-desktop-download"
2930
title={t("chat:task.export")}
30-
disabled={buttonsDisabled}
31+
disabled={exportAlwaysEnabled ? false : buttonsDisabled}
3132
onClick={() => vscode.postMessage({ type: "exportCurrentTask" })}
3233
/>
3334
{item?.task && (

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,13 @@ const TaskHeader = ({
185185
</span>
186186
)}
187187
</div>
188-
{!totalCost && <TaskActions item={currentTaskItem} buttonsDisabled={buttonsDisabled} />}
188+
{!totalCost && (
189+
<TaskActions
190+
item={currentTaskItem}
191+
buttonsDisabled={buttonsDisabled}
192+
exportAlwaysEnabled={true}
193+
/>
194+
)}
189195
</div>
190196

191197
{((typeof cacheReads === "number" && cacheReads > 0) ||
@@ -213,7 +219,11 @@ const TaskHeader = ({
213219
<span className="font-bold">{t("chat:task.apiCost")}</span>
214220
<span>${totalCost?.toFixed(2)}</span>
215221
</div>
216-
<TaskActions item={currentTaskItem} buttonsDisabled={buttonsDisabled} />
222+
<TaskActions
223+
item={currentTaskItem}
224+
buttonsDisabled={buttonsDisabled}
225+
exportAlwaysEnabled={true}
226+
/>
217227
</div>
218228
)}
219229
</div>

webview-ui/src/components/chat/__tests__/TaskActions.spec.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,5 +382,26 @@ describe("TaskActions", () => {
382382
expect(shareButton).toBeDisabled()
383383
expect(exportButton).toBeDisabled()
384384
})
385+
386+
it("keeps export button enabled when exportAlwaysEnabled is true", () => {
387+
render(<TaskActions item={mockItem} buttonsDisabled={true} exportAlwaysEnabled={true} />)
388+
389+
// Find button by its icon class
390+
const buttons = screen.getAllByRole("button")
391+
const shareButton = buttons.find((btn) => btn.querySelector(".codicon-link"))
392+
const exportButton = screen.getByLabelText("Export task history")
393+
394+
// Share button should still be disabled
395+
expect(shareButton).toBeDisabled()
396+
// Export button should be enabled despite buttonsDisabled being true
397+
expect(exportButton).not.toBeDisabled()
398+
})
399+
400+
it("export button works normally when exportAlwaysEnabled is false", () => {
401+
render(<TaskActions item={mockItem} buttonsDisabled={true} exportAlwaysEnabled={false} />)
402+
403+
const exportButton = screen.getByLabelText("Export task history")
404+
expect(exportButton).toBeDisabled()
405+
})
385406
})
386407
})

0 commit comments

Comments
 (0)