From 2e9253e6694d1051ff3208eaaae89f7f07eee389 Mon Sep 17 00:00:00 2001 From: Nicholas Kolean Date: Wed, 12 Aug 2026 09:30:53 -0600 Subject: [PATCH] chore(studio): route cleanup, getNavItems Signed-off-by: Nicholas Kolean --- .../WorkspaceLayout/WorkspaceSideNav.tsx | 269 +++--------------- .../src/routes/groups/anonymizerRoutes.tsx | 16 +- .../src/routes/groups/customizationRoutes.tsx | 20 +- .../src/routes/groups/dashboardRoutes.tsx | 22 +- .../src/routes/groups/dataDesignerRoutes.tsx | 16 +- .../src/routes/groups/deploymentRoutes.tsx | 16 +- .../src/routes/groups/evaluationRoutes.tsx | 22 +- .../src/routes/groups/experimentRoutes.tsx | 17 +- .../src/routes/groups/filesetRoutes.tsx | 21 +- .../src/routes/groups/guardrailsRoutes.tsx | 17 +- .../studio/src/routes/groups/index.ts | 66 +++-- .../studio/src/routes/groups/intakeRoutes.tsx | 17 +- .../studio/src/routes/groups/jobRoutes.tsx | 17 +- .../src/routes/groups/modelCompareRoutes.tsx | 16 +- .../src/routes/groups/optimizerRoutes.tsx | 16 +- .../routes/groups/safeSynthesizerRoutes.tsx | 16 +- .../src/routes/groups/settingsRoutes.tsx | 17 +- .../src/routes/groups/virtualModelsRoutes.tsx | 17 +- 18 files changed, 351 insertions(+), 267 deletions(-) diff --git a/web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx b/web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx index 408780c1de..52498a8edd 100644 --- a/web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx +++ b/web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx @@ -8,25 +8,7 @@ import type { NavItem as NavItemData, } from '@studio/components/Layouts/NavigationDrawer/types'; import { isGroup } from '@studio/components/Layouts/NavigationDrawer/utils'; -import { - ANONYMIZER_ENABLED, - BASE_MODELS_ENABLED, - COPILOT_STUDIO_ENABLED, - CUSTOMIZER_ENABLED, - DASHBOARD_ENABLED, - DATA_DESIGNER_ENABLED, - DATASETS_ENABLED, - DEPLOYMENTS_ENABLED, - EVALUATOR_ENABLED, - EXPERIMENT_ENABLED, - GUARDRAILS_ENABLED, - INTAKE_ENABLED, - JOBS_ENABLED, - MODEL_COMPARE_ENABLED, - OPTIMIZER_ENABLED, - SAFE_SYNTHESIZER_ENABLED, - SETTINGS_ENABLED, -} from '@studio/constants/environment'; +import { BASE_MODELS_ENABLED } from '@studio/constants/environment'; import { useWorkspaceFromPath } from '@studio/hooks/useWorkspaceFromPath'; import { getPluginIcon } from '@studio/plugins/iconMap'; import { @@ -36,48 +18,27 @@ import { usePluginsLoaded, } from '@studio/plugins/PluginContext'; import { iconColorClass } from '@studio/routes/constants'; -import { getAgentSideNavItems } from '@studio/routes/groups/agentRoutes'; -import { - getAgentsListRoute, - getWorkspaceAnonymizerRoute, - getDataDesignerJobListRoute, - getEvaluationResultsRoute, - getExperimentRoute, - getGuardrailsRoute, - getIntakeTracesRoute, - getModelCompareRoute, - getOptimizerRoute, - getWorkspaceBaseModelsRoute, - getWorkspaceCustomizationJobListRoute, - getWorkspaceDashboardRoute, - getWorkspaceFilesetsRoute, - getWorkspaceDeploymentsRoute, - getWorkspaceJobsRoute, - getWorkspaceSafeSynthesizerRoute, - getWorkspaceSettingsRoute, - getWorkspaceVirtualModelsRoute, -} from '@studio/routes/utils'; import { - Bot, - Boxes, - ChartBar, - Database, - ListChecks, - Rocket, - Waypoints, - LayoutDashboard, - Lightbulb, - ListTree, - CirclePlay, - Metronome, - FlaskConical, - Form, - DatabaseCheck, - UserPen, - ShieldKeyhole, - FileStack, - Settings, -} from 'lucide-react'; + getAgentSideNavItems, + getAnonymizerSideNavItems, + getCustomizationSideNavItems, + getDashboardSideNavItems, + getDataDesignerSideNavItems, + getDeploymentSideNavItems, + getEvaluationSideNavItems, + getExperimentSideNavItems, + getFilesetSideNavItems, + getGuardrailsSideNavItems, + getIntakeSideNavItems, + getJobSideNavItems, + getModelCompareSideNavItems, + getOptimizerSideNavItems, + getSafeSynthesizerSideNavItems, + getSettingsSideNavItems, + getVirtualModelsSideNavItems, +} from '@studio/routes/groups'; +import { getAgentsListRoute, getWorkspaceBaseModelsRoute } from '@studio/routes/utils'; +import { Bot, Boxes, Database } from 'lucide-react'; import { useMemo } from 'react'; import { useLocation } from 'react-router'; @@ -129,139 +90,19 @@ export const WorkspaceSideNav = ({ collapsed }: { collapsed?: boolean }) => { const showAgents = agentsInstalled || !manifestResolved; const baseItems = useMemo(() => { - const dashboardNav = - DASHBOARD_ENABLED || COPILOT_STUDIO_ENABLED - ? [ - { - id: 'dashboard', - slotIcon: , - slotLabel: 'Dashboard', - href: getWorkspaceDashboardRoute(workspace), - }, - ] - : []; - const customizerNav = CUSTOMIZER_ENABLED - ? [ - { - id: 'custom-models', - slotIcon: , - slotLabel: 'Fine-tune', - href: getWorkspaceCustomizationJobListRoute(workspace), - }, - ] - : []; - - const evalNav = EVALUATOR_ENABLED - ? [ - { - id: 'evaluation-results', - slotIcon: , - // Qualified: the rail hoists this out of Models, next to the agent evaluations link. - slotLabel: 'Model Evaluations', - href: getEvaluationResultsRoute(workspace), - }, - ] - : []; - - const tracesNav = INTAKE_ENABLED - ? [ - { - id: 'traces', - slotIcon: , - slotLabel: 'Traces', - href: getIntakeTracesRoute(workspace), - }, - ] - : []; - - const experimentNav = EXPERIMENT_ENABLED - ? [ - { - id: 'experiment', - slotIcon: , - slotLabel: 'Experiments', - href: getExperimentRoute(workspace), - }, - ] - : []; - - const safeSynthesizerNav = SAFE_SYNTHESIZER_ENABLED - ? [ - { - id: 'safeSynthesizer', - slotIcon: , - slotLabel: 'Safe Synthesizer', - href: getWorkspaceSafeSynthesizerRoute(workspace), - }, - ] - : []; - - const dataDesignerNav = DATA_DESIGNER_ENABLED - ? [ - { - id: 'data-designer', - slotIcon:
, - slotLabel: 'Data Designer', - href: getDataDesignerJobListRoute(workspace), - }, - ] - : []; - - const anonymizerNav = ANONYMIZER_ENABLED - ? [ - { - id: 'anonymizer', - slotIcon: , - slotLabel: 'Anonymizer', - href: getWorkspaceAnonymizerRoute(workspace), - }, - ] - : []; - + const dashboardNav = getDashboardSideNavItems(workspace); + const customizerNav = getCustomizationSideNavItems(workspace); + const evalNav = getEvaluationSideNavItems(workspace); + const tracesNav = getIntakeSideNavItems(workspace); + const experimentNav = getExperimentSideNavItems(workspace); + const safeSynthesizerNav = getSafeSynthesizerSideNavItems(workspace); + const dataDesignerNav = getDataDesignerSideNavItems(workspace); + const anonymizerNav = getAnonymizerSideNavItems(workspace); const agentItems = showAgents ? getAgentSideNavItems(workspace) : []; - - const optimizerNav = OPTIMIZER_ENABLED - ? [ - { - id: 'optimizer', - slotIcon: , - slotLabel: 'Insights', - href: getOptimizerRoute(workspace), - }, - ] - : []; - const virtualModelsNav = GUARDRAILS_ENABLED - ? [ - { - id: 'virtual-models', - slotIcon: , - slotLabel: 'Virtual Models', - href: getWorkspaceVirtualModelsRoute(workspace), - }, - ] - : []; - - const modelCompareNav = MODEL_COMPARE_ENABLED - ? [ - { - id: 'playground', - slotIcon: , - slotLabel: 'Playground', - href: getModelCompareRoute(workspace), - }, - ] - : []; - - const deploymentsNav = DEPLOYMENTS_ENABLED - ? [ - { - id: 'deployments', - slotIcon: , - slotLabel: 'Deployments', - href: getWorkspaceDeploymentsRoute(workspace), - }, - ] - : []; + const optimizerNav = getOptimizerSideNavItems(workspace); + const virtualModelsNav = getVirtualModelsSideNavItems(workspace); + const modelCompareNav = getModelCompareSideNavItems(workspace); + const deploymentsNav = getDeploymentSideNavItems(workspace); const observabilityItems = [...optimizerNav, ...tracesNav]; @@ -315,16 +156,7 @@ export const WorkspaceSideNav = ({ collapsed }: { collapsed?: boolean }) => { ] : []; - const governanceItems = GUARDRAILS_ENABLED - ? [ - { - id: 'guardrails', - slotIcon: , - slotLabel: 'Guardrails', - href: getGuardrailsRoute(workspace), - }, - ] - : []; + const governanceItems = getGuardrailsSideNavItems(workspace); return [ ...dashboardNav, @@ -343,36 +175,9 @@ export const WorkspaceSideNav = ({ collapsed }: { collapsed?: boolean }) => { const systemNavGroup = useMemo(() => { const systemItems = [ - ...(JOBS_ENABLED - ? [ - { - id: 'jobs', - slotIcon: , - slotLabel: 'Jobs', - href: getWorkspaceJobsRoute(workspace), - }, - ] - : []), - ...(DATASETS_ENABLED - ? [ - { - id: 'datasets', - slotIcon: , - slotLabel: 'Filesets', - href: getWorkspaceFilesetsRoute(workspace), - }, - ] - : []), - ...(SETTINGS_ENABLED - ? [ - { - id: 'settings', - slotIcon: , - slotLabel: 'Settings', - href: getWorkspaceSettingsRoute(workspace), - }, - ] - : []), + ...getJobSideNavItems(workspace), + ...getFilesetSideNavItems(workspace), + ...getSettingsSideNavItems(workspace), ]; return systemItems.length > 0 ? [{ group: 'System', items: systemItems }] : []; }, [workspace]); diff --git a/web/packages/studio/src/routes/groups/anonymizerRoutes.tsx b/web/packages/studio/src/routes/groups/anonymizerRoutes.tsx index fb1c799aaf..ff477e7736 100644 --- a/web/packages/studio/src/routes/groups/anonymizerRoutes.tsx +++ b/web/packages/studio/src/routes/groups/anonymizerRoutes.tsx @@ -4,7 +4,9 @@ import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; import { ANONYMIZER_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateAnonymizerRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateAnonymizerRoutes, getWorkspaceAnonymizerRoute } from '@studio/routes/utils'; +import { UserPen } from 'lucide-react'; import { lazy, type FC } from 'react'; import type { RouteObject } from 'react-router'; @@ -47,3 +49,15 @@ export const anonymizerRoutes: RouteObject[] = gateAnonymizerRoutes([ errorElement: , }, ]); + +export const getAnonymizerSideNavItems = (workspace: string) => + ANONYMIZER_ENABLED + ? [ + { + id: 'anonymizer', + slotIcon: , + slotLabel: 'Anonymizer', + href: getWorkspaceAnonymizerRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/customizationRoutes.tsx b/web/packages/studio/src/routes/groups/customizationRoutes.tsx index 6166e18f7d..5ebc8a7d4d 100644 --- a/web/packages/studio/src/routes/groups/customizationRoutes.tsx +++ b/web/packages/studio/src/routes/groups/customizationRoutes.tsx @@ -2,8 +2,14 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { CUSTOMIZER_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateCustomizationRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { + gateCustomizationRoutes, + getWorkspaceCustomizationJobListRoute, +} from '@studio/routes/utils'; +import { Metronome } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -50,3 +56,15 @@ export const customizationRoutes: RouteObject[] = gateCustomizationRoutes([ errorElement: , }, ]); + +export const getCustomizationSideNavItems = (workspace: string) => + CUSTOMIZER_ENABLED + ? [ + { + id: 'custom-models', + slotIcon: , + slotLabel: 'Fine-tune', + href: getWorkspaceCustomizationJobListRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/dashboardRoutes.tsx b/web/packages/studio/src/routes/groups/dashboardRoutes.tsx index b2e8476e49..29ab33d151 100644 --- a/web/packages/studio/src/routes/groups/dashboardRoutes.tsx +++ b/web/packages/studio/src/routes/groups/dashboardRoutes.tsx @@ -2,9 +2,15 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; -import { COPILOT_STUDIO_ENABLED } from '@studio/constants/environment'; +import { COPILOT_STUDIO_ENABLED, DASHBOARD_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateCopilotStudioRoutes, gateDashboardRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { + gateCopilotStudioRoutes, + gateDashboardRoutes, + getWorkspaceDashboardRoute, +} from '@studio/routes/utils'; +import { LayoutDashboard } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -38,3 +44,15 @@ export const dashboardRoutes: RouteObject[] = gateDashboardRoutes([ }, ]), ]); + +export const getDashboardSideNavItems = (workspace: string) => + DASHBOARD_ENABLED || COPILOT_STUDIO_ENABLED + ? [ + { + id: 'dashboard', + slotIcon: , + slotLabel: 'Dashboard', + href: getWorkspaceDashboardRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/dataDesignerRoutes.tsx b/web/packages/studio/src/routes/groups/dataDesignerRoutes.tsx index 1d3cb71102..ac01ed398e 100644 --- a/web/packages/studio/src/routes/groups/dataDesignerRoutes.tsx +++ b/web/packages/studio/src/routes/groups/dataDesignerRoutes.tsx @@ -4,7 +4,9 @@ import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; import { DATA_DESIGNER_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateDataDesignerRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateDataDesignerRoutes, getDataDesignerJobListRoute } from '@studio/routes/utils'; +import { Form } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -71,3 +73,15 @@ export const dataDesignerRoutes: RouteObject[] = gateDataDesignerRoutes([ errorElement: , }, ]); + +export const getDataDesignerSideNavItems = (workspace: string) => + DATA_DESIGNER_ENABLED + ? [ + { + id: 'data-designer', + slotIcon: , + slotLabel: 'Data Designer', + href: getDataDesignerJobListRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/deploymentRoutes.tsx b/web/packages/studio/src/routes/groups/deploymentRoutes.tsx index 381e56a5f2..f19fbb623c 100644 --- a/web/packages/studio/src/routes/groups/deploymentRoutes.tsx +++ b/web/packages/studio/src/routes/groups/deploymentRoutes.tsx @@ -4,7 +4,9 @@ import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; import { DEPLOYMENTS_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateDeploymentsRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateDeploymentsRoutes, getWorkspaceDeploymentsRoute } from '@studio/routes/utils'; +import { Rocket } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -28,3 +30,15 @@ export const deploymentRoutes: RouteObject[] = gateDeploymentsRoutes([ errorElement: , }, ]); + +export const getDeploymentSideNavItems = (workspace: string) => + DEPLOYMENTS_ENABLED + ? [ + { + id: 'deployments', + slotIcon: , + slotLabel: 'Deployments', + href: getWorkspaceDeploymentsRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/evaluationRoutes.tsx b/web/packages/studio/src/routes/groups/evaluationRoutes.tsx index 909bd54880..7906be7171 100644 --- a/web/packages/studio/src/routes/groups/evaluationRoutes.tsx +++ b/web/packages/studio/src/routes/groups/evaluationRoutes.tsx @@ -2,8 +2,15 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { EVALUATOR_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateEvaluationBenchmarksRoutes, gateEvaluationRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { + gateEvaluationBenchmarksRoutes, + gateEvaluationRoutes, + getEvaluationResultsRoute, +} from '@studio/routes/utils'; +import { ChartBar } from 'lucide-react'; import { lazy } from 'react'; import { Navigate, type RouteObject } from 'react-router'; @@ -58,3 +65,16 @@ export const evaluationRoutes: RouteObject[] = gateEvaluationRoutes([ ], }, ]); + +export const getEvaluationSideNavItems = (workspace: string) => + EVALUATOR_ENABLED + ? [ + { + id: 'evaluation-results', + slotIcon: , + // Qualified: the rail hoists this out of Models, next to the agent evaluations link. + slotLabel: 'Model Evaluations', + href: getEvaluationResultsRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/experimentRoutes.tsx b/web/packages/studio/src/routes/groups/experimentRoutes.tsx index 73186a3fdc..55c69ccb72 100644 --- a/web/packages/studio/src/routes/groups/experimentRoutes.tsx +++ b/web/packages/studio/src/routes/groups/experimentRoutes.tsx @@ -2,8 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { EXPERIMENT_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateExperimentRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateExperimentRoutes, getExperimentRoute } from '@studio/routes/utils'; +import { FlaskConical } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -50,3 +53,15 @@ export const experimentRoutes: RouteObject[] = gateExperimentRoutes([ errorElement: , }, ]); + +export const getExperimentSideNavItems = (workspace: string) => + EXPERIMENT_ENABLED + ? [ + { + id: 'experiment', + slotIcon: , + slotLabel: 'Experiments', + href: getExperimentRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/filesetRoutes.tsx b/web/packages/studio/src/routes/groups/filesetRoutes.tsx index 1dfdb8c832..8a5b510249 100644 --- a/web/packages/studio/src/routes/groups/filesetRoutes.tsx +++ b/web/packages/studio/src/routes/groups/filesetRoutes.tsx @@ -2,8 +2,15 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { DATASETS_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateDatasetsRoutes, gateFilesetDetailsRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { + gateDatasetsRoutes, + gateFilesetDetailsRoutes, + getWorkspaceFilesetsRoute, +} from '@studio/routes/utils'; +import { FileStack } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -50,3 +57,15 @@ export const filesetRoutes: RouteObject[] = gateDatasetsRoutes([ }, ]), ]); + +export const getFilesetSideNavItems = (workspace: string) => + DATASETS_ENABLED + ? [ + { + id: 'datasets', + slotIcon: , + slotLabel: 'Filesets', + href: getWorkspaceFilesetsRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/guardrailsRoutes.tsx b/web/packages/studio/src/routes/groups/guardrailsRoutes.tsx index a939766930..2008f45886 100644 --- a/web/packages/studio/src/routes/groups/guardrailsRoutes.tsx +++ b/web/packages/studio/src/routes/groups/guardrailsRoutes.tsx @@ -2,9 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { GUARDRAILS_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; +import { iconColorClass } from '@studio/routes/constants'; import { GUARDRAIL_CHECKS_DEFAULT_SUB_TAB } from '@studio/routes/guardrails/GuardrailChecksTab/constants'; -import { gateGuardrailsRoutes } from '@studio/routes/utils'; +import { gateGuardrailsRoutes, getGuardrailsRoute } from '@studio/routes/utils'; +import { ShieldKeyhole } from 'lucide-react'; import { lazy } from 'react'; import { Navigate, type RouteObject } from 'react-router'; @@ -62,3 +65,15 @@ export const guardrailsRoutes: RouteObject[] = gateGuardrailsRoutes([ ], }, ]); + +export const getGuardrailsSideNavItems = (workspace: string) => + GUARDRAILS_ENABLED + ? [ + { + id: 'guardrails', + slotIcon: , + slotLabel: 'Guardrails', + href: getGuardrailsRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/index.ts b/web/packages/studio/src/routes/groups/index.ts index e1e02a4722..293f0cddc0 100644 --- a/web/packages/studio/src/routes/groups/index.ts +++ b/web/packages/studio/src/routes/groups/index.ts @@ -1,24 +1,54 @@ // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -export { dashboardRoutes } from '@studio/routes/groups/dashboardRoutes'; +export { agentRoutes, getAgentSideNavItems } from '@studio/routes/groups/agentRoutes'; +export { + anonymizerRoutes, + getAnonymizerSideNavItems, +} from '@studio/routes/groups/anonymizerRoutes'; export { baseModelsRoutes } from '@studio/routes/groups/baseModelsRoutes'; -export { filesetRoutes } from '@studio/routes/groups/filesetRoutes'; -export { secretsRoutes } from '@studio/routes/groups/secretsRoutes'; -export { guardrailsRoutes } from '@studio/routes/groups/guardrailsRoutes'; +export { + customizationRoutes, + getCustomizationSideNavItems, +} from '@studio/routes/groups/customizationRoutes'; +export { dashboardRoutes, getDashboardSideNavItems } from '@studio/routes/groups/dashboardRoutes'; +export { + dataDesignerRoutes, + getDataDesignerSideNavItems, +} from '@studio/routes/groups/dataDesignerRoutes'; +export { + deploymentRoutes, + getDeploymentSideNavItems, +} from '@studio/routes/groups/deploymentRoutes'; +export { + evaluationRoutes, + getEvaluationSideNavItems, +} from '@studio/routes/groups/evaluationRoutes'; +export { + experimentRoutes, + getExperimentSideNavItems, +} from '@studio/routes/groups/experimentRoutes'; +export { filesetRoutes, getFilesetSideNavItems } from '@studio/routes/groups/filesetRoutes'; +export { + guardrailsRoutes, + getGuardrailsSideNavItems, +} from '@studio/routes/groups/guardrailsRoutes'; export { inferenceProviderRoutes } from '@studio/routes/groups/inferenceProviderRoutes'; -export { virtualModelsRoutes } from '@studio/routes/groups/virtualModelsRoutes'; -export { deploymentRoutes } from '@studio/routes/groups/deploymentRoutes'; -export { evaluationRoutes } from '@studio/routes/groups/evaluationRoutes'; -export { experimentRoutes } from '@studio/routes/groups/experimentRoutes'; -export { customizationRoutes } from '@studio/routes/groups/customizationRoutes'; -export { jobRoutes } from '@studio/routes/groups/jobRoutes'; -export { intakeRoutes } from '@studio/routes/groups/intakeRoutes'; -export { safeSynthesizerRoutes } from '@studio/routes/groups/safeSynthesizerRoutes'; -export { dataDesignerRoutes } from '@studio/routes/groups/dataDesignerRoutes'; -export { anonymizerRoutes } from '@studio/routes/groups/anonymizerRoutes'; -export { agentRoutes } from '@studio/routes/groups/agentRoutes'; -export { settingsRoutes } from '@studio/routes/groups/settingsRoutes'; -export { modelCompareRoutes } from '@studio/routes/groups/modelCompareRoutes'; +export { intakeRoutes, getIntakeSideNavItems } from '@studio/routes/groups/intakeRoutes'; +export { jobRoutes, getJobSideNavItems } from '@studio/routes/groups/jobRoutes'; export { memberRoutes } from '@studio/routes/groups/memberRoutes'; -export { optimizerRoutes } from '@studio/routes/groups/optimizerRoutes'; +export { + modelCompareRoutes, + getModelCompareSideNavItems, +} from '@studio/routes/groups/modelCompareRoutes'; +export { optimizerRoutes, getOptimizerSideNavItems } from '@studio/routes/groups/optimizerRoutes'; +export { + safeSynthesizerRoutes, + getSafeSynthesizerSideNavItems, +} from '@studio/routes/groups/safeSynthesizerRoutes'; +export { secretsRoutes } from '@studio/routes/groups/secretsRoutes'; +export { settingsRoutes, getSettingsSideNavItems } from '@studio/routes/groups/settingsRoutes'; +export { + virtualModelsRoutes, + getVirtualModelsSideNavItems, +} from '@studio/routes/groups/virtualModelsRoutes'; diff --git a/web/packages/studio/src/routes/groups/intakeRoutes.tsx b/web/packages/studio/src/routes/groups/intakeRoutes.tsx index b1399e6c09..c50ca9a822 100644 --- a/web/packages/studio/src/routes/groups/intakeRoutes.tsx +++ b/web/packages/studio/src/routes/groups/intakeRoutes.tsx @@ -3,9 +3,12 @@ import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; import { Stack } from '@nvidia/foundations-react-core'; +import { INTAKE_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; +import { iconColorClass } from '@studio/routes/constants'; import { INTAKE_FILTER_ACTION_TARGET_ID } from '@studio/routes/IntakeLayout'; -import { gateIntakeRoutes } from '@studio/routes/utils'; +import { gateIntakeRoutes, getIntakeTracesRoute } from '@studio/routes/utils'; +import { ListTree } from 'lucide-react'; import { type FC, lazy } from 'react'; import { Navigate, type RouteObject } from 'react-router'; @@ -66,3 +69,15 @@ export const intakeRoutes: RouteObject[] = gateIntakeRoutes([ errorElement: , }, ]); + +export const getIntakeSideNavItems = (workspace: string) => + INTAKE_ENABLED + ? [ + { + id: 'traces', + slotIcon: , + slotLabel: 'Traces', + href: getIntakeTracesRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/jobRoutes.tsx b/web/packages/studio/src/routes/groups/jobRoutes.tsx index 60f4f07693..75622658b2 100644 --- a/web/packages/studio/src/routes/groups/jobRoutes.tsx +++ b/web/packages/studio/src/routes/groups/jobRoutes.tsx @@ -2,8 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { JOBS_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateJobsRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateJobsRoutes, getWorkspaceJobsRoute } from '@studio/routes/utils'; +import { ListChecks } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -30,3 +33,15 @@ export const jobRoutes: RouteObject[] = gateJobsRoutes([ errorElement: , }, ]); + +export const getJobSideNavItems = (workspace: string) => + JOBS_ENABLED + ? [ + { + id: 'jobs', + slotIcon: , + slotLabel: 'Jobs', + href: getWorkspaceJobsRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/modelCompareRoutes.tsx b/web/packages/studio/src/routes/groups/modelCompareRoutes.tsx index 610d23a4f3..4d9ab95cd6 100644 --- a/web/packages/studio/src/routes/groups/modelCompareRoutes.tsx +++ b/web/packages/studio/src/routes/groups/modelCompareRoutes.tsx @@ -4,7 +4,9 @@ import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; import { MODEL_COMPARE_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateModelCompareRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateModelCompareRoutes, getModelCompareRoute } from '@studio/routes/utils'; +import { CirclePlay } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -23,3 +25,15 @@ export const modelCompareRoutes: RouteObject[] = gateModelCompareRoutes([ errorElement: , }, ]); + +export const getModelCompareSideNavItems = (workspace: string) => + MODEL_COMPARE_ENABLED + ? [ + { + id: 'playground', + slotIcon: , + slotLabel: 'Playground', + href: getModelCompareRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/optimizerRoutes.tsx b/web/packages/studio/src/routes/groups/optimizerRoutes.tsx index 84be5c5126..f808482996 100644 --- a/web/packages/studio/src/routes/groups/optimizerRoutes.tsx +++ b/web/packages/studio/src/routes/groups/optimizerRoutes.tsx @@ -4,7 +4,9 @@ import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; import { OPTIMIZER_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateOptimizerRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateOptimizerRoutes, getOptimizerRoute } from '@studio/routes/utils'; +import { Lightbulb } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -40,3 +42,15 @@ export const optimizerRoutes: RouteObject[] = gateOptimizerRoutes( ] : [] ); + +export const getOptimizerSideNavItems = (workspace: string) => + OPTIMIZER_ENABLED + ? [ + { + id: 'optimizer', + slotIcon: , + slotLabel: 'Insights', + href: getOptimizerRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/safeSynthesizerRoutes.tsx b/web/packages/studio/src/routes/groups/safeSynthesizerRoutes.tsx index f9195be52e..407a296767 100644 --- a/web/packages/studio/src/routes/groups/safeSynthesizerRoutes.tsx +++ b/web/packages/studio/src/routes/groups/safeSynthesizerRoutes.tsx @@ -4,7 +4,9 @@ import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; import { SAFE_SYNTHESIZER_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateSafeSynthesizerRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateSafeSynthesizerRoutes, getWorkspaceSafeSynthesizerRoute } from '@studio/routes/utils'; +import { DatabaseCheck } from 'lucide-react'; import { FC, lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -59,3 +61,15 @@ export const safeSynthesizerRoutes: RouteObject[] = gateSafeSynthesizerRoutes([ errorElement: , }, ]); + +export const getSafeSynthesizerSideNavItems = (workspace: string) => + SAFE_SYNTHESIZER_ENABLED + ? [ + { + id: 'safeSynthesizer', + slotIcon: , + slotLabel: 'Safe Synthesizer', + href: getWorkspaceSafeSynthesizerRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/settingsRoutes.tsx b/web/packages/studio/src/routes/groups/settingsRoutes.tsx index f1f5c0097a..b674ac2de3 100644 --- a/web/packages/studio/src/routes/groups/settingsRoutes.tsx +++ b/web/packages/studio/src/routes/groups/settingsRoutes.tsx @@ -2,8 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { SETTINGS_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateSettingsRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateSettingsRoutes, getWorkspaceSettingsRoute } from '@studio/routes/utils'; +import { Settings } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -20,3 +23,15 @@ export const settingsRoutes: RouteObject[] = gateSettingsRoutes([ errorElement: , }, ]); + +export const getSettingsSideNavItems = (workspace: string) => + SETTINGS_ENABLED + ? [ + { + id: 'settings', + slotIcon: , + slotLabel: 'Settings', + href: getWorkspaceSettingsRoute(workspace), + }, + ] + : []; diff --git a/web/packages/studio/src/routes/groups/virtualModelsRoutes.tsx b/web/packages/studio/src/routes/groups/virtualModelsRoutes.tsx index 9aa7f018a4..b607bc317a 100644 --- a/web/packages/studio/src/routes/groups/virtualModelsRoutes.tsx +++ b/web/packages/studio/src/routes/groups/virtualModelsRoutes.tsx @@ -2,8 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorPanel } from '@nemo/common/src/components/ErrorPanel'; +import { GUARDRAILS_ENABLED } from '@studio/constants/environment'; import { ROUTES } from '@studio/constants/routes'; -import { gateGuardrailsRoutes } from '@studio/routes/utils'; +import { iconColorClass } from '@studio/routes/constants'; +import { gateGuardrailsRoutes, getWorkspaceVirtualModelsRoute } from '@studio/routes/utils'; +import { Waypoints } from 'lucide-react'; import { lazy } from 'react'; import type { RouteObject } from 'react-router'; @@ -20,3 +23,15 @@ export const virtualModelsRoutes: RouteObject[] = gateGuardrailsRoutes([ errorElement: , }, ]); + +export const getVirtualModelsSideNavItems = (workspace: string) => + GUARDRAILS_ENABLED + ? [ + { + id: 'virtual-models', + slotIcon: , + slotLabel: 'Virtual Models', + href: getWorkspaceVirtualModelsRoute(workspace), + }, + ] + : [];