diff --git a/src/components/scroller-modal/index.tsx b/src/components/scroller-modal/index.tsx index 0ab15b98..09a3bec3 100644 --- a/src/components/scroller-modal/index.tsx +++ b/src/components/scroller-modal/index.tsx @@ -4,14 +4,16 @@ import { Modal, type ModalProps } from 'antd'; import React from 'react'; import styled from 'styled-components'; -const Wrapper = styled.div<{ $maxHeight?: number }>` +const Wrapper = styled.div<{ $maxHeight?: number | string }>` max-height: ${({ $maxHeight }) => typeof $maxHeight === 'number' ? `${$maxHeight}px` : $maxHeight}; overflow-y: auto; width: 100%; `; -const ScrollerModal = (props: ModalProps & { maxContentHeight?: number }) => { +const ScrollerModal = ( + props: ModalProps & { maxContentHeight?: number | string } +) => { const scroller = React.useRef(null); const { saveScrollHeight, restoreScrollHeight } = useBodyScroll(); const { initialize, destroyInstance } = useOverlayScroller(); diff --git a/src/locales/en-US/clusters.ts b/src/locales/en-US/clusters.ts index 41482430..034a2566 100644 --- a/src/locales/en-US/clusters.ts +++ b/src/locales/en-US/clusters.ts @@ -39,11 +39,11 @@ export default { 'clusters.workerpool.batchSize.desc': 'Number of workers created simultaneously in the Worker pool', 'clusters.create.addworker.tips': - ' Please make sure the prerequisites for {label} are met before executing the following command.', + 'Please make sure the prerequisites for {label} are met before executing the following command.', 'clusters.create.addCommand.tips': 'On the Worker that needs to be added, run the following command to join it to the cluster.', 'clusters.create.register.tips': - ' On the Kubernetes cluster that needs to be added, run the following command to join its nodes to the cluster.', + 'On the Kubernetes cluster that needs to be added, run the following command to join its nodes to the cluster.', 'cluster.create.checkEnv.tips': 'Use the following command to check if the environment is ready', 'cluster.provider.comingsoon': 'Coming soon', diff --git a/src/locales/ja-JP/clusters.ts b/src/locales/ja-JP/clusters.ts index e41d2e2a..c1cb901c 100644 --- a/src/locales/ja-JP/clusters.ts +++ b/src/locales/ja-JP/clusters.ts @@ -39,7 +39,7 @@ export default { 'clusters.workerpool.batchSize.desc': 'Number of workers created simultaneously in the Worker pool', 'clusters.create.addworker.tips': - ' Please make sure the prerequisites for {label} are met before executing the following command.', + 'Please make sure the prerequisites for {label} are met before executing the following command.', 'clusters.create.addCommand.tips': 'On the Worker that needs to be added, run the following command to join it to the cluster.', 'cluster.create.checkEnv.tips': @@ -100,7 +100,7 @@ export default { // 36. 'clusters.create.noInstanceTypes': 'No instance types available', // 37. 'clusters.create.noRegions': 'No regions available', // 38. 'clusters.workerpool.batchSize.desc': 'Number of workers created simultaneously in the Worker pool', -// 39. 'clusters.create.addworker.tips': ' Please make sure the prerequisites for {label} are met before executing the following command.', +// 39. 'clusters.create.addworker.tips': 'Please make sure the prerequisites for {label} are met before executing the following command.', // 40. 'clusters.create.addCommand.tips': 'On the Worker that needs to be added, run the following command to join it to the cluster.', // 41. 'cluster.create.checkEnv.tips': 'Use the following command to check if the environment is ready', // 42. 'clusters.create.register.tips': ' On the Kubernetes cluster that needs to be added, run the following command to join its nodes to the cluster.', diff --git a/src/locales/ru-RU/clusters.ts b/src/locales/ru-RU/clusters.ts index 1fa89fa5..44421a9f 100644 --- a/src/locales/ru-RU/clusters.ts +++ b/src/locales/ru-RU/clusters.ts @@ -39,7 +39,7 @@ export default { 'clusters.workerpool.batchSize.desc': 'Количество воркеров, создаваемых одновременно в пуле воркеров', 'clusters.create.addworker.tips': - 'Перед выполнением следующей команды убедитесь, что выполнены предварительные требования для {label}.', + 'Пожалуйста, убедитесь, что выполнены предварительные условия для {label} перед выполнением следующей команды.', 'clusters.create.addCommand.tips': 'На воркере, который необходимо добавить, выполните следующую команду, чтобы присоединить его к кластеру.', 'cluster.create.checkEnv.tips': @@ -47,12 +47,18 @@ export default { 'clusters.create.register.tips': 'На Kubernetes кластере, который необходимо добавить, выполните следующую команду, чтобы присоединить его узлы к кластеру.', 'cluster.provider.comingsoon': 'Скоро будет', - 'clusters.addworker.nvidiaNotes-01': 'Если рабочий узел имеет несколько исходящих IP-адресов, укажите WORKER_IP, чтобы гарантировать использование узлом нужного IP. Перепроверьте с помощью команды hostname -I | xargs -n1.', - 'clusters.addworker.nvidiaNotes-02': 'Если директория с моделью уже существует на рабочем узле, добавьте директиву --volume для её монтирования.', - 'clusters.addworker.hygonNotes': 'Если директория /opt/hyhal не существует, создайте символическую ссылку на путь установки Hygon: /opt/hyhal. Аналогично для директории /opt/dtk.', - 'clusters.addworker.corexNotes': 'Если директория /lib/modules не существует, создайте символическую ссылку на путь установки Iluvatar: ln -s /path/to/corex /lib/modules. Аналогично для директории /usr/local/corex.', - 'clusters.addworker.metaxNotes': 'Если директория /opt/mxdriver не существует, создайте символическую ссылку на путь установки MetaX: ln -s /path/to/metax /opt/mxdriver. Аналогично для директории /opt/maca.', - 'clusters.addworker.cambriconNotes': 'Если директория /usr/local/neuware не существует, создайте символическую ссылку на путь установки Cambricon: ln -s /path/to/neuware /usr/local/neuware.' + 'clusters.addworker.nvidiaNotes-01': + 'Если рабочий узел имеет несколько исходящих IP-адресов, укажите WORKER_IP, чтобы гарантировать использование узлом нужного IP. Перепроверьте с помощью команды hostname -I | xargs -n1.', + 'clusters.addworker.nvidiaNotes-02': + 'Если директория с моделью уже существует на рабочем узле, добавьте директиву --volume для её монтирования.', + 'clusters.addworker.hygonNotes': + 'Если директория /opt/hyhal не существует, создайте символическую ссылку на путь установки Hygon: /opt/hyhal. Аналогично для директории /opt/dtk.', + 'clusters.addworker.corexNotes': + 'Если директория /lib/modules не существует, создайте символическую ссылку на путь установки Iluvatar: ln -s /path/to/corex /lib/modules. Аналогично для директории /usr/local/corex.', + 'clusters.addworker.metaxNotes': + 'Если директория /opt/mxdriver не существует, создайте символическую ссылку на путь установки MetaX: ln -s /path/to/metax /opt/mxdriver. Аналогично для директории /opt/maca.', + 'clusters.addworker.cambriconNotes': + 'Если директория /usr/local/neuware не существует, создайте символическую ссылку на путь установки Cambricon: ln -s /path/to/neuware /usr/local/neuware.' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== diff --git a/src/locales/zh-CN/clusters.ts b/src/locales/zh-CN/clusters.ts index 29fef0c1..9587a709 100644 --- a/src/locales/zh-CN/clusters.ts +++ b/src/locales/zh-CN/clusters.ts @@ -38,11 +38,11 @@ export default { 'clusters.create.noRegions': '无可用的区域', 'clusters.workerpool.batchSize.desc': '节点池中同时创建的节点数量', 'clusters.create.addworker.tips': - '在执行以下命令之前,请确保已满足 {label} 的先决条件。', + '在执行以下命令之前,请确保已满足 {label} 的先决条件。', 'clusters.create.addCommand.tips': - ' 在需要添加的节点上运行以下命令,将其加入到集群中', + '在需要添加的节点上运行以下命令,将其加入到集群中', 'clusters.create.register.tips': - ' 在需要添加的 Kubernetes 集群上运行以下命令,将其中的节点加入到集群中', + '在需要添加的 Kubernetes 集群上运行以下命令,将其中的节点加入到集群中', 'cluster.create.checkEnv.tips': '使用以下命令检查环境是否准备妥当', 'cluster.provider.comingsoon': '即将推出', 'clusters.addworker.nvidiaNotes-01': diff --git a/src/pages/cluster-management/components/add-pool.tsx b/src/pages/cluster-management/components/add-pool.tsx index 0681ed8e..8c81bcbf 100644 --- a/src/pages/cluster-management/components/add-pool.tsx +++ b/src/pages/cluster-management/components/add-pool.tsx @@ -67,9 +67,11 @@ const AddPool: React.FC = ({ onCancel={handleCancel} destroyOnHidden={true} closeIcon={true} + centered={true} maskClosable={false} keyboard={false} width={600} + maxContentHeight={'max(calc(100vh - 300px), 500px)'} footer={ } diff --git a/src/pages/cluster-management/components/add-worker-step.tsx b/src/pages/cluster-management/components/add-worker-step.tsx index c6926085..1589cbf5 100644 --- a/src/pages/cluster-management/components/add-worker-step.tsx +++ b/src/pages/cluster-management/components/add-worker-step.tsx @@ -62,7 +62,7 @@ const Container = styled.div` width: 800px; margin: 0 auto; .command-info { - margin-top: 24px; + margin-top: 16px; margin-bottom: 8px; } `; diff --git a/src/pages/cluster-management/components/add-worker.tsx b/src/pages/cluster-management/components/add-worker.tsx index f37faa29..61cc4aba 100644 --- a/src/pages/cluster-management/components/add-worker.tsx +++ b/src/pages/cluster-management/components/add-worker.tsx @@ -24,17 +24,15 @@ const AddWorker: React.FC = (props) => { diff --git a/src/pages/cluster-management/components/provider-catalog.tsx b/src/pages/cluster-management/components/provider-catalog.tsx index 1682d041..1b224b5d 100644 --- a/src/pages/cluster-management/components/provider-catalog.tsx +++ b/src/pages/cluster-management/components/provider-catalog.tsx @@ -10,7 +10,7 @@ const Wrapper = styled.div<{ $cols?: number }>` grid-template-columns: repeat(${(props) => props.$cols || 3}, 1fr); gap: 16px; .template-card-wrapper { - padding: 16px; + padding: 10px; } .template-card-inner { justify-content: center; diff --git a/src/pages/cluster-management/components/support-gpus.tsx b/src/pages/cluster-management/components/support-gpus.tsx index f1ad91d0..96b9d0e9 100644 --- a/src/pages/cluster-management/components/support-gpus.tsx +++ b/src/pages/cluster-management/components/support-gpus.tsx @@ -140,7 +140,7 @@ const SupportedHardware: React.FC = ({ = (props) => { maskClosable={false} keyboard={false} width={600} - maxContentHeight={550} + maxContentHeight={'max(calc(100vh - 300px), 500px)'} footer={ } diff --git a/src/pages/resources/components/workers.tsx b/src/pages/resources/components/workers.tsx index ac85d5dc..9376c748 100644 --- a/src/pages/resources/components/workers.tsx +++ b/src/pages/resources/components/workers.tsx @@ -11,7 +11,6 @@ import { Button, ConfigProvider, Table, message } from 'antd'; import { useAtom } from 'jotai'; import React, { useEffect, useState } from 'react'; import NoResult from '../../_components/no-result'; -import TerminalTabs from '../../_components/terminal-tabs'; import { WORKERS_API, deleteWorker, @@ -71,16 +70,6 @@ const Workers: React.FC = () => { open: false, currentData: null }); - const [terminals, setTerminals] = useState<{ url: string; name: string }[]>( - [] - ); - const [terminalModalStatus, setTerminalModalStatus] = useState<{ - open: boolean; - currentActive: string; - }>({ - open: false, - currentActive: '' - }); const getClusterList = async () => { try { @@ -165,19 +154,6 @@ const Workers: React.FC = () => { name: record.name }); } - if (val === 'terminal') { - const url = `/api/workers/${record.id}/terminal`; - setTerminals((prev) => { - return [ - ...prev, - { - url, - name: record.name - } - ]; - }); - setTerminalModalStatus({ open: true, currentActive: url }); - } }); const handleAddWorker = () => { @@ -212,11 +188,6 @@ const Workers: React.FC = () => { }); }; - const handleTerminalClose = () => { - setTerminalModalStatus({ open: false, currentActive: '' }); - setTerminals([]); - }; - const columns = useWorkerColumns({ clusterData, loadend: dataSource.loadend, @@ -282,14 +253,6 @@ const Workers: React.FC = () => { setWorkerDetailStatus({ currentData: null, open: false }) } /> - ); diff --git a/src/pages/resources/hooks/use-terminal-tabs.tsx b/src/pages/resources/hooks/use-terminal-tabs.tsx new file mode 100644 index 00000000..fc3e92b1 --- /dev/null +++ b/src/pages/resources/hooks/use-terminal-tabs.tsx @@ -0,0 +1,52 @@ +import { useState } from 'react'; +import TerminalTabs from '../../_components/terminal-tabs'; + +const useTerminalTabs = () => { + const [terminals, setTerminals] = useState<{ url: string; name: string }[]>( + [] + ); + const [terminalModalStatus, setTerminalModalStatus] = useState<{ + open: boolean; + currentActive: string; + }>({ + open: false, + currentActive: '' + }); + + const handleTerminalClose = () => { + setTerminalModalStatus({ open: false, currentActive: '' }); + setTerminals([]); + }; + + const handleAddTerminal = (record: { id: number; name: string }) => { + const url = `/api/workers/${record.id}/terminal`; + setTerminals((prev) => { + return [ + ...prev, + { + url, + name: record.name + } + ]; + }); + setTerminalModalStatus({ open: true, currentActive: url }); + }; + + const TerminalPanel = ( + + ); + + return { + TerminalPanel, + handleAddTerminal + }; +}; + +export default useTerminalTabs;