mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	chore(trace-viewer): add drag hover animation and be able to upload multiple times (#9792)
This commit is contained in:
		
							parent
							
								
									16afb5064f
								
							
						
					
					
						commit
						0f54c2116b
					
				@ -20,9 +20,21 @@
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  box-shadow: var(--box-shadow);
 | 
			
		||||
  flex: auto;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  font-size: 24px;
 | 
			
		||||
  color: #666;
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
  background-color: #fffb;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  right: 0;
 | 
			
		||||
  bottom: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  z-index: 100;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.drop-target input {
 | 
			
		||||
  margin-top: 50px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.progress {
 | 
			
		||||
@ -78,7 +90,7 @@
 | 
			
		||||
  flex: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tab-strip {
 | 
			
		||||
.tab-strip {
 | 
			
		||||
  background-color: var(--light-background);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -37,10 +37,10 @@ export const Workbench: React.FunctionComponent<{
 | 
			
		||||
  const [highlightedAction, setHighlightedAction] = React.useState<ActionTraceEvent | undefined>();
 | 
			
		||||
  const [selectedTab, setSelectedTab] = React.useState<string>('logs');
 | 
			
		||||
  const [progress, setProgress] = React.useState<{ done: number, total: number }>({ done: 0, total: 0 });
 | 
			
		||||
  const [dragOver, setDragOver] = React.useState<boolean>(false);
 | 
			
		||||
 | 
			
		||||
  const handleDropEvent = (event: any) => {
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
    const blobTraceURL = URL.createObjectURL(event.dataTransfer.files[0]);
 | 
			
		||||
  const processTraceFile = (file: File) => {
 | 
			
		||||
    const blobTraceURL = URL.createObjectURL(file);
 | 
			
		||||
    const url = new URL(window.location.href);
 | 
			
		||||
    url.searchParams.set('trace', blobTraceURL);
 | 
			
		||||
    const href = url.toString();
 | 
			
		||||
@ -48,6 +48,19 @@ export const Workbench: React.FunctionComponent<{
 | 
			
		||||
    // so set it here.
 | 
			
		||||
    window.history.pushState({}, '', href);
 | 
			
		||||
    setTraceURL(blobTraceURL);
 | 
			
		||||
    setDragOver(false);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const handleDropEvent = (event: React.DragEvent<HTMLDivElement>) => {
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
    processTraceFile(event.dataTransfer.files[0]);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const handleFileInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
    if (!event.target.files)
 | 
			
		||||
      return;
 | 
			
		||||
    processTraceFile(event.target.files[0]);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  React.useEffect(() => {
 | 
			
		||||
@ -73,23 +86,6 @@ export const Workbench: React.FunctionComponent<{
 | 
			
		||||
  const defaultSnapshotSize = contextEntry.options.viewport || { width: 1280, height: 720 };
 | 
			
		||||
  const boundaries = { minimum: contextEntry.startTime, maximum: contextEntry.endTime };
 | 
			
		||||
 | 
			
		||||
  if (!traceURL || progress.total) {
 | 
			
		||||
    return <div className='vbox workbench'>
 | 
			
		||||
      <div className='hbox header'>
 | 
			
		||||
        <div className='logo'>🎭</div>
 | 
			
		||||
        <div className='product'>Playwright</div>
 | 
			
		||||
        <div className='spacer'></div>
 | 
			
		||||
      </div>
 | 
			
		||||
      {!!progress.total && <div className='progress'>
 | 
			
		||||
        <div className='inner-progress' style={{ width: (100 * progress.done / progress.total) + '%' }}></div>
 | 
			
		||||
      </div>}
 | 
			
		||||
      {!progress.total && <div className='drop-target'
 | 
			
		||||
        onDragOver={event => { event.preventDefault(); }}
 | 
			
		||||
        onDrop={event => handleDropEvent(event)}>
 | 
			
		||||
        Drop Playwright Trace here
 | 
			
		||||
      </div>}
 | 
			
		||||
    </div>;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Leave some nice free space on the right hand side.
 | 
			
		||||
  boundaries.maximum += (boundaries.maximum - boundaries.minimum) / 20;
 | 
			
		||||
@ -106,9 +102,7 @@ export const Workbench: React.FunctionComponent<{
 | 
			
		||||
  if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1')
 | 
			
		||||
    tabs.push({ id: 'source', title: 'Source', count: 0, render: () => <SourceTab action={selectedAction} /> });
 | 
			
		||||
 | 
			
		||||
  return <div className='vbox workbench'
 | 
			
		||||
    onDragOver={event => { event.preventDefault(); }}
 | 
			
		||||
    onDrop={event => handleDropEvent(event)}>
 | 
			
		||||
  return <div className='vbox workbench' onDragOver={event => { event.preventDefault(); setDragOver(true); }}>
 | 
			
		||||
    <div className='hbox header'>
 | 
			
		||||
      <div className='logo'>🎭</div>
 | 
			
		||||
      <div className='product'>Playwright</div>
 | 
			
		||||
@ -140,6 +134,18 @@ export const Workbench: React.FunctionComponent<{
 | 
			
		||||
        setSelectedTab={setSelectedTab}
 | 
			
		||||
      />
 | 
			
		||||
    </SplitView>
 | 
			
		||||
    {!!progress.total && <div className='progress'>
 | 
			
		||||
      <div className='inner-progress' style={{ width: (100 * progress.done / progress.total) + '%' }}></div>
 | 
			
		||||
    </div>}
 | 
			
		||||
    {!dragOver && !traceURL && <div className='drop-target'>
 | 
			
		||||
      <div>Drop to upload a Playwright Trace</div>
 | 
			
		||||
      <input type='file' onChange={handleFileInputChange} />
 | 
			
		||||
    </div>}
 | 
			
		||||
    {dragOver && <div className='drop-target'
 | 
			
		||||
      onDragLeave={() => { setDragOver(false); }}
 | 
			
		||||
      onDrop={event => handleDropEvent(event)}>
 | 
			
		||||
      Release to analyse the Playwright Trace
 | 
			
		||||
    </div>}
 | 
			
		||||
  </div>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user