diff --git a/frontend/src/pages/InventoryObjectDetail.tsx b/frontend/src/pages/InventoryObjectDetail.tsx index 0fb5a26..7b2ef9a 100644 --- a/frontend/src/pages/InventoryObjectDetail.tsx +++ b/frontend/src/pages/InventoryObjectDetail.tsx @@ -53,7 +53,7 @@ import { type DeviceImportPreview, type DeviceItem, } from '../api/objects' -import { useRacks, useCreateRack, useDeleteRack, type RackItem } from '../api/racks' +import { useRacks, useCreateRack, useUpdateRack, useDeleteRack, type RackItem } from '../api/racks' import { useZones, useCreateZone, useDeleteZone, type ZoneItem } from '../api/zones' import { CategoryTag, DeviceStatusBadge } from '../components/StatusBadge' import { DiscoveryDrawer } from '../components/DiscoveryDrawer' @@ -113,6 +113,7 @@ export function InventoryObjectDetailPage() { const previewCSV = usePreviewCSV(objId) const importCSV = useImportCSV(objId) const createRack = useCreateRack(objId) + const updateRack = useUpdateRack(objId) const deleteRack = useDeleteRack(objId) const createZone = useCreateZone(objId) const deleteZone = useDeleteZone(objId) @@ -126,6 +127,7 @@ export function InventoryObjectDetailPage() { const [sheetsModal, setSheetsModal] = useState(false) const [discoveryTaskId, setDiscoveryTaskId] = useState(null) const [discoveryOpen, setDiscoveryOpen] = useState(false) + const [editRack, setEditRack] = useState(null) const [csvFile, setCsvFile] = useState(null) const [csvPreview, setCsvPreview] = useState(null) const [searchText, setSearchText] = useState('') @@ -134,6 +136,7 @@ export function InventoryObjectDetailPage() { const [rackForm] = Form.useForm() const [zoneForm] = Form.useForm() const [sheetsForm] = Form.useForm() + const [editRackForm] = Form.useForm() const rackOptions = useMemo( () => (racks ?? []).map((r) => ({ value: r.id, label: r.name })), @@ -315,6 +318,26 @@ export function InventoryObjectDetailPage() { } } + const openEditRack = (row: RackItem) => { + editRackForm.setFieldsValue({ + rack_type: row.rack_type ?? '', + location: row.location ?? '', + }) + setEditRack(row) + } + + const handleSaveRack = async () => { + if (!editRack) return + const values = editRackForm.getFieldsValue() + try { + await updateRack.mutateAsync({ id: editRack.id, body: stripEmpty(values) as any }) + message.success('Стойка обновлена') + setEditRack(null) + } catch { + message.error('Ошибка при обновлении стойки') + } + } + const filteredDevices = useMemo(() => { if (!searchText) return devices ?? [] const q = searchText.toLowerCase() @@ -504,27 +527,52 @@ export function InventoryObjectDetailPage() { { title: 'Название', key: 'name', - render: (_: unknown, row: RackItem) => ( - {row.name}{row.rack_type ? {row.rack_type} : null} - ), + render: (_: unknown, row: RackItem) => { + if (editRack?.id === row.id) { + return ( + + {row.name} +
+ + + + + + +
+ + +
+ ) + } + return ( + + {row.name} + {row.rack_type ? {row.rack_type} : null} + + ) + }, }, { title: 'Зона', dataIndex: 'zone_name', key: 'zone_name', render: (v: string | null) => v ? {v} : '—' }, { title: 'Расположение', dataIndex: 'location', key: 'location', render: (v: string | null) => v ?? '—' }, { title: '', key: 'actions', - width: 60, + width: 90, render: (_: unknown, row: RackItem) => ( - deleteRack.mutateAsync(row.id).catch(() => message.error('Ошибка удаления стойки'))} - > -