import { useState } from 'react'; import type { ParserDiagnostic } from '../onenote/model/diagnostics.js'; import { DEFAULT_UI_RENDER_LIMITS, limitUiString, resolveUiLimit, } from './ui-render-budget.js'; interface DiagnosticsPanelProps { diagnostics: ParserDiagnostic[]; title?: string; pageSize?: number; } function formatOffset(offset: number): string { return `0x${offset.toString(16).toUpperCase()}`; } export function DiagnosticsPanel({ diagnostics, title = 'Diagnostics', pageSize: requestedPageSize, }: DiagnosticsPanelProps) { const [requestedPage, setRequestedPage] = useState(0); const pageSize = resolveUiLimit( requestedPageSize, DEFAULT_UI_RENDER_LIMITS.maxDiagnosticsPerPage ); const pageCount = Math.max(1, Math.ceil(diagnostics.length / pageSize)); const page = Math.min(requestedPage, pageCount - 1); const firstDiagnostic = page * pageSize; const limitedTitle = limitUiString( title, DEFAULT_UI_RENDER_LIMITS.maxPanelTitleCharacters ); const displayedDiagnostics = diagnostics .slice(firstDiagnostic, firstDiagnostic + pageSize) .map((diagnostic, index) => { const code = limitUiString( diagnostic.code, DEFAULT_UI_RENDER_LIMITS.maxDiagnosticCodeCharacters ); const message = limitUiString( diagnostic.message, DEFAULT_UI_RENDER_LIMITS.maxDiagnosticMessageCharacters ); const structure = diagnostic.structure === undefined ? undefined : limitUiString( diagnostic.structure, DEFAULT_UI_RENDER_LIMITS.maxDiagnosticContextCharacters ); const propertyId = diagnostic.propertyId === undefined ? undefined : limitUiString( diagnostic.propertyId, DEFAULT_UI_RENDER_LIMITS.maxDiagnosticContextCharacters ); return { diagnostic, index: firstDiagnostic + index, code: code.value, message: message.value, structure: structure?.value, propertyId: propertyId?.value, truncated: code.truncated || message.truncated || structure?.truncated === true || propertyId?.truncated === true, }; }); const textTruncated = limitedTitle.truncated || displayedDiagnostics.some((diagnostic) => diagnostic.truncated); return (

Parser details

{limitedTitle.value}

{diagnostics.length}
{diagnostics.length === 0 ? (

No parser diagnostics for this view.

) : ( )} {diagnostics.length > 0 ? ( ) : null} {textTruncated ? (

Long diagnostic text was shortened for safe browser display.

) : null}
); }