diff --git a/src-tauri/yaak-models/guest-js/store.ts b/src-tauri/yaak-models/guest-js/store.ts index b027d181..eb703027 100644 --- a/src-tauri/yaak-models/guest-js/store.ts +++ b/src-tauri/yaak-models/guest-js/store.ts @@ -83,6 +83,17 @@ export function getModel>( model: M, id: string, diff --git a/src-web/components/Sidebar.tsx b/src-web/components/Sidebar.tsx index e2392334..ceb03976 100644 --- a/src-web/components/Sidebar.tsx +++ b/src-web/components/Sidebar.tsx @@ -10,16 +10,6 @@ import type { WebsocketRequest, Workspace, } from '@yaakapp-internal/models'; -import { - duplicateModel, - foldersAtom, - getModel, - grpcConnectionsAtom, - httpResponsesAtom, - patchModel, - websocketConnectionsAtom, - workspacesAtom, -} from '@yaakapp-internal/models'; import classNames from 'classnames'; import { atom, useAtomValue } from 'jotai'; import { selectAtom } from 'jotai/utils'; @@ -37,6 +27,7 @@ import { getGrpcRequestActions } from '../hooks/useGrpcRequestActions'; import { useHotKey } from '../hooks/useHotKey'; import { getHttpRequestActions } from '../hooks/useHttpRequestActions'; import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent'; +import { getModelAncestors } from '../hooks/useModelAncestors'; import { sendAnyHttpRequest } from '../hooks/useSendAnyHttpRequest'; import { useSidebarHidden } from '../hooks/useSidebarHidden'; import { deepEqualAtom } from '../lib/atoms'; @@ -65,6 +56,17 @@ import type { TreeHandle, TreeProps } from './core/tree/Tree'; import { Tree } from './core/tree/Tree'; import type { TreeItemProps } from './core/tree/TreeItem'; import { GitDropdown } from './GitDropdown'; +import { + getAnyModel, + duplicateModel, + foldersAtom, + getModel, + grpcConnectionsAtom, + httpResponsesAtom, + patchModel, + websocketConnectionsAtom, + workspacesAtom, +} from '@yaakapp-internal/models'; type SidebarModel = Workspace | Folder | HttpRequest | GrpcRequest | WebsocketRequest; function isSidebarLeafModel(m: AnyModel): boolean { @@ -486,6 +488,29 @@ function Sidebar({ className }: { className?: string }) { /> , + onSelect: () => { + const activeId = jotaiStore.get(activeIdAtom); + if (activeId == null) return; + + const folders = jotaiStore.get(foldersAtom); + const workspaces = jotaiStore.get(workspacesAtom); + const currentModel = getAnyModel(activeId); + const ancestors = getModelAncestors(folders, workspaces, currentModel); + jotaiStore.set(collapsedFamily(treeId), (prev) => { + const n = { ...prev }; + for (const ancestor of ancestors) { + if (ancestor.model === 'folder') { + delete n[ancestor.id]; + } + } + return n; + }); + treeRef.current?.selectItem(activeId, true); + }, + }, { label: 'Expand All Folders', leftSlot: , diff --git a/src-web/components/core/Icon.tsx b/src-web/components/core/Icon.tsx index 0d85798c..ae7852d3 100644 --- a/src-web/components/core/Icon.tsx +++ b/src-web/components/core/Icon.tsx @@ -43,6 +43,7 @@ import { CopyIcon, CornerRightUpIcon, CreditCardIcon, + CrosshairIcon, DotIcon, DownloadIcon, EllipsisIcon, @@ -169,6 +170,7 @@ const icons = { copy_check: CopyCheck, corner_right_up: CornerRightUpIcon, credit_card: CreditCardIcon, + crosshair: CrosshairIcon, dot: DotIcon, download: DownloadIcon, ellipsis: EllipsisIcon, diff --git a/src-web/hooks/useModelAncestors.ts b/src-web/hooks/useModelAncestors.ts index 3ef83d37..956eea36 100644 --- a/src-web/hooks/useModelAncestors.ts +++ b/src-web/hooks/useModelAncestors.ts @@ -9,10 +9,10 @@ export function useModelAncestors(m: AnyModel | null) { const folders = useAtomValue(foldersAtom); const workspaces = useAtomValue(workspacesAtom); - return useMemo(() => getParents(folders, workspaces, m), [folders, workspaces, m]); + return useMemo(() => getModelAncestors(folders, workspaces, m), [folders, workspaces, m]); } -function getParents( +export function getModelAncestors( folders: Folder[], workspaces: Workspace[], currentModel: AnyModel | null, @@ -25,7 +25,7 @@ function getParents( : null; if (parentFolder != null) { - return [parentFolder, ...getParents(folders, workspaces, parentFolder)]; + return [parentFolder, ...getModelAncestors(folders, workspaces, parentFolder)]; } const parentWorkspace = @@ -34,7 +34,7 @@ function getParents( : null; if (parentWorkspace != null) { - return [parentWorkspace, ...getParents(folders, workspaces, parentWorkspace)]; + return [parentWorkspace, ...getModelAncestors(folders, workspaces, parentWorkspace)]; } return [];