From b8b1587ebae682fec37ebac26425aed2e9ced3fc Mon Sep 17 00:00:00 2001 From: Danny White <3104761+dnywh@users.noreply.github.com> Date: Fri, 28 Aug 2026 13:01:55 +1000 Subject: [PATCH] replace publication combobox with select to match initial sync styling --- .../DestinationForm/PublicationSelect.tsx | 104 ++++++++++++++++++ .../DestinationForm/PublicationSelection.tsx | 4 +- 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelect.tsx diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelect.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelect.tsx new file mode 100644 index 00000000000..7afc2c68587 --- /dev/null +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelect.tsx @@ -0,0 +1,104 @@ +import { useParams } from 'common' +import { Loader2, Plus } from 'lucide-react' +import { ControllerRenderProps } from 'react-hook-form' +import { Select, SelectContent, SelectItem, SelectSeparator, SelectTrigger } from 'ui' +import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + +import type { DestinationPanelSchemaType } from './DestinationForm.schema' +import { useReplicationPublicationsQuery } from '@/data/replication/publications-query' + +const CREATE_PUBLICATION_VALUE = '__create_publication__' + +interface PublicationSelectProps { + sourceId?: number + field: ControllerRenderProps + onNewPublicationClick: () => void +} + +export const PublicationSelect = ({ + sourceId, + field, + onNewPublicationClick, +}: PublicationSelectProps) => { + const { ref: projectRef } = useParams() + const selectedPublication = field.value ?? '' + + const { + data: publications = [], + isPending, + isFetching, + refetch: refetchPublications, + } = useReplicationPublicationsQuery({ projectRef, sourceId }) + const isLoadingPublications = isPending || isFetching + const showLoadingState = isLoadingPublications && publications.length === 0 + + return ( + + ) +} diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx index e0ac6818d71..3ed08e23287 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx @@ -6,7 +6,7 @@ import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import type { DestinationPanelSchemaType } from './DestinationForm.schema' -import { PublicationsComboBox } from './PublicationsComboBox' +import { PublicationSelect } from './PublicationSelect' import { useReplicationPublicationsQuery } from '@/data/replication/publications-query' import { useReplicationSourceId } from '@/data/replication/sources-query' @@ -44,7 +44,7 @@ export const PublicationSelection = ({ description="Tables in the selected publication will be replicated to this destination." > - {