diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogsBanner.tsx b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogsBanner.tsx
new file mode 100644
index 00000000000..15cc4bcba18
--- /dev/null
+++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogsBanner.tsx
@@ -0,0 +1,63 @@
+import { CircleHelpIcon, Undo2 } from 'lucide-react'
+import { Button, cn } from 'ui'
+
+import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
+
+interface UnifiedLogsBannerProps {
+ variant: 'promo' | 'utility'
+ onEnable?: () => void
+ onMoreInfo?: () => void
+ onSwitchBack?: () => void
+ className?: string
+}
+
+export function UnifiedLogsBanner({
+ variant,
+ onEnable,
+ onMoreInfo,
+ onSwitchBack,
+ className,
+}: UnifiedLogsBannerProps) {
+ const stripClassName = cn(
+ 'flex items-center justify-between gap-3 border-b border-border px-4 py-3',
+ className
+ )
+
+ if (variant === 'utility') {
+ return (
+
+
+
Go back to old logs
+
Use the traditional interface
+
+
}
+ onClick={onSwitchBack}
+ tooltip={{ content: { side: 'bottom', text: 'Switch back' } }}
+ />
+
+ )
+ }
+
+ return (
+
+
+ Try Unified Logs
+
+
+
+ }
+ onClick={onMoreInfo}
+ tooltip={{ content: { side: 'bottom', text: 'More information' } }}
+ />
+
+
+ )
+}
diff --git a/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx b/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx
index 36176eb3da8..9d2af4613f3 100644
--- a/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx
+++ b/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx
@@ -25,7 +25,7 @@ const LogsLayout = ({ title, children }: PropsWithChildren) =>
if (!logsEnabled) {
return (
-
+
)
@@ -33,14 +33,12 @@ const LogsLayout = ({ title, children }: PropsWithChildren) =>
if (!canUseLogsExplorer) {
if (isLoading) {
- return (
-
- )
+ return
}
if (!isLoading && !canUseLogsExplorer) {
return (
-
+
)
@@ -49,7 +47,7 @@ const LogsLayout = ({ title, children }: PropsWithChildren) =>
return (
}
>
diff --git a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx
index b2daa4da0f3..d2d135e867d 100644
--- a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx
+++ b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx
@@ -1,5 +1,5 @@
import { IS_PLATFORM, useFlag, useParams } from 'common'
-import { ChevronRight, CircleHelpIcon, Plus } from 'lucide-react'
+import { ChevronRight, Plus } from 'lucide-react'
import Link from 'next/link'
import { useRouter } from 'next/router'
import React, { useState } from 'react'
@@ -29,7 +29,7 @@ import { useIsETLPrivateAlpha } from '@/components/interfaces/Database/Replicati
import { LOG_DRAIN_TYPES } from '@/components/interfaces/LogDrains/LogDrains.constants'
import SavedQueriesItem from '@/components/interfaces/Settings/Logs/Logs.SavedQueriesItem'
import { LogsSidebarItem } from '@/components/interfaces/Settings/Logs/SidebarV2/SidebarItem'
-import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
+import { UnifiedLogsBanner } from '@/components/interfaces/UnifiedLogs/UnifiedLogsBanner'
import { useContentQuery } from '@/data/content/content-query'
import { useReplicationSourcesQuery } from '@/data/replication/sources-query'
import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements'
@@ -241,32 +241,13 @@ export function LogsSidebarMenuV2() {
/>
)}
{isUnifiedLogsEligible && (
- New}
- actions={
- <>
-
- }
- onClick={() => selectFeaturePreview('supabase-ui-preview-unified-logs')}
- tooltip={{ content: { side: 'bottom', text: 'More information' } }}
- />
- >
- }
+ {
+ enableUnifiedLogs()
+ router.push(`/project/${ref}/logs`)
+ }}
+ onMoreInfo={() => selectFeaturePreview('supabase-ui-preview-unified-logs')}
/>
)}
diff --git a/apps/studio/components/ui/DataTable/FilterSideBar.tsx b/apps/studio/components/ui/DataTable/FilterSideBar.tsx
index e4297f5a50b..6ed57d3e663 100644
--- a/apps/studio/components/ui/DataTable/FilterSideBar.tsx
+++ b/apps/studio/components/ui/DataTable/FilterSideBar.tsx
@@ -1,10 +1,9 @@
-import { LOCAL_STORAGE_KEYS, useParams } from 'common'
+import { useParams } from 'common'
import Link from 'next/link'
import { useRouter } from 'next/router'
import React, { useEffect, type ReactNode } from 'react'
-import { Button, cn, ResizablePanel, usePanelRef } from 'ui'
+import { Badge, Button, cn, ResizablePanel, usePanelRef } from 'ui'
-import { FeaturePreviewBadge } from '../FeaturePreviewBadge'
import { FeaturePreviewSidebarPanel } from '../FeaturePreviewSidebarPanel'
import { DateRangeDisabled } from './DataTable.types'
import { DataTableFilterControls } from './DataTableFilters/DataTableFilterControls'
@@ -12,6 +11,7 @@ import { DataTableResetButton } from './DataTableResetButton'
import { useDataTable } from './providers/DataTableProvider'
import { useUnifiedLogsPreview } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
import { LOG_DRAIN_TYPES } from '@/components/interfaces/LogDrains/LogDrains.constants'
+import { UnifiedLogsBanner } from '@/components/interfaces/UnifiedLogs/UnifiedLogsBanner'
interface FilterSideBarProps {
isFilterBarOpen: boolean
@@ -30,11 +30,7 @@ export function FilterSideBar({
const { ref } = useParams()
const { table } = useDataTable()
- const {
- disable: disableUnifiedLogs,
- isEligible: isUnifiedLogsEligible,
- isEnabled: isUnifiedLogsEnabled,
- } = useUnifiedLogsPreview()
+ const { disable: disableUnifiedLogs, isEligible: isUnifiedLogsEligible } = useUnifiedLogsPreview()
const handleGoBackToOldLogs = () => {
disableUnifiedLogs()
@@ -70,29 +66,19 @@ export function FilterSideBar({
>
-
Logs
+
+
Logs
+ {isUnifiedLogsEligible &&
Beta}
+
{table.getState().columnFilters.length ?
: null}
+ {isUnifiedLogsEligible && (
+
+ )}
+
- {isUnifiedLogsEligible && (
-
- ) : undefined
- }
- actions={
-
- }
- />
- )}
{afterFilters}
{
*/
await page.goto(toUrl(`/project/${ref}/logs/${logPage.route}`))
- await expect(page.getByRole('heading', { name: 'Logs & Analytics' }), {
- message: 'Logs & Analytics heading should be visible',
+ await expect(page.getByRole('heading', { name: 'Logs', exact: true }), {
+ message: 'Logs heading should be visible',
}).toBeVisible()
/**