import { AutoTooltip, BaseSelect, CopyButton, ThemeTag } from '@gpustack/core-ui'; import { useIntl } from '@umijs/max'; import { Empty, Typography } from 'antd'; import { useState } from 'react'; import styled from 'styled-components'; import { BackendSourceLabelMap, BackendSourceValueMap, frameworks, getGpuColor, TagColorMap } from '../config'; import { VersionListItem } from '../config/types'; const ItemWrapper = styled.div` display: flex; flex-direction: column; align-items: flex-start; gap: 8px; width: 100%; border: 1px solid var(--ant-color-border); border-radius: var(--ant-border-radius-lg); padding: 12px 16px; &:hover { background-color: var(--ant-color-fill-tertiary); } .title { width: 100%; justify-content: space-between; display: flex; align-items: center; font-weight: 600; } `; const RowWrapper = styled.div` display: flex; flex-direction: column; align-items: flex-start; gap: 4px; .label { color: var(--ant-color-text-tertiary); } .drivers { display: flex; flex-wrap: wrap; gap: 8px; } `; const InfoItem = styled.div` display: grid; align-items: center; grid-template-columns: max-content minmax(0, 1fr); gap: 8px; .label { color: var(--ant-color-text-tertiary); } `; const ListWrapper = styled.div` display: flex; flex-direction: column; align-items: flex-start; gap: 16px; width: 100%; `; const FilterBox = styled.div` position: sticky; top: 0; width: 100%; z-index: 100; margin-block: 16px; background-color: var(--ant-color-bg-container); `; interface VersionItemProps { data: VersionListItem; } export const VersionItem: React.FC = ({ data }) => { const intl = useIntl(); const renderSource = () => { console.log('data.is_built_in', data.is_built_in); const source = data.is_built_in ? BackendSourceLabelMap[BackendSourceValueMap.BUILTIN] || '' : BackendSourceLabelMap[data.backend_source || ''] || ''; if (!source) { return null; } return ( {intl.formatMessage({ id: source })} ); }; return (
{data.version_no} {renderSource()} {!data.is_built_in && data.is_default && ( {intl.formatMessage({ id: 'backend.isDefault' })} )}
{data.image_name && ( {intl.formatMessage({ id: 'backend.imageName' })}: {data.is_built_in ? intl.formatMessage({ id: 'backend.versionInfo.autoImage' }) : data.image_name} )} {data.entrypoint && ( {intl.formatMessage({ id: 'backend.replaceEntrypoint' })}: {data.entrypoint} )} {data.run_command && ( {intl.formatMessage({ id: 'backend.runCommand' })}: {data.run_command} )} {intl.formatMessage({ id: 'backend.framework' })}: {data.availableFrameworks?.map((item) => { return ( {item} ); })}
); }; const VersionList: React.FC<{ versionConfigs: VersionListItem[] }> = ({ versionConfigs }) => { const intl = useIntl(); const [dataList, setDataList] = useState(versionConfigs); const handleChange = (value: string) => { if (value) { const filtered = versionConfigs.filter((item) => item.availableFrameworks?.includes(value) ); setDataList(filtered); } else { setDataList(versionConfigs); } }; const optionRender = (option: any) => { const { data } = option; return ( {option.label} {data.tips ? ( data.tipLocale ? ( {` [${intl.formatMessage({ id: data.tips })}]`} ) : ( {` [${data.tips}]`} ) ) : null} ); }; return (
{dataList.length ? ( dataList.map((version: VersionListItem, index: number) => { return ; }) ) : ( )}
); }; export default VersionList;