Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8f4e70f
feat(service): add service navigation tabs and routes for service ove…
RemiBonnet Feb 18, 2026
d9ab9ec
feat(service-overview): init new view
RemiBonnet Feb 23, 2026
de66ab5
refactor(service-overview): update service overview component with ob…
RemiBonnet Feb 24, 2026
d876ccd
delete(pod-statuses-callout): remove PodStatusesCallout component and…
RemiBonnet Feb 24, 2026
e9e4cad
fix(service-instance): adjust margin for job execution info display
RemiBonnet Feb 24, 2026
be0f406
remove(pod-statuses-callout): eliminate export of PodStatusesCallout …
RemiBonnet Feb 24, 2026
7a51ce2
refactor(routeTree): streamline route imports and remove unused refer…
RemiBonnet Feb 24, 2026
9f37ac3
refactor(components): update snapshot styles and improve UI consistency
RemiBonnet Feb 24, 2026
2605c02
refactor(routes): enhance route imports and improve service parameter…
RemiBonnet Feb 24, 2026
34d6913
fix(instance-metrics): update snapshot styles for improved table layout
RemiBonnet Feb 24, 2026
7db68c2
refactor(tables): update snapshot styles for improved visual consistency
RemiBonnet Feb 24, 2026
ce2996b
refactor(application-settings): integrate environment prop and clean …
RemiBonnet Feb 24, 2026
b523050
feat(service-overview): integrate NeedRedeployFlag into ServiceOvervi…
RemiBonnet Feb 25, 2026
e82b3b6
refactor(service-overview): restructure ServiceOverview layout and im…
RemiBonnet Feb 25, 2026
5e6c702
feat(hooks): add suspense option to deployment history and service hooks
RemiBonnet Feb 25, 2026
d0fbb51
refactor(use-last-deployed-commit): simplify props and enhance commit…
RemiBonnet Feb 25, 2026
e6713a9
refactor(page-general-feature): remove unused PageGeneralFeature and …
RemiBonnet Feb 25, 2026
65c8355
feat(service-overview): implement ServiceOverviewSkeleton and enhance…
RemiBonnet Feb 25, 2026
855fb69
fix(instance-metrics): update snapshot text for service status clarity
RemiBonnet Feb 25, 2026
ce3167e
fix(last-commit-author): enhance author name display logic
RemiBonnet Feb 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions apps/console-v5/src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ import { Route as AuthenticatedOrganizationOrganizationIdOverviewRouteImport } f
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdDeploymentsRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/deployments'
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/index'
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/overview'
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/index'
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview'
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/danger-zone'
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDeploymentRulesRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/deployment-rules'
import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general'
Expand Down Expand Up @@ -522,6 +524,22 @@ const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironm
getParentRoute: () =>
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute,
} as any)
const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute =
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRouteImport.update(
{
id: '/project/$projectId/environment/$environmentId/service/$serviceId/',
path: '/project/$projectId/environment/$environmentId/service/$serviceId/',
getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute,
} as any
)
const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute =
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRouteImport.update(
{
id: '/project/$projectId/environment/$environmentId/service/$serviceId/overview',
path: '/project/$projectId/environment/$environmentId/service/$serviceId/overview',
getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute,
} as any
)

export interface FileRoutesByFullPath {
'/': typeof IndexRoute
Expand Down Expand Up @@ -597,6 +615,8 @@ export interface FileRoutesByFullPath {
'/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/settings/preview-environments': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsPreviewEnvironmentsRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/settings/': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsIndexRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
Expand Down Expand Up @@ -664,6 +684,8 @@ export interface FileRoutesByTo {
'/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/settings/preview-environments': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsPreviewEnvironmentsRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/settings': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsIndexRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute
'/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
Expand Down Expand Up @@ -741,6 +763,8 @@ export interface FileRoutesById {
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRoute
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/preview-environments': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsPreviewEnvironmentsRoute
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsIndexRoute
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/': typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
Expand Down Expand Up @@ -818,6 +842,8 @@ export interface FileRouteTypes {
| '/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/settings/preview-environments'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/settings/'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
Expand Down Expand Up @@ -885,6 +911,8 @@ export interface FileRouteTypes {
| '/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/settings/preview-environments'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/settings'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview'
| '/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId'
id:
| '__root__'
| '/'
Expand Down Expand Up @@ -961,6 +989,8 @@ export interface FileRouteTypes {
| '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general'
| '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/preview-environments'
| '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/'
| '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview'
| '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
Expand Down Expand Up @@ -1490,6 +1520,20 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDangerZoneRouteImport
parentRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute
}
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/': {
id: '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/'
path: '/project/$projectId/environment/$environmentId/service/$serviceId'
fullPath: '/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId'
preLoaderRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRouteImport
parentRoute: typeof AuthenticatedOrganizationOrganizationIdRouteRoute
}
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview': {
id: '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview'
path: '/project/$projectId/environment/$environmentId/service/$serviceId/overview'
fullPath: '/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview'
preLoaderRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRouteImport
parentRoute: typeof AuthenticatedOrganizationOrganizationIdRouteRoute
}
}
}

Expand Down Expand Up @@ -1709,6 +1753,8 @@ interface AuthenticatedOrganizationOrganizationIdRouteRouteChildren {
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdOverviewRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdOverviewRoute
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRoute
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRoute
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute: typeof AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute
}

const AuthenticatedOrganizationOrganizationIdRouteRouteChildren: AuthenticatedOrganizationOrganizationIdRouteRouteChildren =
Expand Down Expand Up @@ -1752,6 +1798,10 @@ const AuthenticatedOrganizationOrganizationIdRouteRouteChildren: AuthenticatedOr
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRoute,
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRoute:
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRoute,
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute:
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdOverviewRoute,
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute:
AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdServiceServiceIdIndexRoute,
}

const AuthenticatedOrganizationOrganizationIdRouteRouteWithChildren =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Navigate, createFileRoute, useParams } from '@tanstack/react-router'

export const Route = createFileRoute(
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/'
)({
component: RouteComponent,
})

function RouteComponent() {
const { organizationId = '', projectId = '', environmentId = '', serviceId = '' } = useParams({ strict: false })

return (
<Navigate
to="/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview"
params={{ organizationId, projectId, environmentId, serviceId }}
replace
/>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { createFileRoute, useParams } from '@tanstack/react-router'
import { memo, useMemo } from 'react'
import { match } from 'ts-pattern'
import { useCluster } from '@qovery/domains/clusters/feature'
import { useEnvironment } from '@qovery/domains/environments/feature'
import { EnableObservabilityModal } from '@qovery/domains/observability/feature'
import { TerraformResourcesSection } from '@qovery/domains/service-terraform/feature'
import { ObservabilityCallout, ServiceOverview } from '@qovery/domains/services/feature'
import { useService } from '@qovery/domains/services/feature'
import { MetricsWebSocketListener } from '@qovery/shared/util-web-sockets'

export const Route = createFileRoute(
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview'
)({
component: RouteComponent,
})

const WebSocketListenerMemo = memo(MetricsWebSocketListener)

function RouteComponent() {
const { organizationId = '', environmentId = '', serviceId = '' } = useParams({ strict: false })

const { data: service } = useService({ environmentId, serviceId })
const { data: environment } = useEnvironment({ environmentId })
const { data: cluster } = useCluster({ organizationId, clusterId: environment?.cluster_id ?? '' })

const hasNoMetrics = useMemo(
() =>
(cluster?.cloud_provider === 'AWS' ||
cluster?.cloud_provider === 'SCW' ||
cluster?.cloud_provider === 'GCP' ||
cluster?.cloud_provider === 'AZURE') &&
!cluster?.metrics_parameters?.enabled &&
match(service?.serviceType)
.with('APPLICATION', 'CONTAINER', () => true)
.otherwise(() => false),
[cluster?.metrics_parameters?.enabled, service?.serviceType, cluster?.cloud_provider]
)

return (
<>
<ServiceOverview
environment={environment}
terraformResourcesSection={serviceId ? <TerraformResourcesSection terraformId={serviceId} /> : undefined}
hasNoMetrics={hasNoMetrics}
observabilityCallout={
<ObservabilityCallout>
<EnableObservabilityModal />
</ObservabilityCallout>
}
/>
{environment && service?.serviceType && (
<WebSocketListenerMemo
organizationId={environment.organization.id}
clusterId={environment.cluster_id}
projectId={environment.project.id}
environmentId={environment.id}
serviceId={serviceId}
serviceType={service?.serviceType}
/>
)}
</>
)
}
52 changes: 52 additions & 0 deletions apps/console-v5/src/routes/_authenticated/organization/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,51 @@ const ENVIRONMENT_TABS: NavigationTab[] = [
},
]

const SERVICE_TABS: NavigationTab[] = [
{
id: 'overview',
label: 'Overview',
iconName: 'table-layout',
routeId:
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/overview',
},
{
id: 'deployment',
label: 'Deployment',
iconName: 'rocket',
routeId:
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/deployment',
},
{
id: 'monitoring',
label: 'Monitoring',
iconName: 'chart-column',
routeId:
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/monitoring',
},
{
id: 'service-logs',
label: 'Service Logs',
iconName: 'scroll',
routeId:
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/service-logs',
},
{
id: 'variables',
label: 'Variables',
iconName: 'key',
routeId:
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/variables',
},
{
id: 'settings',
label: 'Settings',
iconName: 'gear-complex',
routeId:
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId/settings',
},
]

function createRoutePatternRegex(routeIdPattern: string): RegExp {
const patternPath = routeIdPattern.replace('/_authenticated/organization', '/organization')
return new RegExp('^' + patternPath.replace(/\$(\w+)/g, '[^/]+') + '(/.*)?$')
Expand All @@ -156,6 +201,13 @@ const NAVIGATION_CONTEXTS: Array<{
tabs: NavigationTab[]
paramNames: string[]
}> = [
{
type: 'service',
routeIdPattern:
'/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/service/$serviceId',
tabs: SERVICE_TABS,
paramNames: ['organizationId', 'projectId', 'environmentId', 'serviceId'],
},
{
type: 'environment',
routeIdPattern: '/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId',
Expand Down
Loading