diff --git a/src/pages/cluster-management/cluster-create.tsx b/src/pages/cluster-management/cluster-create.tsx index 0ecb5ce2..126870be 100644 --- a/src/pages/cluster-management/cluster-create.tsx +++ b/src/pages/cluster-management/cluster-create.tsx @@ -331,7 +331,7 @@ const ClusterCreate = () => { dataList={providerList} onSelect={handleSelectProvider} clickable={true} - currentProvider={extraData.provider} + current={extraData.provider} /> )} {renderModules()} diff --git a/src/pages/cluster-management/components/add-worker-step.tsx b/src/pages/cluster-management/components/add-worker-step.tsx index df9f1bc3..e8fb2d96 100644 --- a/src/pages/cluster-management/components/add-worker-step.tsx +++ b/src/pages/cluster-management/components/add-worker-step.tsx @@ -6,7 +6,7 @@ import styled from 'styled-components'; import { ProviderType, ProviderValueMap } from '../config'; import AddWorkerCommand from './add-worker-command'; import RegisterClusterInner from './register-cluster-inner'; -import SupportedHardware from './support-hardware'; +import SupportedGPUs from './support-gpus'; const Title = styled.div` font-size: 16px; @@ -63,7 +63,8 @@ const AddWorkerStep: React.FC = ({ registrationInfo }) => { const intl = useIntl(); - const [currentProvider, setCurrentProvider] = React.useState('cuda'); + const [currentSelection, setCurrentSelection] = + React.useState('cuda'); const [workerCommand, setWorkerCommand] = React.useState>( { label: 'NVIDIA', @@ -71,8 +72,9 @@ const AddWorkerStep: React.FC = ({ } ); - const handleSelectProvider = (provider: string, item: any) => { - setCurrentProvider(provider); + const handleSelectProvider = (value: string, item: any) => { + if (provider !== ProviderValueMap.Docker) return; + setCurrentSelection(value); setWorkerCommand(item); }; @@ -81,9 +83,10 @@ const AddWorkerStep: React.FC = ({ {intl.formatMessage({ id: 'clusters.create.supportedGpu' })} - {provider === ProviderValueMap.Docker && ( diff --git a/src/pages/cluster-management/components/cluster-item.tsx b/src/pages/cluster-management/components/cluster-item.tsx deleted file mode 100644 index b33c6c64..00000000 --- a/src/pages/cluster-management/components/cluster-item.tsx +++ /dev/null @@ -1,390 +0,0 @@ -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 ThemeTag from '@/components/tags-wrapper/theme-tag'; -import Card from '@/components/templates/card'; -import { PageAction } from '@/config'; -import { Card as ACard, Col, Collapse, Row } from 'antd'; -import React, { useMemo } from 'react'; -import styled from 'styled-components'; -import { queryClusterToken } from '../apis'; -import { - ClusterStatus, - ClusterStatusLabelMap, - ProviderLabelMap, - ProviderValueMap, - clusterActionList -} from '../config'; -import { ClusterListItem as ListItem, NodePoolListItem } from '../config/types'; -import AddPool from './add-pool'; -import RegisterCluster from './register-cluster'; -import WorkerPools from './worker-pools'; - -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 !important; - flex: 1; - .ant-card { - box-shadow: none; - } - .ant-card-body { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - padding: 6px 10px; - } - - .label { - font-weight: 400; - margin-bottom: 12px; - font-size: var(--font-size-middle); - color: var(--ant-color-text-secondary); - } - .value { - font-weight: 600; - color: var(--ant-color-text); - font-size: var(--font-size-large); - } -`; - -const CardBox = styled.div` - display: flex; - gap: 16px; - flex: 1; -`; - -const Inner = styled.div` - display: flex; - flex-direction: column; - height: 100%; - width: 100%; - cursor: default; - - .title { - margin-bottom: 12px; - 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; - } -`; - -const CollapseWrapper = styled(Collapse)` - width: 100%; - border: none; - border-radius: 0; - border-top: 1px solid var(--ant-color-split); - background-color: var(--ant-color-fill-quaternary); - .ant-collapse-content { - border-top: 1px solid var(--ant-color-split); - } - .ant-collapse-header { - font-size: var(--font-size-middle); - padding-block: 10px !important; - .ant-collapse-expand-icon { - margin-left: 0 !important; - } - } - table .ant-table-thead tr { - background-color: transparent !important; - th { - border-bottom: 1px solid var(--ant-color-split) !important; - font-weight: 500 !important; - } - } -`; - -const SubTitle = styled.div` - font-size: var(--font-size-middle); - font-weight: 500; - color: var(--ant-color-text); - margin-block: 24px 16px; -`; - -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 chartHeight = 160; - const { data, onSelect } = props; - const [show, setShow] = React.useState(false); - const [addPoolStatus, setAddPoolStatus] = React.useState({ - open: false, - action: PageAction.CREATE, - title: '', - provider: ProviderValueMap.DigitalOcean - }); - const [registerClusterStatus, setRegisterClusterStatus] = React.useState<{ - open: boolean; - registrationInfo: { - token: string; - image: string; - server_url: string; - cluster_id: number; - }; - }>({ - open: false, - registrationInfo: { - token: '', - image: '', - server_url: '', - cluster_id: 0 - } - }); - - const handleRegisterCluster = async () => { - try { - const info = await queryClusterToken({ id: data.id }); - setRegisterClusterStatus({ - open: true, - registrationInfo: { - ...info, - cluster_id: data.id - } - }); - } catch (error) {} - }; - - // cluster action handler - const handleOnSelect = (key: string) => { - if (key === 'addPool') { - setAddPoolStatus({ - open: true, - action: PageAction.CREATE, - title: 'Add Worker Pool', - provider: data.provider - }); - return; - } - - if (key === 'register_cluster') { - handleRegisterCluster(); - return; - } - onSelect?.(key, data); - }; - - // pool action handler - const handleOnAction = (action: string, record: NodePoolListItem) => { - if (action === 'edit') { - setAddPoolStatus({ - open: true, - action: PageAction.CREATE, - title: 'Edit Worker Pool', - provider: data.provider - }); - } - }; - - const actions = useMemo(() => { - return clusterActionList.filter((item) => { - if (item.provider) { - return item.provider === data.provider; - } - return true; - }); - }, [data.provider]); - - return ( - setShow(!show)} - expandIconPosition="end" - expandIcon={({ isActive }) => ( - - )} - items={[ - { - key: '1', - label: 'More Information', - children: ( - <> -
- - - - - - - - - - - - - - -
- {data.provider === ProviderValueMap.DigitalOcean && ( - <> - Worker Pools - - - )} - - ) - } - ]} - > - } - > - -
- - {data.name} - - {ProviderLabelMap[data.provider]} - - - - - - -
- - - -
Workers
-
- {data.ready_workers} / {data.workers} -
-
- -
GPUs
-
{data.gpus}
-
- -
Deployments
-
{data.models}
-
-
-
-
- { - setAddPoolStatus({ - open: false, - action: PageAction.CREATE, - title: '', - provider: 'digitalocean' - }); - }} - onOk={() => { - setAddPoolStatus({ - open: false, - action: addPoolStatus.action, - title: '', - provider: 'digitalocean' - }); - }} - > - { - setRegisterClusterStatus({ - open: false, - registrationInfo: { - token: '', - image: '', - server_url: '', - cluster_id: 0 - } - }); - }} - > -
- ); -}; - -export default CardItem; diff --git a/src/pages/cluster-management/components/cluster-metrics.tsx b/src/pages/cluster-management/components/cluster-metrics.tsx index 973e861c..232ea0bf 100644 --- a/src/pages/cluster-management/components/cluster-metrics.tsx +++ b/src/pages/cluster-management/components/cluster-metrics.tsx @@ -17,8 +17,8 @@ const metricsMap = { color: 'rgba(250, 173, 20,.8)' }, ram: { - label: 'Used', - type: 'Used', + label: 'RAM', + type: 'RAM', intl: false, color: 'rgba(114, 46, 209,.8)' }, @@ -35,8 +35,8 @@ const metricsMap = { color: 'rgba(84, 204, 152,.8)' }, vram: { - label: 'Used', - type: 'Used', + label: 'VRAM', + type: 'VRAM', intl: false, color: 'rgba(255, 107, 179, 80%)' } @@ -178,7 +178,7 @@ const ClusterMetrics = () => { @@ -188,7 +188,7 @@ const ClusterMetrics = () => { diff --git a/src/pages/cluster-management/components/provider-catalog.tsx b/src/pages/cluster-management/components/provider-catalog.tsx index 431b9035..d5e69987 100644 --- a/src/pages/cluster-management/components/provider-catalog.tsx +++ b/src/pages/cluster-management/components/provider-catalog.tsx @@ -34,7 +34,7 @@ const Title = styled.span` interface ProviderCatalogProps { onSelect?: (provider: string, item: any) => void; cols?: number; - currentProvider?: ProviderType | string; + current?: ProviderType | string; clickable?: boolean; dataList: { label: string; @@ -52,7 +52,7 @@ const ProviderCatalog: React.FC = ({ cols = 3, dataList, clickable, - currentProvider + current }) => { const intl = useIntl(); @@ -80,7 +80,7 @@ const ProviderCatalog: React.FC = ({ height="80px" key={action.key} onClick={() => onSelect?.(action.key as string, action)} - active={currentProvider === action.key} + active={current === action.key} disabled={action.disabled} clickable={clickable} header={ diff --git a/src/pages/cluster-management/components/support-hardware.tsx b/src/pages/cluster-management/components/support-gpus.tsx similarity index 96% rename from src/pages/cluster-management/components/support-hardware.tsx rename to src/pages/cluster-management/components/support-gpus.tsx index 89466560..613d400a 100644 --- a/src/pages/cluster-management/components/support-hardware.tsx +++ b/src/pages/cluster-management/components/support-gpus.tsx @@ -22,12 +22,14 @@ const ProviderImage = ({ src, showBg }: { src: string; showBg?: boolean }) => { interface SupportedHardwareProps { onSelect?: (provider: string, item: any) => void; - currentProvider?: string; + current?: string; + clickable?: boolean; } const SupportedHardware: React.FC = ({ onSelect, - currentProvider + clickable, + current }) => { const intl = useIntl(); @@ -110,9 +112,9 @@ const SupportedHardware: React.FC = ({ return ( ); diff --git a/src/pages/llmodels/download/target-form.tsx b/src/pages/llmodels/download/target-form.tsx index 5d70cb44..fda2afde 100644 --- a/src/pages/llmodels/download/target-form.tsx +++ b/src/pages/llmodels/download/target-form.tsx @@ -128,7 +128,11 @@ const TargetForm: React.FC = forwardRef((props, ref) => { showSearch expandTrigger="hover" multiple={false} - popupClassName="cascader-popup-wrapper gpu-selector" + classNames={{ + popup: { + root: 'cascader-popup-wrapper gpu-selector' + } + }} maxTagCount={1} label="Worker" options={workerOptions} diff --git a/src/pages/usage/components/over-view.tsx b/src/pages/usage/components/over-view.tsx index e3c6c8c9..7c9bbb9b 100644 --- a/src/pages/usage/components/over-view.tsx +++ b/src/pages/usage/components/over-view.tsx @@ -15,7 +15,7 @@ const renderCardItem = (data: { const { label, value, bgColor } = data; return (