chore(trace-viewer) move copy filename to clipboard directly inline with the source tab file name
This commit is contained in:
parent
7adddae499
commit
3cd2c1ef74
|
|
@ -31,3 +31,13 @@
|
||||||
box-shadow: var(--vscode-scrollbar-shadow) 0 6px 6px -6px;
|
box-shadow: var(--vscode-scrollbar-shadow) 0 6px 6px -6px;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.copy-icon.codicon {
|
||||||
|
display: block;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.source-copy-to-clipboard {
|
||||||
|
display: block;
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
@ -23,6 +23,7 @@ import { CodeMirrorWrapper } from '@web/components/codeMirrorWrapper';
|
||||||
import type { SourceHighlight } from '@web/components/codeMirrorWrapper';
|
import type { SourceHighlight } from '@web/components/codeMirrorWrapper';
|
||||||
import type { SourceLocation, SourceModel } from './modelUtil';
|
import type { SourceLocation, SourceModel } from './modelUtil';
|
||||||
import type { StackFrame } from '@protocol/channels';
|
import type { StackFrame } from '@protocol/channels';
|
||||||
|
import { CopyToClipboard } from './copyToClipboard';
|
||||||
|
|
||||||
export const SourceTab: React.FunctionComponent<{
|
export const SourceTab: React.FunctionComponent<{
|
||||||
stack: StackFrame[] | undefined,
|
stack: StackFrame[] | undefined,
|
||||||
|
|
@ -80,9 +81,24 @@ export const SourceTab: React.FunctionComponent<{
|
||||||
|
|
||||||
const showStackFrames = (stack?.length ?? 0) > 1;
|
const showStackFrames = (stack?.length ?? 0) > 1;
|
||||||
|
|
||||||
|
const getFileName = (fullPath?: string, lineNum?: number) => {
|
||||||
|
if (!fullPath)
|
||||||
|
return '';
|
||||||
|
const pathSep = fullPath?.includes('/') ? '/' : '\\';
|
||||||
|
const fileName = fullPath?.split(pathSep).pop() ?? '';
|
||||||
|
return lineNum ? `${fileName}:${lineNum}` : fileName;
|
||||||
|
};
|
||||||
|
|
||||||
return <SplitView sidebarSize={200} orientation={stackFrameLocation === 'bottom' ? 'vertical' : 'horizontal'} sidebarHidden={!showStackFrames}>
|
return <SplitView sidebarSize={200} orientation={stackFrameLocation === 'bottom' ? 'vertical' : 'horizontal'} sidebarHidden={!showStackFrames}>
|
||||||
<div className='vbox' data-testid='source-code'>
|
<div className='vbox' data-testid='source-code'>
|
||||||
{fileName && <div className='source-tab-file-name'>{fileName}</div>}
|
{fileName && (
|
||||||
|
<div className='source-tab-file-name'>
|
||||||
|
{fileName}
|
||||||
|
<span className='source-copy-to-clipboard'>
|
||||||
|
<CopyToClipboard description='Copy filename' value={getFileName(fileName, targetLine)}/>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<CodeMirrorWrapper text={source.content || ''} language='javascript' highlight={highlight} revealLine={targetLine} readOnly={true} lineNumbers={true} />
|
<CodeMirrorWrapper text={source.content || ''} language='javascript' highlight={highlight} revealLine={targetLine} readOnly={true} lineNumbers={true} />
|
||||||
</div>
|
</div>
|
||||||
<StackTraceView stack={stack} selectedFrame={selectedFrame} setSelectedFrame={setSelectedFrame} />
|
<StackTraceView stack={stack} selectedFrame={selectedFrame} setSelectedFrame={setSelectedFrame} />
|
||||||
|
|
|
||||||
|
|
@ -29,21 +29,4 @@
|
||||||
|
|
||||||
.stack-trace-frame-line {
|
.stack-trace-frame-line {
|
||||||
flex: none;
|
flex: none;
|
||||||
}
|
|
||||||
|
|
||||||
.stack-trace-copy-to-clipboard {
|
|
||||||
display: block;
|
|
||||||
width: 20px;
|
|
||||||
margin-right: 4px;
|
|
||||||
padding: 0 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy-icon {
|
|
||||||
display: none;
|
|
||||||
margin-right: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-view-entry:hover .copy-icon {
|
|
||||||
display: block;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
}
|
||||||
|
|
@ -18,7 +18,6 @@ import * as React from 'react';
|
||||||
import './stackTrace.css';
|
import './stackTrace.css';
|
||||||
import { ListView } from '@web/components/listView';
|
import { ListView } from '@web/components/listView';
|
||||||
import type { StackFrame } from '@protocol/channels';
|
import type { StackFrame } from '@protocol/channels';
|
||||||
import { CopyToClipboard } from './copyToClipboard';
|
|
||||||
|
|
||||||
const StackFrameListView = ListView<StackFrame>;
|
const StackFrameListView = ListView<StackFrame>;
|
||||||
|
|
||||||
|
|
@ -28,30 +27,22 @@ export const StackTraceView: React.FunctionComponent<{
|
||||||
setSelectedFrame: (index: number) => void
|
setSelectedFrame: (index: number) => void
|
||||||
}> = ({ stack, setSelectedFrame, selectedFrame }) => {
|
}> = ({ stack, setSelectedFrame, selectedFrame }) => {
|
||||||
const frames = stack || [];
|
const frames = stack || [];
|
||||||
const getFileName = (frame: StackFrame) => {
|
|
||||||
const pathSep = frame.file[1] === ':' ? '\\' : '/';
|
|
||||||
const fileName = frame.file.split(pathSep).pop();
|
|
||||||
return fileName;
|
|
||||||
};
|
|
||||||
|
|
||||||
return <StackFrameListView
|
return <StackFrameListView
|
||||||
name='stack-trace'
|
name='stack-trace'
|
||||||
items={frames}
|
items={frames}
|
||||||
selectedItem={frames[selectedFrame]}
|
selectedItem={frames[selectedFrame]}
|
||||||
render={frame => {
|
render={frame => {
|
||||||
|
const pathSep = frame.file[1] === ':' ? '\\' : '/';
|
||||||
return <>
|
return <>
|
||||||
<span className='stack-trace-frame-function'>
|
<span className='stack-trace-frame-function'>
|
||||||
{frame.function || '(anonymous)'}
|
{frame.function || '(anonymous)'}
|
||||||
</span>
|
</span>
|
||||||
<span className='stack-trace-frame-location'>
|
<span className='stack-trace-frame-location'>
|
||||||
{getFileName(frame)}
|
{frame.file.split(pathSep).pop()}
|
||||||
</span>
|
</span>
|
||||||
<span className='stack-trace-frame-line'>
|
<span className='stack-trace-frame-line'>
|
||||||
{':' + frame.line}
|
{':' + frame.line}
|
||||||
</span>
|
</span>
|
||||||
<span className='stack-trace-copy-to-clipboard'>
|
|
||||||
<CopyToClipboard description='Copy filename' value={`${getFileName(frame)}:${frame.line}`}/>
|
|
||||||
</span>
|
|
||||||
</>;
|
</>;
|
||||||
}}
|
}}
|
||||||
onSelected={frame => setSelectedFrame(frames.indexOf(frame))} />;
|
onSelected={frame => setSelectedFrame(frames.indexOf(frame))} />;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue