diff --git a/apps/dokploy/components/shared/advance-breadcrumb.tsx b/apps/dokploy/components/shared/advance-breadcrumb.tsx index 0c6f442a5..2e7e8715f 100644 --- a/apps/dokploy/components/shared/advance-breadcrumb.tsx +++ b/apps/dokploy/components/shared/advance-breadcrumb.tsx @@ -36,12 +36,7 @@ import { Separator } from "@/components/ui/separator"; import { SidebarTrigger } from "@/components/ui/sidebar"; import { api } from "@/utils/api"; -interface AdvanceBreadcrumbProps { - projectId?: string; - environmentId?: string; - serviceId?: string; - serviceType?: ServiceType; -} +type AdvanceBreadcrumbProps = {}; const getServiceIcon = (type: ServiceType, className = "size-4") => { const icons: Record = { @@ -163,17 +158,31 @@ const extractServicesFromEnvironment = ( return services; }; -export const AdvanceBreadcrumb = ({ - projectId, - environmentId, - serviceId, -}: AdvanceBreadcrumbProps) => { +export const AdvanceBreadcrumb = () => { const router = useRouter(); + const { query } = router; + + // Read IDs from URL (dynamic route segments) + const projectId = + typeof query.projectId === "string" ? query.projectId : null; + const environmentId = + typeof query.environmentId === "string" ? query.environmentId : null; + const serviceId = + (typeof query.applicationId === "string" ? query.applicationId : null) ?? + (typeof query.composeId === "string" ? query.composeId : null) ?? + (typeof query.postgresId === "string" ? query.postgresId : null) ?? + (typeof query.mysqlId === "string" ? query.mysqlId : null) ?? + (typeof query.mariadbId === "string" ? query.mariadbId : null) ?? + (typeof query.redisId === "string" ? query.redisId : null) ?? + (typeof query.mongoId === "string" ? query.mongoId : null) ?? + null; + const [projectOpen, setProjectOpen] = useState(false); const [serviceOpen, setServiceOpen] = useState(false); const [environmentOpen, setEnvironmentOpen] = useState(false); const [projectSearch, setProjectSearch] = useState(""); const [serviceSearch, setServiceSearch] = useState(""); + const [environmentSearch, setEnvironmentSearch] = useState(""); const [expandedProjectId, setExpandedProjectId] = useState( null, ); @@ -183,19 +192,19 @@ export const AdvanceBreadcrumb = ({ // Fetch current project data const { data: currentProject } = api.project.one.useQuery( - { projectId: projectId || "" }, + { projectId: projectId ?? "" }, { enabled: !!projectId }, ); // Fetch current environment const { data: currentEnvironment } = api.environment.one.useQuery( - { environmentId: environmentId || "" }, + { environmentId: environmentId ?? "" }, { enabled: !!environmentId }, ); // Fetch environments for current project const { data: projectEnvironments } = api.environment.byProjectId.useQuery( - { projectId: projectId || "" }, + { projectId: projectId ?? "" }, { enabled: !!projectId }, ); @@ -276,6 +285,12 @@ export const AdvanceBreadcrumb = ({ s.appName?.toLowerCase().includes(serviceSearch.toLowerCase()), ); + // Filter environments based on search + const filteredEnvironments = + projectEnvironments?.filter((env) => + env.name.toLowerCase().includes(environmentSearch.toLowerCase()), + ) ?? []; + // If we're just on the projects page, show simple breadcrumb if (!projectId) { return ( @@ -367,7 +382,7 @@ export const AdvanceBreadcrumb = ({ {project.name} - + {project.environments.length} env {project.environments.length !== 1 ? "s" @@ -442,39 +457,58 @@ export const AdvanceBreadcrumb = ({ -
- {projectEnvironments.map((env) => { - const isSelected = env.environmentId === environmentId; - return ( - - ); - })} -
+ +
+ + + Esc + +
+ + No environments found. + + + {filteredEnvironments.map((env) => { + const isSelected = + env.environmentId === environmentId; + return ( + + handleEnvironmentSelect(env.environmentId) + } + className="flex items-center justify-between py-2 cursor-pointer" + > + {env.name} + {isSelected && ( + + )} + + ); + })} + + + +
)} @@ -532,7 +566,7 @@ export const AdvanceBreadcrumb = ({ key={service.id} value={service.id} onSelect={() => handleServiceSelect(service)} - className="flex items-center justify-between py-3 px-2 cursor-pointer" + className="flex items-center justify-between py-2 cursor-pointer" >