'use client'; import { useState } from 'react'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from '@/components/ui/sheet'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import type { PolicySettingSearchResult } from '@/lib/actions/policySettings'; import type { PolicySettingRow } from '@/lib/types/policy-table'; import { PolicyTypeBadge } from './PolicyTypeBadge'; import { formatDistanceToNow } from 'date-fns'; import { de } from 'date-fns/locale'; import { Copy, ExternalLink, Check } from 'lucide-react'; import { useCopyToClipboard } from '@/lib/hooks/useCopyToClipboard'; import { getIntunePortalLink } from '@/lib/utils/policy-table-helpers'; interface PolicyDetailSheetProps { policy: PolicySettingSearchResult | PolicySettingRow | null; open: boolean; onOpenChange: (open: boolean) => void; } function isJsonString(str: string): boolean { if (!str || typeof str !== 'string') return false; const trimmed = str.trim(); return trimmed.startsWith('{') || trimmed.startsWith('['); } function formatJson(value: string): string { try { const parsed = JSON.parse(value); return JSON.stringify(parsed, null, 2); } catch { return value; } } export function PolicyDetailSheet({ policy, open, onOpenChange, }: PolicyDetailSheetProps) { const [activeTab, setActiveTab] = useState<'details' | 'raw'>('details'); const { copy, isCopied } = useCopyToClipboard(); if (!policy) return null; const isJson = isJsonString(policy.settingValue); const displayValue = isJson ? formatJson(policy.settingValue) : policy.settingValue; // Handle both PolicySettingRow (has graphPolicyId) and PolicySettingSearchResult (has id) const policyId = 'graphPolicyId' in policy ? policy.graphPolicyId : policy.id; const intuneUrl = getIntunePortalLink(policy.policyType, policyId); const handleCopyField = (value: string, fieldName: string) => { copy(value, `${fieldName} copied to clipboard`); }; const handleOpenInIntune = () => { if (intuneUrl) { window.open(intuneUrl, '_blank', 'noopener,noreferrer'); } else { // Fallback: copy policy ID copy(policyId, 'Policy ID copied to clipboard'); } }; // Generate raw JSON for the entire policy object const rawJson = JSON.stringify(policy, null, 2); return ( {policy.settingName} {intuneUrl && ( )} Policy Setting Details {/* Tabs */}
{/* Details Tab */} {activeTab === 'details' && (
{/* Policy Name */}

Policy Name

{policy.policyName}

{/* Policy Type */}

Policy Type

{/* Setting Name */}

Setting Name

{policy.settingName}

{/* Setting Value */}

Setting Value

{isJson ? (
                {displayValue}
              
) : (

{displayValue}

)}
{/* Graph Policy ID */}

Graph Policy ID

{policyId}

{/* Last Synced */}

Last Synced

{formatDistanceToNow(new Date(policy.lastSyncedAt), { addSuffix: true, locale: de, })}

{new Date(policy.lastSyncedAt).toLocaleString('de-DE')}

{/* Open in Intune Button */}
{intuneUrl ? ( ) : ( )}
)} {/* Raw JSON Tab */} {activeTab === 'raw' && (

Complete Policy Object

              {rawJson}
            
)}
); }