фикс фикса

This commit is contained in:
dv 2026-04-10 11:28:17 +03:00
parent 36a94d3a66
commit e51e895d37

View file

@ -38,7 +38,6 @@ import { useNavigate, useParams } from 'react-router-dom'
import {
useDeleteDevice,
useDeleteAllDevices,
useForceDeleteObject,
useDiscoverObject,
useDevices,
useObject,
@ -130,6 +129,20 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
const [mode, setMode] = useState<Mode>(defaultMode)
const [editMode, setEditMode] = useState(false)
const toggleMode = () => setMode((m) => (m === 'inventory' ? 'work' : 'inventory'))
useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => {
const tag = (e.target as HTMLElement).tagName
if (e.code === 'Space' && tag !== 'INPUT' && tag !== 'TEXTAREA') {
e.preventDefault()
toggleMode()
}
}
document.addEventListener('keydown', handleKeyDown)
return () => document.removeEventListener('keydown', handleKeyDown)
}, [])
const { data: obj, isLoading: objLoading } = useObject(objId)
const { data: devices, isLoading: devLoading } = useDevices(objId)
const { data: racks } = useRacks(objId)
@ -144,7 +157,6 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
const createZone = useCreateZone(objId)
const deleteZone = useDeleteZone(objId)
const deleteAllDevices = useDeleteAllDevices(objId)
const forceDeleteObject = useForceDeleteObject()
const createTask = useCreateTask()
const [deviceModal, setDeviceModal] = useState(false)
@ -196,24 +208,6 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
}
}
const handleDeleteObject = () => {
Modal.confirm({
title: `Удалить объект «${obj?.name}»?`,
content: `Будут удалены все устройства (${devices?.length ?? 0} шт.) и сам объект. Это действие необратимо.`,
okText: 'Удалить',
cancelText: 'Отмена',
okButtonProps: { danger: true },
onOk: async () => {
try {
await forceDeleteObject.mutateAsync(objId)
message.success('Объект удалён')
navigate('/inventory/objects')
} catch {
message.error('Ошибка при удалении объекта')
}
},
})
}
const openTaskModal = (scope: object, title: string) => {
setTaskModal({ scope, title })
@ -319,9 +313,8 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
if (servers.length > 0) {
addGroup('Серверная инфраструктура', '__servers__', servers, {
type: 'category',
object_id: objId,
category: 'main_server',
type: 'device_list',
ids: servers.map((d) => d.id),
})
}
@ -594,14 +587,16 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
<Row justify="space-between" align="middle" style={{ marginBottom: 16 }}>
<Col><Breadcrumb items={breadcrumbItems} /></Col>
<Col>
<Segmented
value={mode}
options={[
{ label: 'Инвентарь', value: 'inventory', icon: <DatabaseOutlined /> },
{ label: 'Работа', value: 'work', icon: <ControlOutlined /> },
]}
onChange={(val) => setMode(val as Mode)}
/>
<div onClick={toggleMode} style={{ cursor: 'pointer' }}>
<Segmented
value={mode}
options={[
{ label: 'Инвентарь', value: 'inventory', icon: <DatabaseOutlined /> },
{ label: 'Работа', value: 'work', icon: <ControlOutlined /> },
]}
onChange={() => {}}
/>
</div>
</Col>
</Row>
@ -630,9 +625,24 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
<Button icon={<ThunderboltOutlined />} onClick={() => setRackModal(true)}>
Стойки и зоны
</Button>
<Button danger icon={<DeleteOutlined />} onClick={handleDeleteObject} loading={forceDeleteObject.isPending}>
Удалить объект
</Button>
<Popconfirm
title="Удалить все устройства?"
description={`Будет удалено ${devices?.length ?? 0} устройств. Отменить нельзя.`}
okText="Удалить все"
cancelText="Отмена"
okButtonProps={{ danger: true }}
onConfirm={handleDeleteAllDevices}
disabled={!devices?.length}
>
<Button
danger
icon={<DeleteOutlined />}
loading={deleteAllDevices.isPending}
disabled={!devices?.length}
>
Удалить все устройства
</Button>
</Popconfirm>
</Space>
) : (
<Space wrap>
@ -678,28 +688,6 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
)}
</Space>
</Col>
{mode === 'inventory' && editMode && (
<Col>
<Popconfirm
title="Удалить все устройства?"
description={`Будет удалено ${devices?.length ?? 0} устройств. Отменить нельзя.`}
okText="Удалить все"
cancelText="Отмена"
okButtonProps={{ danger: true }}
onConfirm={handleDeleteAllDevices}
disabled={!devices?.length}
>
<Button
danger
icon={<DeleteOutlined />}
loading={deleteAllDevices.isPending}
disabled={!devices?.length}
>
Удалить все устройства
</Button>
</Popconfirm>
</Col>
)}
</Row>
<Table