фикс фикса
This commit is contained in:
parent
36a94d3a66
commit
e51e895d37
1 changed files with 44 additions and 56 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue