diff --git a/apps/studio/components/interfaces/Database/Replication/ComingSoon.tsx b/apps/studio/components/interfaces/Database/Replication/ComingSoon.tsx index 03fe8f53b0c..54709f07004 100644 --- a/apps/studio/components/interfaces/Database/Replication/ComingSoon.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ComingSoon.tsx @@ -1,3 +1,4 @@ +import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import Table from 'components/to-be-cleaned/Table' import { motion } from 'framer-motion' import { BASE_PATH } from 'lib/constants' @@ -62,6 +63,14 @@ const STATIC_EDGES = [ { id: 'e1-4', source: '1', target: '4', type: 'smoothstep', animated: true }, ] +export const ReplicationComingSoon = () => { + return ( + + + + ) +} + const ReplicationStaticMockup = () => { const nodes = useMemo(() => STATIC_NODES, []) const edges = useMemo(() => STATIC_EDGES, []) @@ -108,16 +117,6 @@ const ReplicationStaticMockup = () => { ) } -const ReplicationComingSoon = () => { - return ( - - - - ) -} - -export default ReplicationComingSoon - const PrimaryNode = ({ data, }: { @@ -251,58 +250,68 @@ const StaticDestinations = () => { return ( <> -
-
-
-
- - -
- -
- Name, - Publication, - Lag, - Status, - , - ]} - className="mt-4" - body={mockRows.map((row, i) => ( - - {row.name} - - - All - {row.tables} tables - - - {row.lag} - - - - {row.status} - - - - - - - ))} - /> +
+
+ + + +
+
+
+ + +
+ +
+
Name, + Publication, + Lag, + Status, + , + ]} + className="mt-4" + body={mockRows.map((row, i) => ( + + {row.name} + + + All + {row.tables} tables + + + {row.lag} + + + + {row.status} + + + + + + + ))} + /> + + + ) diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx index 6960f354890..75cd013e93d 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx @@ -136,10 +136,11 @@ export const DestinationRow = ({ )} -
+
{pipeline && ( } onClick={() => onSelectPipeline?.(pipeline.id, destinationName)} className="px-1.5" diff --git a/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx b/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx index b9b63273e34..d8013eedae0 100644 --- a/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx +++ b/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx @@ -55,8 +55,8 @@ export const PipelineStatus = ({ Failed
- -

{getPipelineStateMessages(requestStatus, 'failed').message}

+ + {getPipelineStateMessages(requestStatus, 'failed').message} ) @@ -165,9 +165,7 @@ export const PipelineStatus = ({ {statusConfig.label}
- -

{statusConfig.tooltip}

-
+ {statusConfig.tooltip} )} diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus.tsx index 6c5fdc4a68f..ae4e554a6da 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus.tsx @@ -18,7 +18,6 @@ import { useParams } from 'common' import Table from 'components/to-be-cleaned/Table' import AlertError from 'components/ui/AlertError' import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InlineLink } from 'components/ui/InlineLink' import { useReplicationPipelineByIdQuery } from 'data/replication/pipeline-by-id-query' import { useReplicationPipelineReplicationStatusQuery } from 'data/replication/pipeline-replication-status-query' import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' @@ -28,7 +27,16 @@ import { PipelineStatusRequestStatus, usePipelineRequestStatus, } from 'state/replication-pipeline-request-status' -import { Badge, Button, cn, copyToClipboard, Input_Shadcn_ } from 'ui' +import { + Badge, + Button, + cn, + copyToClipboard, + Input_Shadcn_, + Tooltip, + TooltipContent, + TooltipTrigger, +} from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import { getPipelineStateMessages, getStatusName, PIPELINE_ERROR_MESSAGES } from './Pipeline.utils' import { PipelineStatus } from './PipelineStatus' @@ -298,7 +306,6 @@ export const ReplicationPipelineStatus = ({ requestStatus={requestStatus} /> -

Table replication status

@@ -314,6 +321,14 @@ export const ReplicationPipelineStatus = ({ onChange={(e) => setFilterString(e.target.value)} />
+ @@ -358,39 +373,31 @@ export const ReplicationPipelineStatus = ({ )} - {/* Pipeline not running state */} - {showDisabledState && hasTableData && ( -
-
-
-
-
{config.icon}
-
-
-

{config.title}

-

{config.message}

+ {hasTableData && ( +
+ {showDisabledState && ( +
+
+
+
{config.icon}
+
+
+

{config.title}

+

{config.message}

+
- {['stopped', 'started'].includes(statusName ?? '') && ( - - )} -
+ )}
, ]} - body={filteredTableStatuses.map((table: TableState, index: number) => ( - - - - {table.table_name} - - - - - Not Available - - - -
- Status unavailable while pipeline is {config.badge.toLowerCase()} -
-
- - } - className="px-1.5" - disabled - tooltip={{ - content: { - side: 'bottom', - text: `Copy unavailable while pipeline is ${config.badge.toLowerCase()}`, - }, - }} - /> - -
- ))} - /> - - - )} - - {/* Tables list - active/running pipeline */} - {showActiveTable && !isStatusLoading && hasTableData && ( -
-
Table, - Status, - Details, - - Actions - , - ]} - body={filteredTableStatuses.map((table: TableState, index: number) => { - const statusConfig = getStatusConfig(table.state) - return ( - - - - {table.table_name} - - - {statusConfig.badge} - -
-
{statusConfig.description}
- {'lag' in table.state && ( -
- Lag: {table.state.lag}ms + body={filteredTableStatuses.map((table: TableState, index: number) => { + const statusConfig = getStatusConfig(table.state) + return ( + + +
+

{table.table_name}

+ + + + + + + Open in Table Editor + +
+
+ + {showDisabledState ? ( + Not Available + ) : ( + statusConfig.badge + )} + + + {showDisabledState ? ( +

+ Status unavailable while pipeline is {config.badge.toLowerCase()} +

+ ) : ( +
+
{statusConfig.description}
+ {'lag' in table.state && ( +
+ Lag: {table.state.lag}ms +
+ )}
)} -
- - - } - className="px-1.5" - onClick={() => handleCopyTableStatus(table.table_name, table.state)} - tooltip={{ - content: { - side: 'bottom', - text: 'Copy status details', - }, - }} - /> - - - ) - })} - /> + + + } + className="px-1.5" + disabled={showDisabledState} + onClick={() => handleCopyTableStatus(table.table_name, table.state)} + tooltip={{ + content: { + side: 'bottom', + text: showDisabledState + ? `Copy unavailable while pipeline is ${config.badge.toLowerCase()}` + : 'Copy status details', + }, + }} + /> + + + ) + })} + /> +
)} diff --git a/apps/studio/pages/project/[ref]/database/replication/index.tsx b/apps/studio/pages/project/[ref]/database/replication/index.tsx index 033c0b38551..bc1a2a5445a 100644 --- a/apps/studio/pages/project/[ref]/database/replication/index.tsx +++ b/apps/studio/pages/project/[ref]/database/replication/index.tsx @@ -1,4 +1,6 @@ -import ReplicationComingSoon from 'components/interfaces/Database/Replication/ComingSoon' +import { useState } from 'react' + +import { ReplicationComingSoon } from 'components/interfaces/Database/Replication/ComingSoon' import { Destinations } from 'components/interfaces/Database/Replication/Destinations' import { ReplicationPipelineStatus } from 'components/interfaces/Database/Replication/ReplicationPipelineStatus' import DatabaseLayout from 'components/layouts/DatabaseLayout/DatabaseLayout' @@ -6,7 +8,6 @@ import DefaultLayout from 'components/layouts/DefaultLayout' import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import { FormHeader } from 'components/ui/Forms/FormHeader' import { useFlag } from 'hooks/ui/useFlag' -import { useState } from 'react' import { PipelineRequestStatusProvider } from 'state/replication-pipeline-request-status' import type { NextPageWithLayout } from 'types' @@ -51,14 +52,16 @@ const DatabaseReplicationPage: NextPageWithLayout = () => { ) : ( - - -
- - -
-
-
+ <> + + +
+ +
+
+
+ + )} ) diff --git a/apps/studio/styles/ui.scss b/apps/studio/styles/ui.scss index 886f96393d4..f0f37298fec 100644 --- a/apps/studio/styles/ui.scss +++ b/apps/studio/styles/ui.scss @@ -119,7 +119,7 @@ } .table-container thead th:first-child { - @apply pl-6 rounded rounded-r-none rounded-b-none; + @apply rounded rounded-r-none rounded-b-none; @apply border-l; }