mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-21 08:11:24 +02:00
Add sidebar action to select the active request
This commit is contained in:
@@ -83,6 +83,17 @@ export function getModel<M extends AnyModel['model'], T extends ExtractModel<Any
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getAnyModel(
|
||||||
|
id: string,
|
||||||
|
): AnyModel | null {
|
||||||
|
let data = mustStore().get(modelStoreDataAtom);
|
||||||
|
for (const t of Object.keys(data)) {
|
||||||
|
let v = (data as any)[t]?.[id];
|
||||||
|
if (v?.model === t) return v;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
export function patchModelById<M extends AnyModel['model'], T extends ExtractModel<AnyModel, M>>(
|
export function patchModelById<M extends AnyModel['model'], T extends ExtractModel<AnyModel, M>>(
|
||||||
model: M,
|
model: M,
|
||||||
id: string,
|
id: string,
|
||||||
|
|||||||
@@ -10,16 +10,6 @@ import type {
|
|||||||
WebsocketRequest,
|
WebsocketRequest,
|
||||||
Workspace,
|
Workspace,
|
||||||
} from '@yaakapp-internal/models';
|
} from '@yaakapp-internal/models';
|
||||||
import {
|
|
||||||
duplicateModel,
|
|
||||||
foldersAtom,
|
|
||||||
getModel,
|
|
||||||
grpcConnectionsAtom,
|
|
||||||
httpResponsesAtom,
|
|
||||||
patchModel,
|
|
||||||
websocketConnectionsAtom,
|
|
||||||
workspacesAtom,
|
|
||||||
} from '@yaakapp-internal/models';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { atom, useAtomValue } from 'jotai';
|
import { atom, useAtomValue } from 'jotai';
|
||||||
import { selectAtom } from 'jotai/utils';
|
import { selectAtom } from 'jotai/utils';
|
||||||
@@ -37,6 +27,7 @@ import { getGrpcRequestActions } from '../hooks/useGrpcRequestActions';
|
|||||||
import { useHotKey } from '../hooks/useHotKey';
|
import { useHotKey } from '../hooks/useHotKey';
|
||||||
import { getHttpRequestActions } from '../hooks/useHttpRequestActions';
|
import { getHttpRequestActions } from '../hooks/useHttpRequestActions';
|
||||||
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
|
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
|
||||||
|
import { getModelAncestors } from '../hooks/useModelAncestors';
|
||||||
import { sendAnyHttpRequest } from '../hooks/useSendAnyHttpRequest';
|
import { sendAnyHttpRequest } from '../hooks/useSendAnyHttpRequest';
|
||||||
import { useSidebarHidden } from '../hooks/useSidebarHidden';
|
import { useSidebarHidden } from '../hooks/useSidebarHidden';
|
||||||
import { deepEqualAtom } from '../lib/atoms';
|
import { deepEqualAtom } from '../lib/atoms';
|
||||||
@@ -65,6 +56,17 @@ import type { TreeHandle, TreeProps } from './core/tree/Tree';
|
|||||||
import { Tree } from './core/tree/Tree';
|
import { Tree } from './core/tree/Tree';
|
||||||
import type { TreeItemProps } from './core/tree/TreeItem';
|
import type { TreeItemProps } from './core/tree/TreeItem';
|
||||||
import { GitDropdown } from './GitDropdown';
|
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;
|
type SidebarModel = Workspace | Folder | HttpRequest | GrpcRequest | WebsocketRequest;
|
||||||
function isSidebarLeafModel(m: AnyModel): boolean {
|
function isSidebarLeafModel(m: AnyModel): boolean {
|
||||||
@@ -486,6 +488,29 @@ function Sidebar({ className }: { className?: string }) {
|
|||||||
/>
|
/>
|
||||||
<Dropdown
|
<Dropdown
|
||||||
items={[
|
items={[
|
||||||
|
{
|
||||||
|
label: 'Select Open Request',
|
||||||
|
leftSlot: <Icon icon="crosshair" />,
|
||||||
|
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',
|
label: 'Expand All Folders',
|
||||||
leftSlot: <Icon icon="chevrons_up_down" />,
|
leftSlot: <Icon icon="chevrons_up_down" />,
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import {
|
|||||||
CopyIcon,
|
CopyIcon,
|
||||||
CornerRightUpIcon,
|
CornerRightUpIcon,
|
||||||
CreditCardIcon,
|
CreditCardIcon,
|
||||||
|
CrosshairIcon,
|
||||||
DotIcon,
|
DotIcon,
|
||||||
DownloadIcon,
|
DownloadIcon,
|
||||||
EllipsisIcon,
|
EllipsisIcon,
|
||||||
@@ -169,6 +170,7 @@ const icons = {
|
|||||||
copy_check: CopyCheck,
|
copy_check: CopyCheck,
|
||||||
corner_right_up: CornerRightUpIcon,
|
corner_right_up: CornerRightUpIcon,
|
||||||
credit_card: CreditCardIcon,
|
credit_card: CreditCardIcon,
|
||||||
|
crosshair: CrosshairIcon,
|
||||||
dot: DotIcon,
|
dot: DotIcon,
|
||||||
download: DownloadIcon,
|
download: DownloadIcon,
|
||||||
ellipsis: EllipsisIcon,
|
ellipsis: EllipsisIcon,
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ export function useModelAncestors(m: AnyModel | null) {
|
|||||||
const folders = useAtomValue(foldersAtom);
|
const folders = useAtomValue(foldersAtom);
|
||||||
const workspaces = useAtomValue(workspacesAtom);
|
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[],
|
folders: Folder[],
|
||||||
workspaces: Workspace[],
|
workspaces: Workspace[],
|
||||||
currentModel: AnyModel | null,
|
currentModel: AnyModel | null,
|
||||||
@@ -25,7 +25,7 @@ function getParents(
|
|||||||
: null;
|
: null;
|
||||||
|
|
||||||
if (parentFolder != null) {
|
if (parentFolder != null) {
|
||||||
return [parentFolder, ...getParents(folders, workspaces, parentFolder)];
|
return [parentFolder, ...getModelAncestors(folders, workspaces, parentFolder)];
|
||||||
}
|
}
|
||||||
|
|
||||||
const parentWorkspace =
|
const parentWorkspace =
|
||||||
@@ -34,7 +34,7 @@ function getParents(
|
|||||||
: null;
|
: null;
|
||||||
|
|
||||||
if (parentWorkspace != null) {
|
if (parentWorkspace != null) {
|
||||||
return [parentWorkspace, ...getParents(folders, workspaces, parentWorkspace)];
|
return [parentWorkspace, ...getModelAncestors(folders, workspaces, parentWorkspace)];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
|
|||||||
Reference in New Issue
Block a user