diff options
| author | Adam <[email protected]> | 2026-02-05 13:51:08 -0600 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-05 13:51:08 -0600 |
| commit | 83646e0366c47a3bccb5135d40628176a6776f33 (patch) | |
| tree | cd8525d1a684a659e31a4413301577fac3f8fb63 /packages/app/src/components | |
| parent | c40ce47e92befbe4cb27735e4d870f540e75b646 (diff) | |
| download | opencode-83646e0366c47a3bccb5135d40628176a6776f33.tar.gz opencode-83646e0366c47a3bccb5135d40628176a6776f33.zip | |
fix(app): allow toggling file tree closed independently (#12293)
Diffstat (limited to 'packages/app/src/components')
4 files changed, 45 insertions, 8 deletions
diff --git a/packages/app/src/components/dialog-select-file.tsx b/packages/app/src/components/dialog-select-file.tsx index 167f21195..36448dd3e 100644 --- a/packages/app/src/components/dialog-select-file.tsx +++ b/packages/app/src/components/dialog-select-file.tsx @@ -47,6 +47,7 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil const filesOnly = () => props.mode === "files" const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`) const tabs = createMemo(() => layout.tabs(sessionKey)) + const view = createMemo(() => layout.view(sessionKey)) const state = { cleanup: undefined as (() => void) | void, committed: false } const [grouped, setGrouped] = createSignal(false) const common = [ @@ -282,6 +283,7 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil const value = file.tab(path) tabs().open(value) file.load(path) + if (!view().reviewPanel.opened()) view().reviewPanel.open() layout.fileTree.open() layout.fileTree.setTab("all") props.onOpenFile?.(path) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index b897e394a..f40b61bca 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -172,6 +172,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => { const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`) const tabs = createMemo(() => layout.tabs(sessionKey)) + const view = createMemo(() => layout.view(sessionKey)) const commentInReview = (path: string) => { const sessionID = params.id @@ -190,12 +191,14 @@ export const PromptInput: Component<PromptInputProps> = (props) => { const wantsReview = item.commentOrigin === "review" || (item.commentOrigin !== "file" && commentInReview(item.path)) if (wantsReview) { + if (!view().reviewPanel.opened()) view().reviewPanel.open() layout.fileTree.open() layout.fileTree.setTab("changes") requestAnimationFrame(() => comments.setFocus(focus)) return } + if (!view().reviewPanel.opened()) view().reviewPanel.open() layout.fileTree.open() layout.fileTree.setTab("all") const tab = files.tab(item.path) diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx index c5de54cf0..c6256395f 100644 --- a/packages/app/src/components/session-context-usage.tsx +++ b/packages/app/src/components/session-context-usage.tsx @@ -23,6 +23,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) { const variant = createMemo(() => props.variant ?? "button") const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`) const tabs = createMemo(() => layout.tabs(sessionKey)) + const view = createMemo(() => layout.view(sessionKey)) const messages = createMemo(() => (params.id ? (sync.data.message[params.id] ?? []) : [])) const usd = createMemo( @@ -57,6 +58,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) { const openContext = () => { if (!params.id) return + if (!view().reviewPanel.opened()) view().reviewPanel.open() layout.fileTree.open() layout.fileTree.setTab("all") tabs().open("context") diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx index 5b00f80c0..f2bfc8d25 100644 --- a/packages/app/src/components/session/session-header.tsx +++ b/packages/app/src/components/session/session-header.tsx @@ -283,27 +283,57 @@ export function SessionHeader() { <TooltipKeybind title={language.t("command.review.toggle")} keybind={command.keybind("review.toggle")}> <Button variant="ghost" - class="group/file-tree-toggle size-6 p-0" - onClick={() => layout.fileTree.toggle()} + class="group/review-toggle size-6 p-0" + onClick={() => view().reviewPanel.toggle()} aria-label={language.t("command.review.toggle")} - aria-expanded={layout.fileTree.opened()} + aria-expanded={view().reviewPanel.opened()} aria-controls="review-panel" > <div class="relative flex items-center justify-center size-4 [&>*]:absolute [&>*]:inset-0"> <Icon size="small" - name={layout.fileTree.opened() ? "layout-right-full" : "layout-right"} - class="group-hover/file-tree-toggle:hidden" + name={view().reviewPanel.opened() ? "layout-right-full" : "layout-right"} + class="group-hover/review-toggle:hidden" /> <Icon size="small" name="layout-right-partial" - class="hidden group-hover/file-tree-toggle:inline-block" + class="hidden group-hover/review-toggle:inline-block" + /> + <Icon + size="small" + name={view().reviewPanel.opened() ? "layout-right" : "layout-right-full"} + class="hidden group-active/review-toggle:inline-block" /> + </div> + </Button> + </TooltipKeybind> + </div> + <div class="hidden md:block shrink-0"> + <TooltipKeybind + title={language.t("command.fileTree.toggle")} + keybind={command.keybind("fileTree.toggle")} + > + <Button + variant="ghost" + class="group/file-tree-toggle size-6 p-0" + onClick={() => { + const opening = !layout.fileTree.opened() + if (opening && !view().reviewPanel.opened()) view().reviewPanel.open() + layout.fileTree.toggle() + }} + aria-label={language.t("command.fileTree.toggle")} + aria-expanded={layout.fileTree.opened()} + aria-controls="file-tree-panel" + > + <div class="relative flex items-center justify-center size-4"> <Icon size="small" - name={layout.fileTree.opened() ? "layout-right" : "layout-right-full"} - class="hidden group-active/file-tree-toggle:inline-block" + name="bullet-list" + classList={{ + "text-icon-strong": layout.fileTree.opened(), + "text-icon-weak": !layout.fileTree.opened(), + }} /> </div> </Button> |
