diff --git a/apps/backend/src/trpc/system.routes.ts b/apps/backend/src/trpc/system.routes.ts
index e66801bab..e5669bcca 100644
--- a/apps/backend/src/trpc/system.routes.ts
+++ b/apps/backend/src/trpc/system.routes.ts
@@ -10,6 +10,7 @@ export const systemRoutes = {
enableUserSignup: await isUserSignupAvailable(),
betaAutomationsEnabled: env.BETA_AUTOMATIONS_ENABLED,
betaContextRecommendationsEnabled: env.BETA_CONTEXT_RECOMMENDATIONS_ENABLED,
+ hasDefaultProjectPath: Boolean(env.NAO_DEFAULT_PROJECT_PATH),
})),
version: adminProtectedProcedure.query(() => ({
diff --git a/apps/frontend/src/components/project-selector.tsx b/apps/frontend/src/components/project-selector.tsx
index 6c061ce35..0eaa9525f 100644
--- a/apps/frontend/src/components/project-selector.tsx
+++ b/apps/frontend/src/components/project-selector.tsx
@@ -22,6 +22,7 @@ export function ProjectSelector({
projects,
currentProjectId,
onChange,
+ disabledProjectIds,
className,
triggerClassName,
triggerVariant,
@@ -32,6 +33,7 @@ export function ProjectSelector({
projects: ProjectOption[];
currentProjectId: string;
onChange: (projectId: string) => void;
+ disabledProjectIds?: string[];
className?: string;
triggerClassName?: string;
triggerVariant?: 'default' | 'ghost';
@@ -50,16 +52,23 @@ export function ProjectSelector({
Projects
- {projects.map((project) => (
-
-
- {project.name}
-
- {USER_ROLE_LABELS[project.userRole]}
+ {projects.map((project) => {
+ const isDisabled = disabledProjectIds?.includes(project.id);
+ return (
+
+
+ {project.name}
+
+ {USER_ROLE_LABELS[project.userRole]}
+
-
-
- ))}
+
+ );
+ })}
diff --git a/apps/frontend/src/components/sidebar-settings-nav.tsx b/apps/frontend/src/components/sidebar-settings-nav.tsx
index 04f155460..703948551 100644
--- a/apps/frontend/src/components/sidebar-settings-nav.tsx
+++ b/apps/frontend/src/components/sidebar-settings-nav.tsx
@@ -130,6 +130,7 @@ interface SidebarSettingsNavProps {
hasLicense: boolean;
projects: ProjectOption[];
currentProjectId?: string;
+ isProjectPinned?: boolean;
onProjectChange: (projectId: string) => void;
}
@@ -153,6 +154,7 @@ export function SidebarSettingsNav({
hasLicense,
projects,
currentProjectId,
+ isProjectPinned,
onProjectChange,
}: SidebarSettingsNavProps) {
const navigate = useNavigate();
@@ -378,6 +380,7 @@ export function SidebarSettingsNav({
)}
@@ -393,12 +396,18 @@ export function SidebarSettingsNav({
function ProjectSwitcherSubItem({
projects,
currentProjectId,
+ isProjectPinned,
onChange,
}: {
projects: ProjectOption[];
currentProjectId: string;
+ isProjectPinned?: boolean;
onChange: (projectId: string) => void;
}) {
+ const disabledProjectIds = isProjectPinned
+ ? projects.filter((p) => p.id !== currentProjectId).map((p) => p.id)
+ : undefined;
+
return (
Switch project
@@ -406,6 +415,7 @@ function ProjectSwitcherSubItem({
projects={projects}
currentProjectId={currentProjectId}
onChange={onChange}
+ disabledProjectIds={disabledProjectIds}
triggerVariant='ghost'
triggerIcon={
}
triggerClassName={cn(
diff --git a/apps/frontend/src/components/sidebar.tsx b/apps/frontend/src/components/sidebar.tsx
index 73d1cef61..56d442b52 100644
--- a/apps/frontend/src/components/sidebar.tsx
+++ b/apps/frontend/src/components/sidebar.tsx
@@ -47,6 +47,7 @@ export function Sidebar() {
const branding = useBranding();
const { isAdmin, isContextAdmin, isViewer } = usePermissions();
const isCloud = config.data?.naoMode === 'cloud';
+ const isProjectPinned = !isCloud && config.data?.hasDefaultProjectPath === true;
const betaAutomationsEnabled = config.data?.betaAutomationsEnabled === true;
const { groupBy, filters, setGroupBy, toggleFilter } = useChatViewPreferences();
const hasLicense = license.data?.tokenProvided === true;
@@ -246,6 +247,7 @@ export function Sidebar() {
hasLicense={hasLicense}
projects={projects.data ?? []}
currentProjectId={project.data?.id}
+ isProjectPinned={isProjectPinned}
onProjectChange={handleProjectChange}
/>
) : (