From 21e21b87a8ddf1fc6a7bad763b1610090bd121cf Mon Sep 17 00:00:00 2001 From: dv Date: Thu, 9 Apr 2026 14:47:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D0=B3=20=D0=BA=D0=BD=D0=BE?= =?UTF-8?q?=D0=BF=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/WorkObjectDetail.tsx | 72 +++++++++++++++++++++---- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/frontend/src/pages/WorkObjectDetail.tsx b/frontend/src/pages/WorkObjectDetail.tsx index 73edc1f..b979a04 100644 --- a/frontend/src/pages/WorkObjectDetail.tsx +++ b/frontend/src/pages/WorkObjectDetail.tsx @@ -3,6 +3,7 @@ import { DatabaseOutlined, PlayCircleOutlined, ThunderboltOutlined, + WifiOutlined, } from '@ant-design/icons' import { Breadcrumb, @@ -23,14 +24,59 @@ import { Typography, message, } from 'antd' -import { useMemo, useState } from 'react' +import { useQueryClient } from '@tanstack/react-query' +import { useEffect, useMemo, useState } from 'react' import { useNavigate, useParams } from 'react-router-dom' import { useDevices, useObject, type DeviceItem } from '../api/objects' import { useRacks } from '../api/racks' -import { useActions, useCreateTask } from '../api/tasks' +import { useActions, useCreateTask, useTask } from '../api/tasks' import { CategoryTag, DeviceStatusBadge } from '../components/StatusBadge' import dayjs from 'dayjs' +function PingButton({ + scope, + objId, + size = 'small', + children, +}: { + scope: object + objId: number + size?: 'small' | 'middle' | 'large' + children?: React.ReactNode +}) { + const [taskId, setTaskId] = useState(null) + const queryClient = useQueryClient() + const createTask = useCreateTask() + const { data: task } = useTask(taskId ?? undefined) + + useEffect(() => { + if (task && ['success', 'failed', 'partial', 'stale', 'cancelled'].includes(task.status)) { + queryClient.invalidateQueries({ queryKey: ['devices', objId] }) + setTaskId(null) + } + }, [task?.status, queryClient, objId]) + + const handlePing = async () => { + try { + const t = await createTask.mutateAsync({ type: 'ping', target_scope: scope, params: {} }) + setTaskId(t.id) + } catch { + message.error('Ошибка запуска пинга') + } + } + + return ( + + ) +} + const SERVER_CATEGORIES = new Set(['main_server', 'vm', 'router']) const COL_SPAN = 7 @@ -158,13 +204,18 @@ export function WorkObjectDetailPage() { {row.count} устройств {row.onlineCount > 0 && Online: {row.onlineCount}} {row.rackScope && ( - + <> + + Пинг + + + )} ) @@ -266,6 +317,9 @@ export function WorkObjectDetailPage() { + + Пинг объекта +