diff --git a/DebugProbe.AspNetCore/Resources/css/debugprobe.css b/DebugProbe.AspNetCore/Resources/css/debugprobe.css index 92db731..b777aed 100644 --- a/DebugProbe.AspNetCore/Resources/css/debugprobe.css +++ b/DebugProbe.AspNetCore/Resources/css/debugprobe.css @@ -178,6 +178,16 @@ pre { text-align: left; } +.json-error { + font-size: 12px; + padding: 4px 8px; + margin-bottom: 4px; + border-radius: 6px; + background: rgba(231, 76, 60, 0.12); + color: #ff8a8a; + border: 1px solid rgba(231, 76, 60, 0.25); +} + /* ========================= Diff ========================= */ @@ -203,6 +213,24 @@ pre { border-left-color: #f1c40f; } +.diff-line-invalid { + background: rgba(231, 76, 60, 0.18); + border-left: 3px solid #e74c3c; +} + +.diff-badge { + min-width: 22px; + height: 22px; + border-radius: 999px; + background: #e74c3c; + color: #fff; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: bold; +} + /* ========================= Buttons ========================= */ @@ -302,15 +330,11 @@ pre { } .accordion-header { - /*min-height: 56px;*/ display: flex; justify-content: space-between; align-items: center; - padding: 14px 10px; cursor: pointer; - user-select: none; - background: #fafafa; - border-bottom: 1px solid #eee; + padding: 18px; } .accordion-header:hover { @@ -323,12 +347,9 @@ pre { } .accordion-meta { - font-size: 22px; - color: #777; - font-weight: 300; - width: 24px; - text-align: center; - flex-shrink: 0; + display: flex; + align-items: center; + gap: 10px; } .accordion-body { diff --git a/DebugProbe.AspNetCore/Resources/js/debugprobe-compare.js b/DebugProbe.AspNetCore/Resources/js/debugprobe-compare.js index f0d1d0e..4b74461 100644 --- a/DebugProbe.AspNetCore/Resources/js/debugprobe-compare.js +++ b/DebugProbe.AspNetCore/Resources/js/debugprobe-compare.js @@ -31,29 +31,53 @@ function setCompareResult(html) { } function renderCompare(result) { + + const environmentRows = [ + { field: 'Environment', local: result.environment?.local, remote: result.environment?.remote }, + { field: 'Culture', local: result.culture?.local, remote: result.culture?.remote } + ]; + var environmentRowsChangedCount = getChangedCount(environmentRows); + + const overviewRows = [ + { field: 'Method', local: result.method?.local, remote: result.method?.remote }, + { field: 'Path', local: result.path?.local, remote: result.path?.remote }, + { field: 'Status', local: result.status?.local, remote: result.status?.remote }, + { field: 'Request Time', local: result.requestTime?.local, remote: result.requestTime?.remote } + ]; + var overviewRowsChangedCount = getChangedCount(overviewRows); + + const localRequestBodyJson = result.requestBody?.local || '' + const remoteRequestBodyJson = result.requestBody?.remote || '' + const requestComparison = compareJsonBodies(localRequestBodyJson, remoteRequestBodyJson); + + const localResponseBodyJson = result.responseBody?.local || '' + const remoteResponseBodyJson = result.responseBody?.remote || '' + const responseComparison = compareJsonBodies(localResponseBodyJson, remoteResponseBodyJson); + return [ renderAccordionSection( 'Environment', - renderSectionRows([ - { field: 'Environment', local: result.environment?.local, remote: result.environment?.remote }, - { field: 'Culture', local: result.culture?.local, remote: result.culture?.remote } - ]) + renderSectionRows(environmentRows), + environmentRowsChangedCount > 0 ? true : false, + environmentRowsChangedCount ), - renderAccordionSection( 'Overview', - renderSectionRows([ - { field: 'Method', local: result.method?.local, remote: result.method?.remote }, - { field: 'Path', local: result.path?.local, remote: result.path?.remote }, - { field: 'Status', local: result.status?.local, remote: result.status?.remote }, - { field: 'Request Time', local: result.requestTime?.local, remote: result.requestTime?.remote } - ]), - true // expanded by default + renderSectionRows(overviewRows), + overviewRowsChangedCount > 0 ? true : false, + overviewRowsChangedCount ), - - renderAccordionSection('Request', renderSideBySideJson(result.requestBody)), - - renderAccordionSection('Response', renderSideBySideJson(result.responseBody) + renderAccordionSection( + 'Request', + renderSideBySideJson(requestComparison, localRequestBodyJson, remoteRequestBodyJson), + requestComparison.changes > 0 ? true : false, + requestComparison.changes + ), + renderAccordionSection( + 'Response', + renderSideBySideJson(responseComparison, localResponseBodyJson, remoteResponseBodyJson), + responseComparison.changes > 0 ? true : false, + responseComparison.changes ) ].join(''); } @@ -82,31 +106,34 @@ function renderSectionRows(rows) { `; } -function renderSideBySideJson(data) { - const localJson = data?.local || ''; - const remoteJson = data?.remote || ''; - const comparison = compareJsonBodies(localJson, remoteJson); +function renderSideBySideJson(comparison, localJson, remoteJson) { return `