diff --git a/packages/html-reporter/src/copyToClipboard.tsx b/packages/html-reporter/src/copyToClipboard.tsx index 17b1dfbf95..8171cdd6c3 100644 --- a/packages/html-reporter/src/copyToClipboard.tsx +++ b/packages/html-reporter/src/copyToClipboard.tsx @@ -39,7 +39,7 @@ export const CopyToClipboard: React.FunctionComponent = ({ }); }, [value]); const iconElement = icon === 'check' ? icons.check() : icon === 'cross' ? icons.cross() : icons.copy(); - return ; + return ; }; type CopyToClipboardContainerProps = CopyToClipboardProps & { diff --git a/packages/html-reporter/src/metadataView.css b/packages/html-reporter/src/metadataView.css index 70d6ba78ab..0ea739cc2f 100644 --- a/packages/html-reporter/src/metadataView.css +++ b/packages/html-reporter/src/metadataView.css @@ -26,16 +26,43 @@ margin-top: 8px; } +.metadata-view .metadata-section { + margin: 8px 10px 8px 32px; +} + +.metadata-view span:not(.copy-button-container), +.metadata-view a { + display: inline-block; + line-height: 24px; +} + +.metadata-section { + align-items: center; +} + +.metadata-properties > div { + height: 24px; +} + +.metadata-properties > div:not(:last-of-type) { + margin-bottom: 8px; +} + .metadata-separator { height: 1px; border-bottom: 1px solid var(--color-border-default); } -.metadata-view .copy-value-container { - margin-top: -2px; -} - .git-commit-info a { color: var(--color-fg-default); font-weight: 600; } + +.copyable-property { + white-space: pre; +} + +.copyable-property > span { + display: flex; + align-items: center; +} diff --git a/packages/html-reporter/src/metadataView.tsx b/packages/html-reporter/src/metadataView.tsx index ed050f4480..8ddd0574d6 100644 --- a/packages/html-reporter/src/metadataView.tsx +++ b/packages/html-reporter/src/metadataView.tsx @@ -31,7 +31,6 @@ export const MetadataContext = React.createContext([]); export function MetadataProvider({ metadata, children }: React.PropsWithChildren<{ metadata: Metadata }>) { const entries = React.useMemo(() => { // TODO: do not plumb actualWorkers through metadata. - return Object.entries(metadata).filter(([key]) => key !== 'actualWorkers'); }, [metadata]); @@ -88,30 +87,47 @@ const InnerMetadataView = () => { {entries.length > 0 &&
} } - {entries.map(([key, value]) => { +
+ {entries.map(([propertyName, value]) => { const valueString = typeof value !== 'object' || value === null || value === undefined ? String(value) : JSON.stringify(value); const trimmedValue = valueString.length > 1000 ? valueString.slice(0, 1000) + '\u2026' : valueString; - return
- {key} + return ( +
+ + {propertyName} + : {linkifyText(trimmedValue)} + +
+ ); + return
+ {propertyName} {valueString && : {linkifyText(trimmedValue)}}
; })} +
; }; const GitCommitInfoView: React.FC<{ info: GitCommitInfo }> = ({ info }) => { const email = info['revision.email'] ? ` <${info['revision.email']}>` : ''; const author = `${info['revision.author'] || ''}${email}`; + const subject = info['revision.subject'] || ''; const shortTimestamp = Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(info['revision.timestamp']); const longTimestamp = Intl.DateTimeFormat(undefined, { dateStyle: 'full', timeStyle: 'long' }).format(info['revision.timestamp']); - return
-
- - {info['revision.subject'] || ''} - -
-
{author}
-
on {shortTimestamp}
+ return
+
+
+ {info['revision.link'] ? ( + + {subject} + + ) : + {subject} + } +
+
+ {author} + on {shortTimestamp} {info['ci.link'] && ( <> ยท @@ -126,9 +142,10 @@ const GitCommitInfoView: React.FC<{ info: GitCommitInfo }> = ({ info }) => { )}
- {!!info['revision.link'] && - {info['revision.id']?.slice(0, 7) || 'unknown'} - } - {!info['revision.link'] && !!info['revision.id'] && {info['revision.id'].slice(0, 7)}} + {!!info['revision.link'] ? ( + + {info['revision.id']?.slice(0, 7) || 'unknown'} + + ) : !!info['revision.id'] && {info['revision.id'].slice(0, 7)}}
; };