'use client'; import { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { PSATab } from './psa-tab'; import { RMMTab } from './rmm-tab'; import { AuvikTab } from './auvik-tab'; import { AddigyTab } from './addigy-tab'; import { StatusCards } from './status-cards'; import { Server, Monitor, Network, AlertCircle } from 'lucide-react'; import { ConfigurationItem } from '@/lib/types/autotask'; import { DattoRMMDevice } from '@/lib/types/datto-rmm'; import { AuvikDevice } from '@/lib/types/auvik'; import { AddigyDevice } from '@/lib/types/addigy'; interface ConfigItemDetail { autotaskDevice?: ConfigurationItem; rmmDevice?: DattoRMMDevice; auvikDevice?: AuvikDevice; addigyDevice?: AddigyDevice; companyName?: string; } interface ConfigItemModalProps { itemId: string | number | null; type?: 'autotask' | 'rmm'; open: boolean; onOpenChange: (open: boolean) => void; rmmDevice?: DattoRMMDevice; // Pass RMM device directly from comparison auvikDevice?: AuvikDevice; // Pass Auvik device directly from comparison addigyDevice?: AddigyDevice; // Pass Addigy device directly from comparison } export function ConfigItemModal({ itemId, type = 'autotask', open, onOpenChange, rmmDevice: passedRmmDevice, auvikDevice: passedAuvikDevice, addigyDevice: passedAddigyDevice }: ConfigItemModalProps) { const [data, setData] = useState({}); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!open || !itemId) { return; } const fetchData = async () => { setLoading(true); setError(null); console.log('Modal opening with:', { itemId, hasPassedRmmDevice: !!passedRmmDevice, hasPassedAuvikDevice: !!passedAuvikDevice, hasPassedAddigyDevice: !!passedAddigyDevice, passedRmmDevice, passedAuvikDevice, passedAddigyDevice }); try { // For RMM-only, Auvik-only, or Addigy-only devices, skip API call and use passed data if (itemId === 'rmm-only' || itemId === 'auvik-only' || itemId === 'addigy-only') { console.log('Using passed devices only (no Autotask record)'); setData({ autotaskDevice: undefined, rmmDevice: passedRmmDevice, auvikDevice: passedAuvikDevice, addigyDevice: passedAddigyDevice, companyName: passedRmmDevice?.siteName || passedAuvikDevice?.deviceName || passedAddigyDevice?.['Device Name'] || 'Unknown', }); setLoading(false); return; } // If we have passed devices, use lightweight endpoint that only fetches PSA data // Otherwise use full endpoint that does RMM/Auvik/Addigy matching const endpoint = (passedRmmDevice || passedAuvikDevice || passedAddigyDevice) ? `/api/configuration-items/${itemId}/lightweight` : `/api/configuration-items/${itemId}?type=${type}`; console.log(`Using ${passedRmmDevice || passedAuvikDevice ? 'lightweight' : 'full'} endpoint`); const response = await fetch(endpoint); if (!response.ok) { throw new Error('Failed to fetch configuration item'); } const result = await response.json(); console.log('Fetched result:', { hasAutotask: !!result.autotaskDevice, hasRmm: !!result.rmmDevice, hasAuvik: !!result.auvikDevice, hasAddigy: !!result.addigyDevice }); // Always prioritize passed devices over fetched data const finalData = { autotaskDevice: result.autotaskDevice, rmmDevice: passedRmmDevice || result.rmmDevice, auvikDevice: passedAuvikDevice || result.auvikDevice, addigyDevice: passedAddigyDevice || result.addigyDevice, companyName: result.companyName, }; console.log('Final data:', { hasAutotask: !!finalData.autotaskDevice, hasRmm: !!finalData.rmmDevice, hasAuvik: !!finalData.auvikDevice, hasAddigy: !!finalData.addigyDevice }); setData(finalData); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); } finally { setLoading(false); } }; fetchData(); }, [itemId, type, open, passedRmmDevice, passedAuvikDevice, passedAddigyDevice]); const handleUpdate = (updatedDevice: ConfigurationItem) => { setData({ ...data, autotaskDevice: updatedDevice }); }; const device = data.autotaskDevice; const rmmDevice = data.rmmDevice; const auvikDevice = data.auvikDevice; const addigyDevice = data.addigyDevice; return (
{device?.referenceTitle || rmmDevice?.hostname || 'Configuration Item'}
{data.companyName && (
{data.companyName}
)}
View and manage configuration item details from PSA, RMM, Auvik, and Addigy systems
{loading ? (
) : error ? (

Error: {error}

) : (
{/* Status Cards */} {/* Tabs */} PSA Data {device && ( {device.isActive ? 'Active' : 'Inactive'} )} RMM Data {rmmDevice && ( {rmmDevice.online ? 'Online' : 'Offline'} )} Auvik Data {auvikDevice && ( {auvikDevice.onlineStatus === 'online' ? 'Online' : 'Offline'} )} Addigy Data {addigyDevice && ( {addigyDevice.online ? 'Online' : 'Offline'} )}
)}
); }