// frontend\src\pages\devices\CameraDetailsModal.tsx import { type FormEvent } from 'react' import { XMarkIcon } from '@heroicons/react/24/outline' import { CheckIcon, VideoCameraIcon, } from '@heroicons/react/20/solid' import Modal from '../../components/Modal' import Button from '../../components/Button' import Switch from '../../components/Switch' import LoadingSpinner from '../../components/LoadingSpinner' import type { Device, MilestoneCameraDetail } from '../../components/types' type CameraDetailsModalProps = { open: boolean setOpen: (open: boolean) => void device: Device | null childDevice: NonNullable[number] | null camera: MilestoneCameraDetail | null isLoading: boolean isSaving: boolean error: string | null onSubmit: (event: FormEvent) => void } function inputClassName(disabled = false) { return [ 'block w-full rounded-md px-3 py-1.5 text-sm outline-1 -outline-offset-1', 'bg-white text-gray-900 outline-gray-300', 'focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600', 'dark:bg-white/5 dark:text-white dark:outline-white/10 dark:focus:outline-indigo-500', disabled && 'cursor-not-allowed bg-gray-50 text-gray-500 dark:bg-white/10 dark:text-gray-400', ] .filter(Boolean) .join(' ') } export default function CameraDetailsModal({ open, setOpen, device, childDevice, camera, isLoading, isSaving, error, onSubmit, }: CameraDetailsModalProps) { const title = childDevice?.displayName || childDevice?.name || 'Kamera bearbeiten' const streams = camera?.streams ?? [] const selectedRecordingStorageLabel = camera?.recordingStorage ? camera.recordingStorage.displayName || camera.recordingStorage.name || camera.recordingStorage.id : '' const recordingStorageOptions = (() => { const options = new Map() if (camera?.recordingStorage?.id) { options.set(camera.recordingStorage.id, selectedRecordingStorageLabel) } for (const storage of camera?.archiveStorages ?? []) { options.set( storage.id, storage.displayName || storage.name || storage.id, ) } return Array.from(options.entries()).map(([value, label]) => ({ value, label, })) })() return (

{device?.milestoneDisplayName || device?.inventoryNumber || 'Milestone-Kamera'}

{isLoading && (
)} {error && (
{error}
)} {!isLoading && camera && (

Allgemein

Basisdaten und Aufzeichnungsoptionen der Kamera.

{camera.recordingStorage?.id && (

Gewählt: {selectedRecordingStorageLabel} {camera.recordingStorage.diskPath ? ` · ${camera.recordingStorage.diskPath}` : ''} {camera.recordingStorage.mounted === false ? ' · nicht gemountet' : ''}

)}

Streams

Codec, FPS, Auflösung und Qualität je Stream.

{streams.length === 0 ? (

Keine Streams gefunden.

) : ( streams.map((stream, index) => (
{`Stream ${index + 1}`}

Index: {stream.index}

)) )}
)}
) }