mirror of
https://github.com/datahub-project/datahub.git
synced 2025-08-18 14:16:48 +00:00
180 lines
4.9 KiB
TypeScript
180 lines
4.9 KiB
TypeScript
import React from 'react';
|
|
|
|
import styled from 'styled-components';
|
|
|
|
import { Divider, Typography, Switch, Card, Button, Tooltip } from 'antd';
|
|
import { ArrowRightOutlined } from '@ant-design/icons';
|
|
import { ANTD_GRAY } from '../../entity/shared/constants';
|
|
|
|
const Title = styled(Typography.Title)`
|
|
&& {
|
|
margin-bottom: 8px;
|
|
}
|
|
`;
|
|
|
|
const FeatureRow = styled.div`
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
`;
|
|
|
|
const FeatureOptionRow = styled.div`
|
|
display: flex;
|
|
justify-content: space-between;
|
|
|
|
&:not(:last-child) {
|
|
margin-bottom: 8px;
|
|
}
|
|
`;
|
|
|
|
const SettingsOptionRow = styled.div`
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 0 16px;
|
|
|
|
&:not(:last-child) {
|
|
margin-bottom: 8px;
|
|
}
|
|
`;
|
|
|
|
const DescriptionText = styled(Typography.Text)`
|
|
color: ${ANTD_GRAY[7]};
|
|
font-size: 11px;
|
|
`;
|
|
|
|
const SettingTitle = styled.div`
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
font-size: 14px;
|
|
margin-bottom: 4px;
|
|
`;
|
|
|
|
const OptionTitle = styled(Typography.Text)`
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
font-size: 12px;
|
|
`;
|
|
|
|
const learnMoreLinkStyle = {
|
|
flex: 1,
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
gap: '8px',
|
|
color: '#1890FF',
|
|
fontSize: '12px',
|
|
cursor: 'pointer',
|
|
};
|
|
|
|
const NewTag = styled.div`
|
|
padding: 4px 8px;
|
|
|
|
border-radius: 24px;
|
|
background: #f1fbfe;
|
|
|
|
color: #09739a;
|
|
font-size: 12px;
|
|
`;
|
|
|
|
const DataHubOnlyTag = styled.div`
|
|
padding: 2px 8px;
|
|
|
|
border-radius: 24px;
|
|
background: #c9fff2;
|
|
|
|
color: #50a494;
|
|
font-size: 12px;
|
|
`;
|
|
|
|
export interface FeatureType {
|
|
key: string;
|
|
title: string;
|
|
description: string;
|
|
settings: Array<{
|
|
key: string;
|
|
title: string;
|
|
isAvailable: boolean;
|
|
buttonText: string;
|
|
onClick?: () => void;
|
|
}>;
|
|
options: Array<{
|
|
key: string;
|
|
title: string;
|
|
description: string;
|
|
isAvailable: boolean;
|
|
checked: boolean;
|
|
onChange?: (checked: boolean) => void;
|
|
}>;
|
|
isNew: boolean;
|
|
learnMoreLink?: string;
|
|
}
|
|
|
|
export const Feature = ({ key, title, description, settings, options, isNew, learnMoreLink }: FeatureType) => (
|
|
<Card style={{ marginBottom: '1rem' }} key={key}>
|
|
<FeatureRow>
|
|
<div style={{ flex: 1 }}>
|
|
<SettingTitle>
|
|
<Title level={5} style={{ marginBottom: 0 }}>
|
|
{title}
|
|
</Title>
|
|
{isNew && <NewTag>New!</NewTag>}
|
|
</SettingTitle>
|
|
<div>
|
|
<Typography.Paragraph type="secondary">{description}</Typography.Paragraph>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
{learnMoreLink && (
|
|
<a href={learnMoreLink} target="_blank" style={learnMoreLinkStyle} rel="noreferrer">
|
|
Learn more <ArrowRightOutlined />
|
|
</a>
|
|
)}
|
|
</div>
|
|
</FeatureRow>
|
|
<Divider style={{ margin: `8px 0 24px 0` }} />
|
|
{settings.map((option) => (
|
|
<>
|
|
<SettingsOptionRow key={option.key}>
|
|
<span>
|
|
<OptionTitle>
|
|
<span>{option.title}</span>
|
|
</OptionTitle>
|
|
</span>
|
|
<Tooltip title={option.isAvailable ? '' : 'Only available on DataHub Cloud'}>
|
|
<Button onClick={option.onClick} disabled={!option.isAvailable}>
|
|
{option.buttonText}
|
|
</Button>
|
|
</Tooltip>
|
|
</SettingsOptionRow>
|
|
</>
|
|
))}
|
|
<Card style={{ margin: `16px auto` }}>
|
|
{options.map((option, index) => (
|
|
<>
|
|
<FeatureOptionRow key={option.key}>
|
|
<span>
|
|
<OptionTitle>
|
|
<span>{option.title}</span>
|
|
{!option.isAvailable && (
|
|
<DataHubOnlyTag>Only available on DataHub Cloud</DataHubOnlyTag>
|
|
)}
|
|
</OptionTitle>
|
|
<div>
|
|
<DescriptionText>{option.description}</DescriptionText>
|
|
</div>
|
|
</span>
|
|
<Switch
|
|
checked={option.checked}
|
|
onChange={(checked) => (option.onChange ? option.onChange(checked) : null)}
|
|
disabled={!option.isAvailable}
|
|
/>
|
|
</FeatureOptionRow>
|
|
{index !== options.length - 1 && <Divider />}
|
|
</>
|
|
))}
|
|
</Card>
|
|
</Card>
|
|
);
|