import DropdownButtons from '@/components/drop-down-buttons'; import GaugeChart from '@/components/echarts/gauge'; import IconFont from '@/components/icon-font'; import StatusTag from '@/components/status-tag'; import Card from '@/components/templates/card'; import { DeleteOutlined, EditOutlined, KubernetesOutlined } from '@ant-design/icons'; import { Card as ACard, Button, Col, Row, Tag } from 'antd'; import React, { useMemo } from 'react'; import styled from 'styled-components'; import { ClusterStatus, ClusterStatusLabelMap, ProviderLabelMap, ProviderValueMap } from '../config'; import { ClusterListItem as ListItem, NodePoolListItem } from '../config/types'; import WorkerPools from './worker-pools'; const CollapseTitle = styled.div` display: flex; align-items: center; gap: 8px; font-size: var(--font-size-middle); font-weight: 500; color: var(--ant-color-text); height: 32px; cursor: pointer; `; const Content = styled.div` display: flex; justify-content: space-between; align-items: center; .chart-wrapper { flex: 1; } `; const CardWrapper = styled(ACard)` text-align: center; box-shadow: none; flex: 1; .ant-card { box-shadow: none; } .ant-card-body { display: flex; flex-direction: column; justify-content: flex-start; align-items: center; gap: 8px; } .label { font-weight: 500; font-size: var(--font-size-middle); } .value { font-weight: 500; color: var(--ant-color-text); } `; const CardBox = styled.div` display: flex; gap: 16px; flex: 0.5; `; const actionItems = [ { key: 'edit', label: 'common.button.edit', icon: }, { key: 'add_worker', label: 'Add Worker', provider: ProviderValueMap.Custom, locale: false, icon: }, { key: 'register_cluster', label: 'Register Cluster', provider: ProviderValueMap.Kubernetes, locale: false, icon: }, { key: 'addPool', label: 'Add Node Pool', provider: ProviderValueMap.DigitalOcean, locale: false, icon: }, { key: 'delete', label: 'common.button.delete', icon: , props: { danger: true } } ]; const Inner = styled.div` display: flex; flex-direction: column; height: 100%; width: 100%; cursor: default; .title { margin-bottom: 16px; display: flex; align-items: center; justify-content: space-between; padding-bottom: 8px; .text { display: flex; align-items: center; font-size: var(--font-size-middle); font-weight: 500; color: var(--ant-color-text); } } .content { display: flex; flex-direction: column; justify-content: space-between; flex: 1; } `; interface CardProps { data: ListItem; onSelect?: (key: string, row: ListItem) => void; } const gaugeConfig = { radius: '100%', progress: { show: true, roundCap: false, width: 8 }, axisLine: { roundCap: false, lineStyle: { width: 8, color: [ [0.5, 'rgba(84, 204, 152, 80%)'], [0.8, 'rgba(250, 173, 20, 80%)'], [1, 'rgba(255, 77, 79, 80%)'] ] } } }; const CardItem: React.FC = (props) => { const { data, onSelect } = props; const [show, setShow] = React.useState(false); const handleOnSelect = (key: string) => { onSelect?.(key, data); }; const handleOnAction = (action: string, record: NodePoolListItem) => {}; const actions = useMemo(() => { return actionItems.filter((item) => { if (item.provider) { return item.provider === data.provider; } return true; }); }, [data.provider]); return ( {data.name} {ProviderLabelMap[data.provider]} Workers 1 GPUs 12 Deployments 2 {data.provider === ProviderValueMap.DigitalOcean && ( <> } onClick={() => setShow(!show)} > Worker Pools > )} ); }; export default CardItem;