From 0a4ffde319cf987c29edcab32cb6cc2f286adea6 Mon Sep 17 00:00:00 2001 From: Pathik Date: Mon, 16 Feb 2026 22:12:42 +0530 Subject: [PATCH] Support moving multiple requests to another workspace (#396) Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> Co-authored-by: Gregory Schier --- src-web/commands/moveToWorkspace.tsx | 13 +++++-- src-web/components/MoveToWorkspaceDialog.tsx | 38 ++++++++++++-------- src-web/components/Sidebar.tsx | 30 +++++++++++----- src-web/hooks/useHotKey.ts | 4 +++ 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src-web/commands/moveToWorkspace.tsx b/src-web/commands/moveToWorkspace.tsx index a3839b93..63672b4f 100644 --- a/src-web/commands/moveToWorkspace.tsx +++ b/src-web/commands/moveToWorkspace.tsx @@ -3,23 +3,30 @@ import type { GrpcRequest, HttpRequest, WebsocketRequest } from '@yaakapp-intern import { MoveToWorkspaceDialog } from '../components/MoveToWorkspaceDialog'; import { activeWorkspaceIdAtom } from '../hooks/useActiveWorkspace'; import { createFastMutation } from '../hooks/useFastMutation'; +import { pluralizeCount } from '../lib/pluralize'; import { showDialog } from '../lib/dialog'; import { jotaiStore } from '../lib/jotai'; export const moveToWorkspace = createFastMutation({ mutationKey: ['move_workspace'], - mutationFn: async (request: HttpRequest | GrpcRequest | WebsocketRequest) => { + mutationFn: async (requests: (HttpRequest | GrpcRequest | WebsocketRequest)[]) => { const activeWorkspaceId = jotaiStore.get(activeWorkspaceIdAtom); if (activeWorkspaceId == null) return; + if (requests.length === 0) return; + + const title = + requests.length === 1 + ? 'Move Request' + : `Move ${pluralizeCount('Request', requests.length)}`; showDialog({ id: 'change-workspace', - title: 'Move Workspace', + title, size: 'sm', render: ({ hide }) => ( ), diff --git a/src-web/components/MoveToWorkspaceDialog.tsx b/src-web/components/MoveToWorkspaceDialog.tsx index 33706f32..d6f405ec 100644 --- a/src-web/components/MoveToWorkspaceDialog.tsx +++ b/src-web/components/MoveToWorkspaceDialog.tsx @@ -2,6 +2,7 @@ import type { GrpcRequest, HttpRequest, WebsocketRequest } from '@yaakapp-intern import { patchModel, workspacesAtom } from '@yaakapp-internal/models'; import { useAtomValue } from 'jotai'; import { useState } from 'react'; +import { pluralizeCount } from '../lib/pluralize'; import { resolvedModelName } from '../lib/resolvedModelName'; import { router } from '../lib/router'; import { showToast } from '../lib/toast'; @@ -12,18 +13,21 @@ import { VStack } from './core/Stacks'; interface Props { activeWorkspaceId: string; - request: HttpRequest | GrpcRequest | WebsocketRequest; + requests: (HttpRequest | GrpcRequest | WebsocketRequest)[]; onDone: () => void; } -export function MoveToWorkspaceDialog({ onDone, request, activeWorkspaceId }: Props) { +export function MoveToWorkspaceDialog({ onDone, requests, activeWorkspaceId }: Props) { const workspaces = useAtomValue(workspacesAtom); const [selectedWorkspaceId, setSelectedWorkspaceId] = useState(activeWorkspaceId); + const targetWorkspace = workspaces.find((w) => w.id === selectedWorkspaceId); + const isSameWorkspace = selectedWorkspaceId === activeWorkspaceId; + return (