фикс фикса

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 { import {
useDeleteDevice, useDeleteDevice,
useDeleteAllDevices, useDeleteAllDevices,
useForceDeleteObject,
useDiscoverObject, useDiscoverObject,
useDevices, useDevices,
useObject, useObject,
@ -130,6 +129,20 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
const [mode, setMode] = useState<Mode>(defaultMode) const [mode, setMode] = useState<Mode>(defaultMode)
const [editMode, setEditMode] = useState(false) 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: obj, isLoading: objLoading } = useObject(objId)
const { data: devices, isLoading: devLoading } = useDevices(objId) const { data: devices, isLoading: devLoading } = useDevices(objId)
const { data: racks } = useRacks(objId) const { data: racks } = useRacks(objId)
@ -144,7 +157,6 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
const createZone = useCreateZone(objId) const createZone = useCreateZone(objId)
const deleteZone = useDeleteZone(objId) const deleteZone = useDeleteZone(objId)
const deleteAllDevices = useDeleteAllDevices(objId) const deleteAllDevices = useDeleteAllDevices(objId)
const forceDeleteObject = useForceDeleteObject()
const createTask = useCreateTask() const createTask = useCreateTask()
const [deviceModal, setDeviceModal] = useState(false) 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) => { const openTaskModal = (scope: object, title: string) => {
setTaskModal({ scope, title }) setTaskModal({ scope, title })
@ -319,9 +313,8 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
if (servers.length > 0) { if (servers.length > 0) {
addGroup('Серверная инфраструктура', '__servers__', servers, { addGroup('Серверная инфраструктура', '__servers__', servers, {
type: 'category', type: 'device_list',
object_id: objId, ids: servers.map((d) => d.id),
category: 'main_server',
}) })
} }
@ -594,14 +587,16 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
<Row justify="space-between" align="middle" style={{ marginBottom: 16 }}> <Row justify="space-between" align="middle" style={{ marginBottom: 16 }}>
<Col><Breadcrumb items={breadcrumbItems} /></Col> <Col><Breadcrumb items={breadcrumbItems} /></Col>
<Col> <Col>
<Segmented <div onClick={toggleMode} style={{ cursor: 'pointer' }}>
value={mode} <Segmented
options={[ value={mode}
{ label: 'Инвентарь', value: 'inventory', icon: <DatabaseOutlined /> }, options={[
{ label: 'Работа', value: 'work', icon: <ControlOutlined /> }, { label: 'Инвентарь', value: 'inventory', icon: <DatabaseOutlined /> },
]} { label: 'Работа', value: 'work', icon: <ControlOutlined /> },
onChange={(val) => setMode(val as Mode)} ]}
/> onChange={() => {}}
/>
</div>
</Col> </Col>
</Row> </Row>
@ -630,9 +625,24 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
<Button icon={<ThunderboltOutlined />} onClick={() => setRackModal(true)}> <Button icon={<ThunderboltOutlined />} onClick={() => setRackModal(true)}>
Стойки и зоны Стойки и зоны
</Button> </Button>
<Button danger icon={<DeleteOutlined />} onClick={handleDeleteObject} loading={forceDeleteObject.isPending}> <Popconfirm
Удалить объект title="Удалить все устройства?"
</Button> 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>
) : ( ) : (
<Space wrap> <Space wrap>
@ -678,28 +688,6 @@ export function ObjectDetailPage({ defaultMode = 'inventory' }: { defaultMode?:
)} )}
</Space> </Space>
</Col> </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> </Row>
<Table <Table