mirror of
https://github.com/datahub-project/datahub.git
synced 2025-12-08 00:27:05 +00:00
98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
import { Button, Input } from 'antd';
|
|
import { FormOutlined, SearchOutlined } from '@ant-design/icons';
|
|
import React, { useState } from 'react';
|
|
import styled from 'styled-components';
|
|
import { LogoCountCard } from '../../../shared/LogoCountCard';
|
|
import { SourceConfig, SourceBuilderState, StepProps } from './types';
|
|
import { IngestionSourceBuilderStep } from './steps';
|
|
import useGetSourceLogoUrl from './useGetSourceLogoUrl';
|
|
import { CUSTOM } from './constants';
|
|
import { ANTD_GRAY } from '../../../entity/shared/constants';
|
|
|
|
const Section = styled.div`
|
|
display: flex;
|
|
flex-direction: column;
|
|
padding-bottom: 12px;
|
|
`;
|
|
|
|
const PlatformListContainer = styled.div`
|
|
display: flex;
|
|
justify-content: left;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
`;
|
|
|
|
const CancelButton = styled(Button)`
|
|
&& {
|
|
margin-left: 12px;
|
|
}
|
|
`;
|
|
|
|
const StyledSearchBar = styled(Input)`
|
|
background-color: white;
|
|
border-radius: 70px;
|
|
box-shadow: 0px 0px 30px 0px rgb(239 239 239);
|
|
width: 45%;
|
|
margin: 0 0 15px 12px;
|
|
`;
|
|
|
|
interface SourceOptionProps {
|
|
source: SourceConfig;
|
|
onClick: () => void;
|
|
}
|
|
|
|
function SourceOption({ source, onClick }: SourceOptionProps) {
|
|
const { name, displayName } = source;
|
|
|
|
const logoUrl = useGetSourceLogoUrl(name);
|
|
let logoComponent;
|
|
if (name === CUSTOM) {
|
|
logoComponent = <FormOutlined style={{ color: ANTD_GRAY[8], fontSize: 28 }} />;
|
|
}
|
|
|
|
return <LogoCountCard onClick={onClick} name={displayName} logoUrl={logoUrl} logoComponent={logoComponent} />;
|
|
}
|
|
|
|
/**
|
|
* Component responsible for selecting the mechanism for constructing a new Ingestion Source
|
|
*/
|
|
export const SelectTemplateStep = ({ state, updateState, goTo, cancel, ingestionSources }: StepProps) => {
|
|
const [searchFilter, setSearchFilter] = useState('');
|
|
|
|
const onSelectTemplate = (type: string) => {
|
|
const newState: SourceBuilderState = {
|
|
...state,
|
|
config: undefined,
|
|
type,
|
|
};
|
|
updateState(newState);
|
|
goTo(IngestionSourceBuilderStep.DEFINE_RECIPE);
|
|
};
|
|
|
|
const filteredSources = ingestionSources.filter(
|
|
(source) =>
|
|
source.displayName.toLocaleLowerCase().includes(searchFilter.toLocaleLowerCase()) ||
|
|
source.name.toLocaleLowerCase().includes(searchFilter.toLocaleLowerCase()),
|
|
);
|
|
|
|
return (
|
|
<>
|
|
<Section>
|
|
<StyledSearchBar
|
|
placeholder="Search ingestion sources..."
|
|
value={searchFilter}
|
|
onChange={(e) => setSearchFilter(e.target.value)}
|
|
allowClear
|
|
prefix={<SearchOutlined />}
|
|
/>
|
|
<PlatformListContainer>
|
|
{filteredSources.map((source) => (
|
|
<SourceOption key={source.urn} source={source} onClick={() => onSelectTemplate(source.name)} />
|
|
))}
|
|
</PlatformListContainer>
|
|
</Section>
|
|
<CancelButton onClick={cancel}>Cancel</CancelButton>
|
|
</>
|
|
);
|
|
};
|