diff --git a/src/components/ProjectSetupModal.tsx b/src/components/ProjectSetupModal.tsx index 1281bf99..a234fe8a 100644 --- a/src/components/ProjectSetupModal.tsx +++ b/src/components/ProjectSetupModal.tsx @@ -5,7 +5,7 @@ import { generateWorkflowId, useWorkflowStore } from "@/store/workflowStore"; import { ProviderType, ProviderSettings, NodeDefaultsConfig, LLMProvider, LLMModelType } from "@/types"; import { CanvasNavigationSettings, PanMode, ZoomMode, SelectionMode } from "@/types/canvas"; import { EnvStatusResponse } from "@/app/api/env-status/route"; -import { loadNodeDefaults, saveNodeDefaults, getLastProjectBaseDir, setLastProjectBaseDir } from "@/store/utils/localStorage"; +import { loadNodeDefaults, saveNodeDefaults, getLastProjectBaseDir, setLastProjectBaseDir, setWorkflowsDirectory } from "@/store/utils/localStorage"; import { ProviderModel } from "@/lib/providers/types"; import { ModelSearchDialog } from "@/components/modals/ModelSearchDialog"; import { useInlineParameters } from "@/hooks/useInlineParameters"; @@ -154,6 +154,7 @@ export function ProjectSetupModal({ const [isValidating, setIsValidating] = useState(false); const [isBrowsing, setIsBrowsing] = useState(false); const [error, setError] = useState(null); + const browserLocalProjectsEnabled = isBrowserDirectoryPickerSupported(); // Provider tab state const [localProviders, setLocalProviders] = useState(providerSettings); @@ -288,6 +289,11 @@ export function ProjectSetupModal({ const fullProjectPath = ensureProjectSubfolderPath(directoryPath, name); const isBrowserPath = isBrowserFileSystemPath(fullProjectPath); + if (browserLocalProjectsEnabled && !isBrowserPath) { + setError(t("project.errorChooseLocalFolder")); + return; + } + if (!isBrowserPath && !(fullProjectPath.startsWith("/") || /^[A-Za-z]:[\\\/]/.test(fullProjectPath) || fullProjectPath.startsWith("\\\\"))) { setError(t("project.errorAbsolutePath")); return; @@ -301,6 +307,7 @@ export function ProjectSetupModal({ const id = mode === "new" ? generateWorkflowId() : useWorkflowStore.getState().workflowId || generateWorkflowId(); setUseExternalImageStorage(false); setLastProjectBaseDir(directoryPath); + setWorkflowsDirectory(directoryPath); onSave(id, name.trim(), fullProjectPath); setIsValidating(false); return; @@ -482,7 +489,8 @@ export function ProjectSetupModal({ type="text" value={directoryPath} onChange={(e) => setDirectoryPath(e.target.value)} - placeholder="/Users/username/projects/my-project" + readOnly={browserLocalProjectsEnabled} + placeholder={browserLocalProjectsEnabled ? t("project.localFolderPlaceholder") : "/Users/username/projects/my-project"} className="flex-1 px-3 py-2 bg-neutral-900 border border-neutral-600 rounded-lg text-neutral-100 text-sm focus:outline-none focus:border-neutral-500" />