fix: locales, empty link in add worker

This commit is contained in:
jialin
2026-06-06 14:29:49 +08:00
committed by jialin
parent 15a9e23243
commit d3ebea9090
12 changed files with 52 additions and 37 deletions
+1 -1
View File
@@ -39,7 +39,7 @@ export default {
'clusters.workerpool.batchSize.desc': 'clusters.workerpool.batchSize.desc':
'Number of workers created simultaneously in the Worker pool', 'Number of workers created simultaneously in the Worker pool',
'clusters.create.addworker.tips': 'clusters.create.addworker.tips':
'Please make sure the <a href={link} target="_blank">prerequisites</a> for {label} are met before executing the following command.', 'Please make sure the <a href={link} target="_blank">prerequisites</a> are met before executing the following command.',
'clusters.create.addCommand.tips': 'clusters.create.addCommand.tips':
'On the Worker that needs to be added, run the following command to join it to the cluster.', 'On the Worker that needs to be added, run the following command to join it to the cluster.',
'clusters.create.addCommand.k8s.tips': 'clusters.create.addCommand.k8s.tips':
+1 -1
View File
@@ -36,7 +36,7 @@ export default {
'menu.login': 'Login', 'menu.login': 'Login',
'menu.usage': 'Usage', 'menu.usage': 'Usage',
'menu.usage.usage': 'Usage', 'menu.usage.usage': 'Usage',
'menu.billingAndUsage': 'Billing & Usage', 'menu.billingAndUsage': 'Usage & Billing',
'menu.billingAndUsage.usage': 'Usage', 'menu.billingAndUsage.usage': 'Usage',
'menu.404': '404', 'menu.404': '404',
'menu.resources.clusters': 'Clusters', 'menu.resources.clusters': 'Clusters',
+1 -1
View File
@@ -39,7 +39,7 @@ export default {
'clusters.workerpool.batchSize.desc': 'clusters.workerpool.batchSize.desc':
'Number of workers created simultaneously in the Worker pool', 'Number of workers created simultaneously in the Worker pool',
'clusters.create.addworker.tips': 'clusters.create.addworker.tips':
'Please make sure the <a href={link} target="_blank">prerequisites</a> for {label} are met before executing the following command.', 'Please make sure the <a href={link} target="_blank">prerequisites</a> are met before executing the following command.',
'clusters.create.addCommand.tips': 'clusters.create.addCommand.tips':
'On the Worker that needs to be added, run the following command to join it to the cluster.', 'On the Worker that needs to be added, run the following command to join it to the cluster.',
'clusters.create.addCommand.k8s.tips': 'clusters.create.addCommand.k8s.tips':
+1 -1
View File
@@ -27,7 +27,7 @@ export default {
'menu.login': 'ログイン', 'menu.login': 'ログイン',
'menu.usage': '使用状況', 'menu.usage': '使用状況',
'menu.usage.usage': '使用状況', 'menu.usage.usage': '使用状況',
'menu.billingAndUsage': '請求と使用状況', 'menu.billingAndUsage': '使用状況と請求',
'menu.billingAndUsage.usage': '使用状況', 'menu.billingAndUsage.usage': '使用状況',
'menu.404': '404', 'menu.404': '404',
'menu.settings': 'Settings', 'menu.settings': 'Settings',
+1 -1
View File
@@ -39,7 +39,7 @@ export default {
'clusters.workerpool.batchSize.desc': 'clusters.workerpool.batchSize.desc':
'Количество воркеров, создаваемых одновременно в пуле воркеров', 'Количество воркеров, создаваемых одновременно в пуле воркеров',
'clusters.create.addworker.tips': 'clusters.create.addworker.tips':
'Пожалуйста, убедитесь, что выполнены <a href={link} target="_blank">предварительные условия</a> для {label} перед выполнением следующей команды.', 'Пожалуйста, убедитесь, что выполнены <a href={link} target="_blank">предварительные условия</a> перед выполнением следующей команды.',
'clusters.create.addCommand.tips': 'clusters.create.addCommand.tips':
'На воркере, который необходимо добавить, выполните следующую команду, чтобы присоединить его к кластеру.', 'На воркере, который необходимо добавить, выполните следующую команду, чтобы присоединить его к кластеру.',
'clusters.create.addCommand.k8s.tips': 'clusters.create.addCommand.k8s.tips':
+1 -1
View File
@@ -27,7 +27,7 @@ export default {
'menu.login': 'Авторизация', 'menu.login': 'Авторизация',
'menu.usage': 'Использование', 'menu.usage': 'Использование',
'menu.usage.usage': 'Использование', 'menu.usage.usage': 'Использование',
'menu.billingAndUsage': 'Биллинг и использование', 'menu.billingAndUsage': 'Использование и биллинг',
'menu.billingAndUsage.usage': 'Использование', 'menu.billingAndUsage.usage': 'Использование',
'menu.404': 'Ошибка 404', 'menu.404': 'Ошибка 404',
'menu.resources.workers': 'Воркеры', 'menu.resources.workers': 'Воркеры',
+1 -1
View File
@@ -39,7 +39,7 @@ export default {
'clusters.workerpool.batchSize.desc': 'clusters.workerpool.batchSize.desc':
'İşçi havuzunda eşzamanlı olarak oluşturulan işçi düğüm sayısı', 'İşçi havuzunda eşzamanlı olarak oluşturulan işçi düğüm sayısı',
'clusters.create.addworker.tips': 'clusters.create.addworker.tips':
'Aşağıdaki komutu çalıştırmadan önce lütfen {label} için <a href={link} target="_blank">ön koşulların</a> karşılandığından emin olun.', 'Aşağıdaki komutu çalıştırmadan önce lütfen <a href={link} target="_blank">ön koşulların</a> karşılandığından emin olun.',
'clusters.create.addCommand.tips': 'clusters.create.addCommand.tips':
'Eklenmesi gereken İşçi Düğümde, kümeye katılması için aşağıdaki komutu çalıştırın.', 'Eklenmesi gereken İşçi Düğümde, kümeye katılması için aşağıdaki komutu çalıştırın.',
'clusters.create.addCommand.k8s.tips': 'clusters.create.addCommand.k8s.tips':
+1 -1
View File
@@ -34,7 +34,7 @@ export default {
'menu.login': 'Giriş', 'menu.login': 'Giriş',
'menu.usage': 'Kullanım', 'menu.usage': 'Kullanım',
'menu.usage.usage': 'Kullanım', 'menu.usage.usage': 'Kullanım',
'menu.billingAndUsage': 'Faturalandırma ve Kullanım', 'menu.billingAndUsage': 'Kullanım ve Faturalandırma',
'menu.billingAndUsage.usage': 'Kullanım', 'menu.billingAndUsage.usage': 'Kullanım',
'menu.404': '404', 'menu.404': '404',
'menu.resources.clusters': 'Kümeler', 'menu.resources.clusters': 'Kümeler',
+1 -1
View File
@@ -38,7 +38,7 @@ export default {
'clusters.create.noRegions': '无可用的区域', 'clusters.create.noRegions': '无可用的区域',
'clusters.workerpool.batchSize.desc': '节点池中同时创建的节点数量。', 'clusters.workerpool.batchSize.desc': '节点池中同时创建的节点数量。',
'clusters.create.addworker.tips': 'clusters.create.addworker.tips':
'在执行以下命令之前,请确保已满足 {label} 的<a href={link} target="_blank">先决条件</a>。', '在执行以下命令之前,请确保已满足<a href={link} target="_blank">先决条件</a>。',
'clusters.create.addCommand.tips': 'clusters.create.addCommand.tips':
'在需要添加的节点上运行以下命令,将其加入到集群中。', '在需要添加的节点上运行以下命令,将其加入到集群中。',
'clusters.create.addCommand.k8s.tips': 'clusters.create.addCommand.k8s.tips':
+1 -1
View File
@@ -2,7 +2,7 @@ export default {
'dashboard.workers': '节点', 'dashboard.workers': '节点',
'dashboard.deployments': '部署', 'dashboard.deployments': '部署',
'dashboard.clusters': '集群', 'dashboard.clusters': '集群',
'dashboard.totalgpus': 'GPUs', 'dashboard.totalgpus': 'GPU',
'dashboard.systemload': '系统负载', 'dashboard.systemload': '系统负载',
'dashboard.memory': '内存', 'dashboard.memory': '内存',
'dashboard.vram': '显存', 'dashboard.vram': '显存',
+1 -1
View File
@@ -29,7 +29,7 @@ export default {
'menu.login': '登录', 'menu.login': '登录',
'menu.usage': '使用量', 'menu.usage': '使用量',
'menu.usage.usage': '使用量', 'menu.usage.usage': '使用量',
'menu.billingAndUsage': '计费与用量', 'menu.billingAndUsage': '用量与计费',
'menu.billingAndUsage.usage': '用量统计', 'menu.billingAndUsage.usage': '用量统计',
'menu.404': '404', 'menu.404': '404',
'menu.resources.workers': '节点', 'menu.resources.workers': '节点',
@@ -36,9 +36,7 @@ const SelectVendor: React.FC<AddWorkerStepProps> = ({ disabled }) => {
// for the Kubernetes provider; other providers stay single-select. // for the Kubernetes provider; other providers stay single-select.
const multiCapable = provider === ProviderValueMap.Kubernetes; const multiCapable = provider === ProviderValueMap.Kubernetes;
const [selectedKeys, setSelectedKeys] = useState<string[]>([ const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
GPUDriverMap.NVIDIA
]);
// No vendor is gated anymore — every card stays selectable. // No vendor is gated anymore — every card stays selectable.
const availableKeys = undefined; const availableKeys = undefined;
@@ -49,18 +47,6 @@ const SelectVendor: React.FC<AddWorkerStepProps> = ({ disabled }) => {
{} {}
); );
// Push current selection into the shared summary so consumers
// (K8sRunCommand, CheckEnvironment, VendorNotes) can read it.
useEffect(() => {
const primary = selectedKeys[0] || '';
updateField('currentGPU', primary);
updateField('selectedGPUs', selectedKeys);
updateField(
'workerCommand',
primary ? buildWorkerCommand(primary, itemMetaRef.current[primary]) : null
);
}, [selectedKeys]);
useEffect(() => { useEffect(() => {
const unregister1 = registerField('currentGPU'); const unregister1 = registerField('currentGPU');
const unregister2 = registerField('workerCommand'); const unregister2 = registerField('workerCommand');
@@ -72,6 +58,29 @@ const SelectVendor: React.FC<AddWorkerStepProps> = ({ disabled }) => {
}; };
}, []); }, []);
const buildSelectedKeys = (key: string) => {
const prev = [...selectedKeys];
const has = prev.includes(key);
if (has) {
// Clicking a selected card always toggles it off.
return prev.filter((v) => v !== key);
}
// K8s clusters support multiple GPU runtimes, so accumulate picks.
// Other providers stay single-select and replace the current pick.
if (multiCapable) return [...prev, key];
return [key];
};
const updateFieldsOnSelect = (keys: string[]) => {
const primary = keys[0] || '';
updateField('currentGPU', primary);
updateField('selectedGPUs', keys);
updateField(
'workerCommand',
primary ? buildWorkerCommand(primary, itemMetaRef.current[primary]) : null
);
};
const handleSelect = (key: string, item: any) => { const handleSelect = (key: string, item: any) => {
if (item) { if (item) {
itemMetaRef.current[key] = { itemMetaRef.current[key] = {
@@ -79,19 +88,25 @@ const SelectVendor: React.FC<AddWorkerStepProps> = ({ disabled }) => {
link: item.link link: item.link
}; };
} }
setSelectedKeys((prev) => { const keys = buildSelectedKeys(key);
const has = prev.includes(key); updateFieldsOnSelect(keys);
if (has) { setSelectedKeys(keys);
// Clicking a selected card always toggles it off.
return prev.filter((v) => v !== key);
}
// K8s clusters support multiple GPU runtimes, so accumulate picks.
// Other providers stay single-select and replace the current pick.
if (multiCapable) return [...prev, key];
return [key];
});
}; };
useEffect(() => {
// init a default selection
handleSelect(GPUDriverMap.NVIDIA, {
label: 'NVIDIA',
hiddenTitle: true,
value: GPUDriverMap.NVIDIA,
description: '',
key: GPUDriverMap.NVIDIA,
locale: false,
notes: AddWorkerDockerNotes[GPUDriverMap.NVIDIA],
link: 'https://docs.gpustack.ai/latest/installation/requirements/#nvidia-gpu'
});
}, []);
return ( return (
<StepCollapse <StepCollapse
disabled={disabled} disabled={disabled}