mirror of
https://github.com/supabase/supabase.git
synced 2026-10-16 14:49:10 +03:00
* add dummy sinks and pipelines pages * update api types * show empty sources state * show empty replication state at /replication * create source when enable replication button is clicked * improve replication page when replication is enabled * replace sources page with publications page * publications table * show publications in table * create publication wip * show toast error instead of throwing an exception * user can now delete a publication * show empty sinks page * create and list sinks * add ui to delete a sink * show pipelines on the pipelines page * add ui to create and delete pipelines * get pipeline status wip * show pipeline status wip * show correct label on action buttons * start and stop pipelines * remove a couple of console.logs * fix error when deleting a pipeline * only consider replication enabled when a source with name = ref is present * add source and sink names * correct colspan for 'no pipelines' row * hide 'supabase_realtime' publication on ui * move filtering to fetch query * show sink name in ui * show source/sink names on pipelines page * fix start/stop status shown on ui * fix prettier formatting * update api types * extract pipeline action button as a separate component * fix a crashing page * fixed publications page crash * update to match with changes in api * add new replication page under database * hide replication page behind feature flag * update types * update api types * show destinations empty state * add destinations table * factor out components from Destinations table * show status dot * move pipeline fetch query to parent component * add ability to enable/disable a pipeline * show loader when starting or stopping a pipeline * fix a bug in which loading & empty states were shown together * fix a bug in which error & empty states were shown together * wrap in default layout * add new destination panel * add type field * fix a forwardRef error * fix layout * create destination * delete destination * add ability to create or delete destinations with pipelines * create source if missing * show only a single error * add an enable switch * new layout * add subsections * comment out unused code * show enabled switch only in the header * close panel when destination is created * disable buttons when api requests in flight * reduce panel size * remove commented out code * treat max size and max fill secs as numbers * use drop down to show publications * simpler vertical layout * add separators * add form validation * remove publications drop down padding * add new publication button * hide advanced settings behind an accordion * add some margin between icon and text * show publications panel on clicking new publication button * add header to new publication panel * fix validation not running for publication drop down * create publication in the new publication panel * add table selector in new publication panel * update api types * remove old code * update platform.d.ts * update navigation bar utils * remove a redirect from replication page to publications page * ask user for confirmation before deleting destination * edit destination panel * edit destination panel values fixed * bug fixes * fix prettier formatting * enable/disable pipeline after editing * rename snake_case params to camelCase * loading button when editing * remove merge markers * update api types * add max_staleness parameter in sinks for bigquery * add read replicas flow diagram to replication page * remove an unused import * Revert "add read replicas flow diagram to replication page" This reverts commit 8852d7847b457885603dba786141a8aaf8e99350. * add panel to warn users about additional cost before creating a destination * hide replication page contents behind a feature flag * fix merge conflicts * styling changes * revert static flag * styling updates * fixes * fix switch * copy * fix layout --------- Co-authored-by: Saxon Fletcher <saxonafletcher@gmail.com>
139 lines
4.5 KiB
TypeScript
139 lines
4.5 KiB
TypeScript
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 { useReplicationSinksQuery } from 'data/replication/sinks-query'
|
|
import { Plus } from 'lucide-react'
|
|
import { Button, cn } from 'ui'
|
|
import { GenericSkeletonLoader } from 'ui-patterns'
|
|
import DestinationRow from './DestinationRow'
|
|
import { useReplicationPipelinesQuery } from 'data/replication/pipelines-query'
|
|
import { FormHeader } from 'components/ui/Forms/FormHeader'
|
|
import { useState } from 'react'
|
|
import NewDestinationPanel from './DestinationPanel'
|
|
import { useReplicationSourcesQuery } from 'data/replication/sources-query'
|
|
import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold'
|
|
|
|
const Destinations = () => {
|
|
const [showNewDestinationPanel, setShowNewDestinationPanel] = useState(false)
|
|
const { ref: projectRef } = useParams()
|
|
|
|
const {
|
|
data: sourcesData,
|
|
error: sourcesError,
|
|
isLoading: isSourcesLoading,
|
|
isError: isSourcesError,
|
|
isSuccess: isSourcesSuccess,
|
|
} = useReplicationSourcesQuery({
|
|
projectRef,
|
|
})
|
|
|
|
let sourceId = sourcesData?.sources.find((s) => s.name === projectRef)?.id
|
|
|
|
const {
|
|
data: sinksData,
|
|
error: sinksError,
|
|
isLoading: isSinksLoading,
|
|
isError: isSinksError,
|
|
isSuccess: isSinksSuccess,
|
|
} = useReplicationSinksQuery({
|
|
projectRef,
|
|
})
|
|
|
|
const {
|
|
data: pipelinesData,
|
|
error: pipelinesError,
|
|
isLoading: isPipelinesLoading,
|
|
isError: isPipelinesError,
|
|
isSuccess: isPipelinesSuccess,
|
|
} = useReplicationPipelinesQuery({
|
|
projectRef,
|
|
})
|
|
|
|
const anySinks = isSinksSuccess && sinksData.sinks.length > 0
|
|
|
|
return (
|
|
<>
|
|
<ScaffoldSection isFullWidth>
|
|
<div className="flex justify-between items-center mb-4">
|
|
<ScaffoldSectionTitle>Destinations</ScaffoldSectionTitle>
|
|
<Button type="default" icon={<Plus />} onClick={() => setShowNewDestinationPanel(true)}>
|
|
Add destination
|
|
</Button>
|
|
</div>
|
|
{(isSourcesLoading || isSinksLoading) && <GenericSkeletonLoader />}
|
|
|
|
{(isSourcesError || isSinksError) && (
|
|
<AlertError
|
|
error={sourcesError || sinksError}
|
|
subject="Failed to retrieve destinations"
|
|
/>
|
|
)}
|
|
|
|
{anySinks ? (
|
|
<Table
|
|
head={[
|
|
<Table.th key="name">Name</Table.th>,
|
|
<Table.th key="type">Type</Table.th>,
|
|
<Table.th key="status">Status</Table.th>,
|
|
<Table.th key="publication">Publication</Table.th>,
|
|
<Table.th key="actions"></Table.th>,
|
|
]}
|
|
body={sinksData.sinks.map((sink) => {
|
|
const pipeline = pipelinesData?.pipelines.find((p) => p.sink_id === sink.id)
|
|
return (
|
|
<DestinationRow
|
|
key={sink.id}
|
|
sourceId={sourceId}
|
|
sinkId={sink.id}
|
|
sinkName={sink.name}
|
|
type={sink.config.big_query ? 'BigQuery' : 'Other'}
|
|
pipeline={pipeline}
|
|
error={pipelinesError}
|
|
isLoading={isPipelinesLoading}
|
|
isError={isPipelinesError}
|
|
isSuccess={isPipelinesSuccess}
|
|
></DestinationRow>
|
|
)
|
|
})}
|
|
></Table>
|
|
) : (
|
|
!isSourcesLoading &&
|
|
!isSinksLoading &&
|
|
!isSourcesError &&
|
|
!isSinksError && (
|
|
<div
|
|
className={cn(
|
|
'w-full',
|
|
'border border-dashed bg-surface-100 border-overlay',
|
|
'flex flex-col px-10 rounded-lg justify-center items-center py-8 mt-4'
|
|
)}
|
|
>
|
|
<h4 className="text-lg">Send data to your first destination</h4>
|
|
<p className="prose text-sm text-center mt-2">
|
|
Use destinations to improve performance or run analysis on your data via
|
|
integrations like BigQuery
|
|
</p>
|
|
<Button
|
|
icon={<Plus />}
|
|
onClick={() => setShowNewDestinationPanel(true)}
|
|
className="mt-6"
|
|
>
|
|
Add destination
|
|
</Button>
|
|
</div>
|
|
)
|
|
)}
|
|
</ScaffoldSection>
|
|
|
|
<NewDestinationPanel
|
|
visible={showNewDestinationPanel}
|
|
sourceId={sourceId}
|
|
onClose={() => setShowNewDestinationPanel(false)}
|
|
></NewDestinationPanel>
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default Destinations
|