feat(zigbee): import to pending section with edge persistence
Coordinator auto-approves to a canvas Node; routers/end devices land in pending_devices keyed by IEEE. Discovered parent->child edges are stored in pending_device_links so that approving a pending device later auto-creates the Edge once both endpoints exist as canvas Nodes. - new POST /api/v1/zigbee/import-pending (default mode in modal) - new pending_device_links table; ieee_address on nodes + pending_devices - pending_devices.ip migrated to nullable (table rebuild on existing DBs) - approve / bulk-approve return auto-created edges; sidebar pushes them into the canvas store with bottom -> top-t handles - ZigbeeImportModal: radio toggle pending vs canvas; reset on close - PendingDeviceModal: zigbee badge, IEEE/LQI/vendor/model rows, services hidden for zigbee - Sidebar pending row: ZIG source badge, LQI badge, friendly_name fallback - SearchBar: null-safe IP, also searches friendly_name and ieee_address - Tooltip trigger uses asChild to avoid nested-button hydration error
This commit is contained in:
@@ -540,6 +540,26 @@ export default function App() {
|
||||
open={zigbeeImportOpen}
|
||||
onClose={() => setZigbeeImportOpen(false)}
|
||||
onAddToCanvas={handleZigbeeAddToCanvas}
|
||||
onPendingImported={(coordinator) => {
|
||||
useCanvasStore.getState().notifyScanDeviceFound()
|
||||
if (coordinator) {
|
||||
const exists = useCanvasStore.getState().nodes.some((n) => n.id === coordinator.id)
|
||||
if (!exists) {
|
||||
addNode({
|
||||
id: coordinator.id,
|
||||
type: 'zigbee_coordinator',
|
||||
position: { x: 600, y: 100 },
|
||||
data: {
|
||||
label: coordinator.label,
|
||||
type: 'zigbee_coordinator' as NodeData['type'],
|
||||
status: 'unknown' as const,
|
||||
services: [],
|
||||
},
|
||||
})
|
||||
markUnsaved()
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user