diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/control-cloud/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/control-cloud/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/control-cloud/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/control-cloud/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-datetime/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-datetime/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-datetime/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-datetime/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/deployment-status-filter.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/deployment-status-filter.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/deployment-status-filter.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/deployment-status-filter.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/environment-filter.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/environment-filter.tsx similarity index 90% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/environment-filter.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/environment-filter.tsx index 19a48a393d..fa8cb24ab7 100644 --- a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/environment-filter.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/components/environment-filter.tsx @@ -1,4 +1,4 @@ -import { useProjectLayout } from "@/app/(app)/projects/[projectId]/layout-provider"; +import { useProjectLayout } from "@/app/(app)/[workspaceSlug]/projects/[projectId]/layout-provider"; import { FilterCheckbox } from "@/components/logs/checkbox/filter-checkbox"; import { useLiveQuery } from "@tanstack/react-db"; import { useFilters } from "../../../../../hooks/use-filters"; diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-filters/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-search/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-search/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/components/deployment-list-search/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/components/deployment-list-search/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/controls/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/controls/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/promotion-dialog.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/promotion-dialog.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/promotion-dialog.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/promotion-dialog.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/rollback-dialog.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/rollback-dialog.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/rollback-dialog.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/rollback-dialog.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/actions/deployment-list-table-action.popover.constants.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/actions/deployment-list-table-action.popover.constants.tsx similarity index 90% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/actions/deployment-list-table-action.popover.constants.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/actions/deployment-list-table-action.popover.constants.tsx index eb575ed767..699913f929 100644 --- a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/actions/deployment-list-table-action.popover.constants.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/actions/deployment-list-table-action.popover.constants.tsx @@ -1,6 +1,7 @@ "use client"; -import { useProjectLayout } from "@/app/(app)/projects/[projectId]/layout-provider"; +import { useProjectLayout } from "@/app/(app)/[workspaceSlug]/projects/[projectId]/layout-provider"; import { type MenuItem, TableActionPopover } from "@/components/logs/table-action.popover"; +import { useWorkspaceNavigation } from "@/hooks/use-workspace-navigation"; import type { Deployment, Environment } from "@/lib/collections"; import { eq, useLiveQuery } from "@tanstack/react-db"; import { ArrowDottedRotateAnticlockwise, ChevronUp, Layers3 } from "@unkey/icons"; @@ -20,6 +21,7 @@ export const DeploymentListTableActions = ({ selectedDeployment, environment, }: DeploymentListTableActionsProps) => { + const workspace = useWorkspaceNavigation(); const { collections } = useProjectLayout(); const { data } = useLiveQuery((q) => q @@ -78,7 +80,7 @@ export const DeploymentListTableActions = ({ onClick: () => { //INFO: This will produce a long query, but once we start using `contains` instead of `is` this will be a shorter query. router.push( - `/projects/${selectedDeployment.projectId}/gateway-logs?host=${data + `${workspace.slug}/projects/${selectedDeployment.projectId}/gateway-logs?host=${data .map((item) => `is:${item.host}`) .join(",")}`, ); diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/deployment-status-badge.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/deployment-status-badge.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/deployment-status-badge.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/deployment-status-badge.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/domain_list.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/domain_list.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/domain_list.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/domain_list.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/env-status-badge.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/skeletons.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/skeletons.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/components/skeletons.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/components/skeletons.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments-list.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/deployments-list.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments-list.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/deployments-list.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments.schema.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/deployments.schema.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/deployments.schema.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/deployments.schema.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/utils/get-row-class.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/utils/get-row-class.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/components/table/utils/get-row-class.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/components/table/utils/get-row-class.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/filters.schema.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/filters.schema.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/filters.schema.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/filters.schema.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-deployments.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/hooks/use-deployments.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-deployments.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/hooks/use-deployments.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-filters.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/hooks/use-filters.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/hooks/use-filters.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/hooks/use-filters.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/deployments/page.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/page.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/deployments/page.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/page.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/active-deployment-card-empty.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/active-deployment-card-empty.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/active-deployment-card-empty.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/active-deployment-card-empty.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/filter-button.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/filter-button.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/filter-button.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/filter-button.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/git-avatar.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/git-avatar.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/git-avatar.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/git-avatar.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/hooks/use-deployment-logs.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/hooks/use-deployment-logs.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/hooks/use-deployment-logs.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/hooks/use-deployment-logs.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/info-chip.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/info-chip.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/info-chip.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/info-chip.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/skeleton.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/skeleton.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/skeleton.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/skeleton.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/status-indicator.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/status-indicator.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/active-deployment-card/status-indicator.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/active-deployment-card/status-indicator.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/card.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/card.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/card.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/card.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/collapsible-row.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/collapsible-row.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/collapsible-row.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/collapsible-row.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/domain-row.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/domain-row.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/domain-row.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/domain-row.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/add-env-var-row.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/add-env-var-row.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/add-env-var-row.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/add-env-var-row.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-form.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-form.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-form.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-form.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-inputs.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-inputs.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-inputs.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-inputs.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-save-actions.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-save-actions.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-save-actions.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-save-actions.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-secret-switch.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-secret-switch.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/components/env-var-secret-switch.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/components/env-var-secret-switch.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/env-var-row.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/env-var-row.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/env-var-row.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/env-var-row.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/hooks/use-env-var-manager.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/hooks/use-env-var-manager.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/hooks/use-env-var-manager.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/hooks/use-env-var-manager.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/types.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/types.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/env-variables-section/types.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/types.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/project-details-expandables/detail-section.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/project-details-expandables/detail-section.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/project-details-expandables/detail-section.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/project-details-expandables/detail-section.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/project-details-expandables/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/project-details-expandables/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/project-details-expandables/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/project-details-expandables/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/project-details-expandables/sections.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/project-details-expandables/sections.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/project-details-expandables/sections.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/project-details-expandables/sections.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/details/section.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/section.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/details/section.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/details/section.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/components/client.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/components/client.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/components/client.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/components/client.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/constants.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/constants.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/constants.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/constants.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/page.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/page.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/page.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/page.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/types.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/types.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/diff/[...compare]/types.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/[...compare]/types.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/diff/page.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/page.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/diff/page.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/diff/page.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/charts/hooks/use-gateway-logs-timeseries.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/charts/hooks/use-gateway-logs-timeseries.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/charts/hooks/use-gateway-logs-timeseries.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/charts/hooks/use-gateway-logs-timeseries.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/charts/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/charts/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/charts/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/charts/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/control-cloud/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/control-cloud/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/control-cloud/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/control-cloud/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-datetime/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-datetime/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-datetime/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-datetime/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-methods-filter.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-methods-filter.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-methods-filter.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-methods-filter.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-paths-filter.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-paths-filter.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-paths-filter.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-paths-filter.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-status-filter.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-status-filter.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-status-filter.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/components/gateway-logs-status-filter.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-filters/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-live-switch.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-live-switch.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-live-switch.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-live-switch.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-refresh.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-refresh.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-refresh.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-refresh.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-search/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-search/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-search/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/components/gateway-logs-search/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/controls/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/controls/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/gateway-log-details/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/gateway-log-details/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/gateway-log-details/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/gateway-log-details/index.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/gateway-logs-table.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/gateway-logs-table.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/gateway-logs-table.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/gateway-logs-table.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/hooks/use-gateway-logs-query.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/hooks/use-gateway-logs-query.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/hooks/use-gateway-logs-query.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/hooks/use-gateway-logs-query.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/utils/get-row-class.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/utils/get-row-class.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/components/table/utils/get-row-class.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/components/table/utils/get-row-class.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/constants.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/constants.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/constants.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/constants.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/context/gateway-logs-provider.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/context/gateway-logs-provider.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/context/gateway-logs-provider.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/context/gateway-logs-provider.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/hooks/use-gateway-logs-filters.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/hooks/use-gateway-logs-filters.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/hooks/use-gateway-logs-filters.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/hooks/use-gateway-logs-filters.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/page.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/page.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/page.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/page.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/types.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/types.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/types.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/types.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/utils.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/utils.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/gateway-logs/utils.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/gateway-logs/utils.ts diff --git a/apps/dashboard/app/(app)/projects/[projectId]/layout-provider.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/layout-provider.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/layout-provider.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/layout-provider.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/layout.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/layout.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/layout.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/layout.tsx diff --git a/apps/dashboard/app/(app)/projects/[projectId]/navigations/project-navigation.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/navigations/project-navigation.tsx similarity index 81% rename from apps/dashboard/app/(app)/projects/[projectId]/navigations/project-navigation.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/navigations/project-navigation.tsx index 44c7ab8db4..dfcf4f1178 100644 --- a/apps/dashboard/app/(app)/projects/[projectId]/navigations/project-navigation.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/navigations/project-navigation.tsx @@ -2,9 +2,17 @@ import { QuickNavPopover } from "@/components/navbar-popover"; import { NavbarActionButton } from "@/components/navigation/action-button"; import { Navbar } from "@/components/navigation/navbar"; +import { useWorkspaceNavigation } from "@/hooks/use-workspace-navigation"; import { collection } from "@/lib/collections"; import { eq, useLiveQuery } from "@tanstack/react-db"; -import { ArrowDottedRotateAnticlockwise, Cube, Dots, ListRadio, Refresh3 } from "@unkey/icons"; +import { + ArrowDottedRotateAnticlockwise, + ChevronExpandY, + Cube, + Dots, + ListRadio, + Refresh3, +} from "@unkey/icons"; import { Button, Separator } from "@unkey/ui"; import { RepoDisplay } from "../../_components/list/repo-display"; @@ -13,6 +21,7 @@ type ProjectNavigationProps = { }; export const ProjectNavigation = ({ projectId }: ProjectNavigationProps) => { + const workspace = useWorkspaceNavigation(); const projects = useLiveQuery((q) => q.from({ project: collection.projects }).select(({ project }) => ({ id: project.id, @@ -31,11 +40,12 @@ export const ProjectNavigation = ({ projectId }: ProjectNavigationProps) => { })), ).data.at(0); + const basePath = `/${workspace.slug}/projects`; if (projects.isLoading) { return ( }> - Projects + Projects
@@ -47,13 +57,12 @@ export const ProjectNavigation = ({ projectId }: ProjectNavigationProps) => { if (!activeProject) { return
Project not found
; } - return ( }> - Projects + Projects { items={projects.data.map((project) => ({ id: project.id, label: project.name, - href: `/projects/${project.id}`, + href: `${basePath}/${project.id}`, }))} shortcutKey="N" > -
{activeProject.name}
+
+ {activeProject.name} + +
diff --git a/apps/dashboard/app/(app)/projects/[projectId]/navigations/project-sub-navigation.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/navigations/project-sub-navigation.tsx similarity index 91% rename from apps/dashboard/app/(app)/projects/[projectId]/navigations/project-sub-navigation.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/navigations/project-sub-navigation.tsx index 6ce33b33e9..31a236ffec 100644 --- a/apps/dashboard/app/(app)/projects/[projectId]/navigations/project-sub-navigation.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/navigations/project-sub-navigation.tsx @@ -1,5 +1,6 @@ "use client"; +import { useWorkspaceNavigation } from "@/hooks/use-workspace-navigation"; import { cn } from "@/lib/utils"; import { Cloud, GridCircle, Layers3 } from "@unkey/icons"; import type { IconProps } from "@unkey/icons/src/props"; @@ -23,6 +24,7 @@ export const ProjectSubNavigation = ({ const router = useRouter(); const params = useParams(); const pathname = usePathname(); + const workspace = useWorkspaceNavigation(); const projectId = params?.projectId as string; const anchorRef = useRef(null); @@ -51,24 +53,25 @@ export const ProjectSubNavigation = ({ const activeTab = getCurrentTab(); + const basePath = `/${workspace.slug}/projects`; const tabs: TabItem[] = [ { id: "overview", label: "Overview", icon: GridCircle, - path: `/projects/${projectId}`, + path: `${basePath}/${projectId}`, }, { id: "deployments", label: "Deployments", icon: Cloud, - path: `/projects/${projectId}/deployments`, + path: `${basePath}/${projectId}/deployments`, }, { id: "gateway-logs", label: "Gateway Logs", icon: Layers3, - path: `/projects/${projectId}/gateway-logs`, + path: `${basePath}/${projectId}/gateway-logs`, }, ]; diff --git a/apps/dashboard/app/(app)/projects/[projectId]/page.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/page.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/[projectId]/page.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/page.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/controls/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/controls/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/controls/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/controls/index.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/create-project/create-project-dialog.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/create-project/create-project-dialog.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/create-project/create-project-dialog.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/create-project/create-project-dialog.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/hooks/use-projects-filters.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/hooks/use-projects-filters.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/hooks/use-projects-filters.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/hooks/use-projects-filters.ts diff --git a/apps/dashboard/app/(app)/projects/_components/list/index.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/index.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/list/index.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/index.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/list/project-actions.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/project-actions.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/list/project-actions.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/project-actions.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/list/projects-card-skeleton.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-card-skeleton.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/list/projects-card-skeleton.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-card-skeleton.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/list/projects-card.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-card.tsx similarity index 94% rename from apps/dashboard/app/(app)/projects/_components/list/projects-card.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-card.tsx index 15a80fd4fe..b19979c8a7 100644 --- a/apps/dashboard/app/(app)/projects/_components/list/projects-card.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-card.tsx @@ -1,3 +1,4 @@ +import { useWorkspaceNavigation } from "@/hooks/use-workspace-navigation"; import { CodeBranch, Cube, User } from "@unkey/icons"; import { InfoTooltip, Loading, TimestampInfo } from "@unkey/ui"; import Link from "next/link"; @@ -30,17 +31,20 @@ export const ProjectCard = ({ actions, projectId, }: ProjectCardProps) => { + const workspace = useWorkspaceNavigation(); const [isNavigating, setIsNavigating] = useState(false); const handleLinkClick = useCallback(() => { setIsNavigating(true); }, []); + const projectPath = `/${workspace.slug}/projects/${projectId}`; + return (
{/* Invisible base clickable layer - covers entire card */} Project Name*/} {name} diff --git a/apps/dashboard/app/(app)/projects/_components/list/projects-list.schema.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-list.schema.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/list/projects-list.schema.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-list.schema.ts diff --git a/apps/dashboard/app/(app)/projects/_components/list/region-badges.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/region-badges.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/list/region-badges.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/region-badges.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/list/repo-display.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/repo-display.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/list/repo-display.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/repo-display.tsx diff --git a/apps/dashboard/app/(app)/projects/_components/projects-filters.schema.ts b/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/projects-filters.schema.ts similarity index 100% rename from apps/dashboard/app/(app)/projects/_components/projects-filters.schema.ts rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/projects-filters.schema.ts diff --git a/apps/dashboard/app/(app)/projects/navigation.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/navigation.tsx similarity index 70% rename from apps/dashboard/app/(app)/projects/navigation.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/navigation.tsx index 4652fde4e6..5b66f4a7c9 100644 --- a/apps/dashboard/app/(app)/projects/navigation.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/projects/navigation.tsx @@ -1,13 +1,15 @@ "use client"; import { Navbar } from "@/components/navigation/navbar"; +import { useWorkspaceNavigation } from "@/hooks/use-workspace-navigation"; import { Cube } from "@unkey/icons"; import { CreateProjectDialog } from "./_components/create-project/create-project-dialog"; export function ProjectsListNavigation() { + const workspace = useWorkspaceNavigation(); return ( }> - + Projects diff --git a/apps/dashboard/app/(app)/projects/page.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/page.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/page.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/page.tsx diff --git a/apps/dashboard/app/(app)/projects/projects-client.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/projects/projects-client.tsx similarity index 100% rename from apps/dashboard/app/(app)/projects/projects-client.tsx rename to apps/dashboard/app/(app)/[workspaceSlug]/projects/projects-client.tsx diff --git a/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/namespace-navbar.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/namespace-navbar.tsx index cc398ece99..5ff7ca0240 100644 --- a/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/namespace-navbar.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/namespace-navbar.tsx @@ -86,7 +86,10 @@ export const NamespaceNavbar = ({ namespaceId, activePage }: NamespaceNavbarProp }))} shortcutKey="N" > -
{namespace?.name}
+
+ {namespace?.name} + +
diff --git a/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/navigation.tsx b/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/navigation.tsx index 5d5509b3c1..5b679625fb 100644 --- a/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/navigation.tsx +++ b/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/navigation.tsx @@ -1,13 +1,16 @@ "use client"; import { Navbar } from "@/components/navigation/navbar"; +import { useWorkspaceNavigation } from "@/hooks/use-workspace-navigation"; import { Gauge } from "@unkey/icons"; import { CreateNamespaceButton } from "./_components/create-namespace-button"; + export function Navigation() { + const workspace = useWorkspaceNavigation(); return ( }> - + Ratelimits diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/nested-nav-item.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/nested-nav-item.tsx index 79f5c2889d..39f5ee22c6 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/nested-nav-item.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/nested-nav-item.tsx @@ -60,28 +60,29 @@ export const NestedNavItem = ({ if (!hasChildren || !pathname) { return; } + const hasMatchingChild = item.items?.some( (subItem) => subItem.href === pathname || subItem.items?.some((child) => child.href === pathname), ); + // Only auto-open children if user hasn't manually collapsed them if (!childrenUserManuallyCollapsed) { - setIsChildrenOpen(!!hasMatchingChild); + setIsChildrenOpen(Boolean(hasMatchingChild)); } - if (typeof item.label === "string") { - const itemPath = `/${slugify(item.label, { - lower: true, - replacement: "-", - })}`; + + // Check if current pathname matches this item's href path + // item.href is already workspace-aware (e.g., "/workspace-slug/projects") + if (item.href && pathname.startsWith(item.href)) { // Only auto-open parent if user hasn't manually collapsed it AND not force collapsed - if (pathname.startsWith(itemPath) && !userManuallyCollapsed && !forceCollapsed) { + if (!userManuallyCollapsed && !forceCollapsed) { setIsOpen(true); } } }, [ pathname, item.items, - item.label, + item.href, hasChildren, userManuallyCollapsed, childrenUserManuallyCollapsed, diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-api-navigation.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-api-navigation.tsx index e64d186936..4014b95625 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-api-navigation.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-api-navigation.tsx @@ -31,21 +31,21 @@ export const useApiNavigation = (baseNavItems: NavItem[]) => { return data.pages.flatMap((page) => page.apiList.map((api) => { - const currentApiActive = segments.at(0) === "apis" && segments.at(1) === api.id; - const isExactlyApiRoot = currentApiActive && segments.length === 2; + const aIndex = segments.findIndex((s) => s === "apis"); + const currentApiActive = aIndex !== -1 && segments.at(aIndex + 1) === api.id; const settingsItem: NavItem = { icon: Gear, href: `/${workspace.slug}/apis/${api.id}/settings`, label: "Settings", - active: currentApiActive && segments.at(2) === "settings", + active: currentApiActive && segments.at(3) === "settings", }; const overviewItem: NavItem = { icon: ArrowOppositeDirectionY, href: `/${workspace.slug}/apis/${api.id}`, label: "Requests", - active: isExactlyApiRoot || (currentApiActive && !segments.at(2)), + active: currentApiActive && !segments.at(3), }; const subItems: NavItem[] = [overviewItem]; @@ -55,7 +55,7 @@ export const useApiNavigation = (baseNavItems: NavItem[]) => { icon: Key, href: `/${workspace.slug}/apis/${api.id}/keys/${api.keyspaceId}`, label: "Keys", - active: currentApiActive && segments.at(2) === "keys", + active: currentApiActive && segments.at(3) === "keys", }; subItems.push(keysItem); diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-projects-navigation.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-projects-navigation.tsx index 0afc7e7c3a..ca39012592 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-projects-navigation.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-projects-navigation.tsx @@ -1,5 +1,6 @@ "use client"; import type { NavItem } from "@/components/navigation/sidebar/workspace-navigations"; +import { useWorkspaceNavigation } from "@/hooks/use-workspace-navigation"; import { collection } from "@/lib/collections"; import { useLiveQuery } from "@tanstack/react-db"; import { useSelectedLayoutSegments } from "next/navigation"; @@ -7,20 +8,23 @@ import { useMemo } from "react"; export const useProjectNavigation = (baseNavItems: NavItem[]) => { const segments = useSelectedLayoutSegments() ?? []; + const workspace = useWorkspaceNavigation(); const { data, isLoading } = useLiveQuery((q) => q.from({ project: collection.projects }).orderBy(({ project }) => project.id, "desc"), ); + const basePath = `/${workspace.slug}/projects`; const projectNavItems = useMemo(() => { if (!data) { return []; } return data.map((project) => { - const currentProjectActive = segments.at(0) === "projects" && segments.at(1) === project.id; + const pIndex = segments.findIndex((s) => s === "projects"); + const currentProjectActive = pIndex !== -1 && segments.at(pIndex + 1) === project.id; const projectNavItem: NavItem = { - href: `/projects/${project.id}`, + href: `${basePath}/${project.id}`, icon: null, label: project.name, active: currentProjectActive, @@ -29,11 +33,11 @@ export const useProjectNavigation = (baseNavItems: NavItem[]) => { return projectNavItem; }); - }, [data, segments]); + }, [data, segments, basePath]); const enhancedNavItems = useMemo(() => { const items = [...baseNavItems]; - const projectsItemIndex = items.findIndex((item) => item.href === "/projects"); + const projectsItemIndex = items.findIndex((item) => item.href === basePath); if (projectsItemIndex !== -1) { const projectsItem = { ...items[projectsItemIndex] }; @@ -44,7 +48,7 @@ export const useProjectNavigation = (baseNavItems: NavItem[]) => { } return items; - }, [baseNavItems, projectNavItems]); + }, [baseNavItems, projectNavItems, basePath]); return { enhancedNavItems, diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx index add3c00592..c8a5f25f44 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx @@ -30,10 +30,8 @@ export const useRatelimitNavigation = (baseNavItems: NavItem[]) => { } return data.map((namespace) => { - const currentNamespaceActive = - segments.at(0) === "ratelimits" && segments.at(1) === namespace.id; - - const isExactlyRatelimitRoot = currentNamespaceActive && segments.length === 2; + const rIndex = segments.findIndex((s) => s === "ratelimits"); + const currentNamespaceActive = rIndex !== -1 && segments.at(rIndex + 1) === namespace.id; // Create sub-items for logs, settings, and overrides const subItems: NavItem[] = [ @@ -41,25 +39,25 @@ export const useRatelimitNavigation = (baseNavItems: NavItem[]) => { icon: ArrowOppositeDirectionY, href: `${basePath}/ratelimits/${namespace.id}`, label: "Requests", - active: isExactlyRatelimitRoot || (currentNamespaceActive && !segments.at(2)), + active: currentNamespaceActive && !segments.at(3), }, { icon: Layers3, href: `${basePath}/ratelimits/${namespace.id}/logs`, label: "Logs", - active: currentNamespaceActive && segments.at(2) === "logs", + active: currentNamespaceActive && segments.at(3) === "logs", }, { icon: Gear, href: `${basePath}/ratelimits/${namespace.id}/settings`, label: "Settings", - active: currentNamespaceActive && segments.at(2) === "settings", + active: currentNamespaceActive && segments.at(3) === "settings", }, { icon: ArrowDottedRotateAnticlockwise, href: `${basePath}/ratelimits/${namespace.id}/overrides`, label: "Overrides", - active: currentNamespaceActive && segments.at(2) === "overrides", + active: currentNamespaceActive && segments.at(3) === "overrides", }, ]; diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx index 459c1e7e84..fb31d59242 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx @@ -56,7 +56,7 @@ export function AppSidebar({ // Get the current solo mode type based on the route const currentSoloModeType = useMemo(() => { - const firstSegment = segments.at(0) ?? ""; + const firstSegment = segments.at(1) ?? ""; return Object.entries(SOLO_MODE_CONFIG).find( ([_, config]) => config.routeSegment === firstSegment, )?.[0] as SoloModeType | undefined; diff --git a/apps/dashboard/components/navigation/sidebar/workspace-navigations.tsx b/apps/dashboard/components/navigation/sidebar/workspace-navigations.tsx index 680380d591..bba11a9c66 100644 --- a/apps/dashboard/components/navigation/sidebar/workspace-navigations.tsx +++ b/apps/dashboard/components/navigation/sidebar/workspace-navigations.tsx @@ -46,14 +46,14 @@ export const createWorkspaceNavigation = (segments: string[], workspace: Workspa icon: Nodes, href: `${basePath}/apis`, label: "APIs", - active: segments.at(0) === "apis", + active: segments.at(1) === "apis", showSubItems: false, }, { icon: Cube, - href: "/projects", + href: `${basePath}/projects`, label: "Projects", - active: segments.at(0) === "projects", + active: segments.at(1) === "projects", hidden: !workspace?.betaFeatures.deployments, tag: , }, @@ -61,7 +61,7 @@ export const createWorkspaceNavigation = (segments: string[], workspace: Workspa icon: Gauge, href: `${basePath}/ratelimits`, label: "Ratelimit", - active: segments.at(0) === "ratelimits", + active: segments.at(1) === "ratelimits", }, { icon: ShieldKey, @@ -88,26 +88,26 @@ export const createWorkspaceNavigation = (segments: string[], workspace: Workspa icon: InputSearch, href: `${basePath}/audit`, label: "Audit Log", - active: segments.at(0) === "audit", + active: segments.at(1) === "audit", }, { icon: Grid, href: "/monitors/verifications", label: "Monitors", - active: segments.at(0) === "verifications", + active: segments.at(1) === "verifications", hidden: !workspace?.features.webhooks, }, { icon: Layers3, href: `${basePath}/logs`, label: "Logs", - active: segments.at(0) === "logs", + active: segments.at(1) === "logs", }, { icon: Sparkle3, href: "/success", label: "Success", - active: segments.at(0) === "success", + active: segments.at(1) === "success", tag: , hidden: !workspace?.features.successPage, }, @@ -115,14 +115,14 @@ export const createWorkspaceNavigation = (segments: string[], workspace: Workspa icon: Fingerprint, href: `${basePath}/identities`, label: "Identities", - active: segments.at(0) === "identities", + active: segments.at(1) === "identities", hidden: !workspace?.betaFeatures.identities, }, { icon: Gear, href: `${basePath}/settings/general`, label: "Settings", - active: segments.at(0) === "settings", + active: segments.at(1) === "settings", items: [ { icon: null, diff --git a/apps/dashboard/lib/trpc/routers/deploy/deployment/llm-search/utils.ts b/apps/dashboard/lib/trpc/routers/deploy/deployment/llm-search/utils.ts index e63222656e..7dd3277e83 100644 --- a/apps/dashboard/lib/trpc/routers/deploy/deployment/llm-search/utils.ts +++ b/apps/dashboard/lib/trpc/routers/deploy/deployment/llm-search/utils.ts @@ -1,7 +1,7 @@ import { deploymentListFilterFieldConfig, deploymentListFilterOutputSchema, -} from "@/app/(app)/projects/[projectId]/deployments/filters.schema"; +} from "@/app/(app)/[workspaceSlug]/projects/[projectId]/deployments/filters.schema"; import { TRPCError } from "@trpc/server"; import type OpenAI from "openai"; import { zodResponseFormat } from "openai/helpers/zod.mjs"; diff --git a/apps/dashboard/lib/trpc/routers/deploy/envs/list.ts b/apps/dashboard/lib/trpc/routers/deploy/envs/list.ts index c9798848a5..4d1438e920 100644 --- a/apps/dashboard/lib/trpc/routers/deploy/envs/list.ts +++ b/apps/dashboard/lib/trpc/routers/deploy/envs/list.ts @@ -1,4 +1,4 @@ -import { envVarSchema } from "@/app/(app)/projects/[projectId]/details/env-variables-section/types"; +import { envVarSchema } from "@/app/(app)/[workspaceSlug]/projects/[projectId]/details/env-variables-section/types"; import { ratelimit, requireUser, requireWorkspace, t, withRatelimit } from "@/lib/trpc/trpc"; import { z } from "zod";