Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter connections list on source or destination item pages #21027

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Adds filtering to the source and destination item pages, as well as c…
…leans up some excess API calls.
  • Loading branch information
krishnaglick committed Jan 4, 2023
commit e6f84332998909addeadac2e17e6fad3dc9660cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { Heading } from "components/ui/Heading";
import { Text } from "components/ui/Text";

import { ReleaseStage } from "core/request/AirbyteClient";
import { getIcon } from "utils/imageUtils";

import { Button } from "../ui/Button";
import styles from "./TableItemTitle.module.scss";
Expand All @@ -17,7 +18,7 @@ interface TableItemTitleProps {
onSelect: (data: DropdownMenuOptionType) => void;
entity: string;
entityName: string;
entityIcon?: React.ReactNode;
entityIcon?: string;
releaseStage?: ReleaseStage;
}

Expand All @@ -35,7 +36,7 @@ const TableItemTitle: React.FC<TableItemTitleProps> = ({
return (
<>
<div className={styles.entityInfo}>
{entityIcon && <div className={styles.entityIcon}>{entityIcon}</div>}
{entityIcon && <div className={styles.entityIcon}>{getIcon(entityIcon)}</div>}
<div>
<Heading as="h2">{entityName}</Heading>
<Text size="lg" bold className={styles.entityType}>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {
WebBackendConnectionCreate,
WebBackendConnectionListRequestBody,
WebBackendConnectionUpdate,
webBackendCreateConnection,
webBackendGetConnection,
Expand All @@ -13,8 +14,8 @@ export class WebBackendConnectionService extends AirbyteRequestService {
return webBackendGetConnection({ connectionId, withRefreshedCatalog }, this.requestOptions);
}

public list(workspaceId: string) {
return webBackendListConnectionsForWorkspace({ workspaceId }, this.requestOptions);
public list(payload: WebBackendConnectionListRequestBody) {
return webBackendListConnectionsForWorkspace(payload, this.requestOptions);
}

public update(payload: WebBackendConnectionUpdate) {
Expand Down
11 changes: 8 additions & 3 deletions airbyte-webapp/src/hooks/services/useConnectionHook.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
SourceDefinitionRead,
SourceRead,
WebBackendConnectionListItem,
WebBackendConnectionListRequestBody,
WebBackendConnectionRead,
WebBackendConnectionReadList,
WebBackendConnectionUpdate,
Expand All @@ -31,7 +32,7 @@ import { useCurrentWorkspace } from "./useWorkspace";

export const connectionsKeys = {
all: [SCOPE_WORKSPACE, "connections"] as const,
lists: () => [...connectionsKeys.all, "list"] as const,
lists: (sourceOrDestinationId?: string) => [...connectionsKeys.all, "list", sourceOrDestinationId].filter(Boolean),
list: (filters: string) => [...connectionsKeys.lists(), { filters }] as const,
detail: (connectionId: string) => [...connectionsKeys.all, "details", connectionId] as const,
getState: (connectionId: string) => [...connectionsKeys.all, "getState", connectionId] as const,
Expand Down Expand Up @@ -236,11 +237,15 @@ export const useRemoveConnectionsFromList = (): ((connectionIds: string[]) => vo
);
};

const useConnectionList = () => {
const useConnectionList = (
payload: Partial<Pick<WebBackendConnectionListRequestBody, "destinationId" | "sourceId">> = {}
) => {
const workspace = useCurrentWorkspace();
const service = useWebConnectionService();

return useSuspenseQuery(connectionsKeys.lists(), () => service.list(workspace.workspaceId));
return useSuspenseQuery(connectionsKeys.lists(payload.destinationId ?? payload.sourceId), () =>
service.list({ ...payload, workspaceId: workspace.workspaceId })
);
};

const useGetConnectionState = (connectionId: string) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,10 @@ import { PageHeader } from "components/ui/PageHeader";
import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics";
import { useConnectionList } from "hooks/services/useConnectionHook";
import { useGetSource } from "hooks/services/useSourceHook";
import { useDestinationDefinitionList } from "services/connector/DestinationDefinitionService";
import { useSourceDefinition } from "services/connector/SourceDefinitionService";
import { getIcon } from "utils/imageUtils";
import { ConnectorDocumentationWrapper } from "views/Connector/ConnectorDocumentationLayout";

import { DropdownMenuOptionType } from "../../../../components/ui/DropdownMenu";
import { useDestinationList } from "../../../../hooks/services/useDestinationHook";
import { RoutePaths } from "../../../routePaths";
import SourceConnectionTable from "./components/SourceConnectionTable";
import SourceSettings from "./components/SourceSettings";
Expand All @@ -35,14 +32,10 @@ const SourceItemPage: React.FC = () => {
[params]
);

const { destinations } = useDestinationList();

const { destinationDefinitions } = useDestinationDefinitionList();

const source = useGetSource(params.id || "");
const sourceDefinition = useSourceDefinition(source?.sourceDefinitionId);
const sourceDefinition = useSourceDefinition(source.sourceDefinitionId);

const { connections } = useConnectionList();
const { connections } = useConnectionList({ sourceId: source.sourceId });

const breadcrumbsData = [
{
Expand All @@ -52,23 +45,18 @@ const SourceItemPage: React.FC = () => {
{ label: source.name },
];

const connectionsWithSource = connections.filter(({ source: { sourceId } }) => sourceId === source.sourceId);

const destinationDropdownOptions: DropdownMenuOptionType[] = useMemo(
() =>
destinations.map((item) => {
const destinationDef = destinationDefinitions.find(
(dd) => dd.destinationDefinitionId === item.destinationDefinitionId
);
connections.map((conn) => {
return {
as: "button",
icon: <ConnectorIcon icon={destinationDef?.icon} />,
icon: <ConnectorIcon icon={conn.destination.icon} />,
iconPosition: "right",
displayName: item.name,
value: item.destinationId,
displayName: conn.destination.name,
value: conn.destination.destinationId,
};
}),
[destinations, destinationDefinitions]
[connections]
);

const onSelectStep = (id: string) => {
Expand Down Expand Up @@ -102,7 +90,7 @@ const SourceItemPage: React.FC = () => {
<Routes>
<Route
path="/settings"
element={<SourceSettings currentSource={source} connectionsWithSource={connectionsWithSource} />}
element={<SourceSettings currentSource={source} connectionsWithSource={connections} />}
/>
<Route
index
Expand All @@ -114,11 +102,11 @@ const SourceItemPage: React.FC = () => {
onSelect={onSelect}
entity={source.sourceName}
entityName={source.name}
entityIcon={sourceDefinition ? getIcon(sourceDefinition.icon) : null}
entityIcon={source.icon}
releaseStage={sourceDefinition.releaseStage}
/>
{connectionsWithSource.length ? (
<SourceConnectionTable connections={connectionsWithSource} />
{connections.length ? (
<SourceConnectionTable connections={connections} />
) : (
<Placeholder resource={ResourceTypes.Destinations} />
)}
Expand Down
31 changes: 12 additions & 19 deletions airbyte-webapp/src/pages/destination/DestinationOverviewPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,29 @@ import { DropdownMenuOptionType } from "components/ui/DropdownMenu";

import { useConnectionList } from "hooks/services/useConnectionHook";
import { useGetDestination } from "hooks/services/useDestinationHook";
import { useSourceList } from "hooks/services/useSourceHook";
import { DestinationPaths } from "pages/routePaths";
import { useDestinationDefinition } from "services/connector/DestinationDefinitionService";
import { useSourceDefinitionList } from "services/connector/SourceDefinitionService";
import { getIcon } from "utils/imageUtils";

export const DestinationOverviewPage = () => {
const params = useParams() as { "*": StepsTypes | ""; id: string };
const { sources } = useSourceList();
const navigate = useNavigate();

const destination = useGetDestination(params.id);
const destinationDefinition = useDestinationDefinition(destination.destinationDefinitionId);
const { connections } = useConnectionList();
const { sourceDefinitions } = useSourceDefinitionList();

const connectionsWithDestination = connections.filter(
({ destination: { destinationId } }) => destinationId === destination.destinationId
);
const { connections } = useConnectionList({ destinationId: destination.destinationId });

const sourceDropdownOptions: DropdownMenuOptionType[] = useMemo(
() =>
sources.map((item) => {
const sourceDef = sourceDefinitions.find((sd) => sd.sourceDefinitionId === item.sourceDefinitionId);
connections.map((conn) => {
return {
as: "button",
icon: <ConnectorIcon icon={sourceDef?.icon} />,
icon: <ConnectorIcon icon={conn.source.icon} />,
iconPosition: "right",
displayName: item.name,
value: item.sourceId,
displayName: conn.source.name,
value: conn.source.sourceId,
};
}),
[sources, sourceDefinitions]
[connections]
);

const onSelect = (data: DropdownMenuOptionType) => {
Expand All @@ -56,6 +47,8 @@ export const DestinationOverviewPage = () => {
navigate(path, { state });
};

console.log({ destination, destinationDefinition, connections });

return (
<>
<TableItemTitle
Expand All @@ -64,11 +57,11 @@ export const DestinationOverviewPage = () => {
onSelect={onSelect}
entityName={destination.name}
entity={destination.destinationName}
entityIcon={destinationDefinition.icon ? getIcon(destinationDefinition.icon) : null}
entityIcon={destination.icon}
releaseStage={destinationDefinition.releaseStage}
/>
{connectionsWithDestination.length ? (
<DestinationConnectionTable connections={connectionsWithDestination} />
{connections.length ? (
<DestinationConnectionTable connections={connections} />
) : (
<Placeholder resource={ResourceTypes.Sources} />
)}
Expand Down