mirror of
https://github.com/supabase/supabase.git
synced 2026-09-22 13:37:53 +08:00
db0e6b761b
## Context
As per PR title - we're bringing Database Connections out of feature
preview and it'll live on the dashboard by default 🙂
Also deprecating the existing Ongoing queries panel which Database
Connections now supercedes.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Database Connections is now available without feature-preview
activation.
* The SQL editor’s “View running queries” option now links directly to
Database Connections.
* **Bug Fixes**
* Query cancellation and session termination now refresh database
activity data.
* **Removed**
* Removed the in-editor ongoing queries panel and its termination
controls.
* Removed the Database Connections promotional banner, preview
messaging, settings, and related telemetry.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
210 lines
5.7 KiB
TypeScript
210 lines
5.7 KiB
TypeScript
import { useFlag, useParams } from 'common'
|
|
import { useRouter } from 'next/router'
|
|
import { useMemo } from 'react'
|
|
|
|
import { useSupamonitorStatus } from '@/components/interfaces/QueryPerformance/hooks/useSupamonitorStatus'
|
|
import { useContentQuery, type Content, type ContentBase } from '@/data/content/content-query'
|
|
import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
|
|
import { IS_PLATFORM } from '@/lib/constants'
|
|
import { SHORTCUT_IDS, type ShortcutId } from '@/state/shortcuts/registry'
|
|
import { type Dashboards } from '@/types'
|
|
|
|
interface ObservabilityMenuItem {
|
|
name: string
|
|
key: string
|
|
url: string
|
|
shortcutId?: ShortcutId
|
|
}
|
|
|
|
export interface ObservabilityMenuSection {
|
|
title: string
|
|
key: string
|
|
items: ObservabilityMenuItem[]
|
|
}
|
|
|
|
const usePreservedQueryParams = () => {
|
|
const router = useRouter()
|
|
|
|
// Preserve date range query parameters when navigating
|
|
const preservedQueryParams = useMemo(() => {
|
|
const { its, ite, isHelper, helperText } = router.query
|
|
const params = new URLSearchParams()
|
|
|
|
if (its && typeof its === 'string') params.set('its', its)
|
|
if (ite && typeof ite === 'string') params.set('ite', ite)
|
|
if (isHelper && typeof isHelper === 'string') params.set('isHelper', isHelper)
|
|
if (helperText && typeof helperText === 'string') params.set('helperText', helperText)
|
|
|
|
const queryString = params.toString()
|
|
return queryString ? `?${queryString}` : ''
|
|
}, [router.query])
|
|
|
|
return preservedQueryParams
|
|
}
|
|
|
|
export const useGenerateObservabilityMenu = () => {
|
|
const { ref } = useParams()
|
|
const preservedQueryParams = usePreservedQueryParams()
|
|
const { isSupamonitorEnabled } = useSupamonitorStatus()
|
|
|
|
const showOverview = useFlag('observabilityOverview')
|
|
const storageSupported = useIsFeatureEnabled('project_storage:all')
|
|
|
|
const baseUrl = `/project/${ref}/observability`
|
|
|
|
const generalItems: ObservabilityMenuItem[] = [
|
|
...(showOverview
|
|
? [
|
|
{
|
|
name: 'Overview',
|
|
key: 'observability',
|
|
url: `${baseUrl}${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_OVERVIEW,
|
|
},
|
|
]
|
|
: []),
|
|
...(isSupamonitorEnabled
|
|
? [
|
|
{
|
|
name: 'Query Insights',
|
|
key: 'query-insights',
|
|
url: `${baseUrl}/query-insights${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_QUERY_PERFORMANCE,
|
|
},
|
|
]
|
|
: [
|
|
{
|
|
name: 'Query Performance',
|
|
key: 'query-performance',
|
|
url: `${baseUrl}/query-performance${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_QUERY_PERFORMANCE,
|
|
},
|
|
]),
|
|
...(IS_PLATFORM
|
|
? [
|
|
{
|
|
name: 'API Gateway',
|
|
key: 'api-overview',
|
|
url: `${baseUrl}/api-overview${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_API_GATEWAY,
|
|
},
|
|
]
|
|
: []),
|
|
{
|
|
name: 'Database Connections',
|
|
key: 'connections',
|
|
url: `${baseUrl}/connections`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_CONNECTIONS,
|
|
},
|
|
]
|
|
|
|
const productItems: ObservabilityMenuItem[] = [
|
|
{
|
|
name: 'Database',
|
|
key: 'database',
|
|
url: `${baseUrl}/database${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_DATABASE,
|
|
},
|
|
{
|
|
name: 'Data API',
|
|
key: 'postgrest',
|
|
url: `${baseUrl}/postgrest${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_DATA_API,
|
|
},
|
|
{
|
|
name: 'Auth',
|
|
key: 'auth',
|
|
url: `${baseUrl}/auth${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_AUTH,
|
|
},
|
|
{
|
|
name: 'Edge Functions',
|
|
key: 'edge-functions',
|
|
url: `${baseUrl}/edge-functions${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_FUNCTIONS,
|
|
},
|
|
...(storageSupported
|
|
? [
|
|
{
|
|
name: 'Storage',
|
|
key: 'storage',
|
|
url: `${baseUrl}/storage${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_STORAGE,
|
|
},
|
|
]
|
|
: []),
|
|
{
|
|
name: 'Realtime',
|
|
key: 'realtime',
|
|
url: `${baseUrl}/realtime${preservedQueryParams}`,
|
|
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY_REALTIME,
|
|
},
|
|
]
|
|
|
|
const sections: ObservabilityMenuSection[] = [
|
|
{
|
|
title: 'GENERAL',
|
|
key: 'general-section',
|
|
items: generalItems,
|
|
},
|
|
]
|
|
|
|
if (IS_PLATFORM) {
|
|
sections.push({
|
|
title: 'PRODUCT',
|
|
key: 'product-section',
|
|
items: productItems,
|
|
})
|
|
}
|
|
|
|
return sections
|
|
}
|
|
|
|
function isReportContent(c: Content): c is ContentBase & {
|
|
type: 'report'
|
|
content: Dashboards.Content
|
|
} {
|
|
return c.type === 'report'
|
|
}
|
|
|
|
export const useGenerateCustomReportsMenu = () => {
|
|
const { ref } = useParams()
|
|
const preservedQueryParams = usePreservedQueryParams()
|
|
|
|
const { data: content, isPending: isLoading } = useContentQuery({
|
|
projectRef: ref,
|
|
type: 'report',
|
|
})
|
|
|
|
function getReportMenuItems() {
|
|
if (!content) return []
|
|
|
|
const reports = content?.content.filter(isReportContent)
|
|
|
|
const sortedReports = reports?.sort((a, b) => {
|
|
if (a.name < b.name) {
|
|
return -1
|
|
}
|
|
if (a.name > b.name) {
|
|
return 1
|
|
}
|
|
return 0
|
|
})
|
|
|
|
const reportMenuItems = sortedReports.map((r, idx) => ({
|
|
id: r.id,
|
|
name: r.name,
|
|
description: r.description || '',
|
|
key: r.id || idx + '-report',
|
|
url: `/project/${ref}/observability/${r.id}${preservedQueryParams}`,
|
|
hasDropdownActions: true,
|
|
report: r,
|
|
}))
|
|
|
|
return reportMenuItems
|
|
}
|
|
|
|
const data = getReportMenuItems()
|
|
return { data, isLoading }
|
|
}
|