1717 stroke : # 333 ;
1818 stroke-width : 1.5px ;
1919}
20+
21+ .upload-drop-zone {
22+ height : 200px ;
23+ border-width : 2px ;
24+ margin-bottom : 20px ;
25+ color : # ccc ;
26+ border-style : dashed;
27+ border-color : # ccc ;
28+ line-height : 200px ;
29+ text-align : center
30+ }
31+ .upload-drop-zone .drop {
32+ color : # 222 ;
33+ border-color : # 222 ;
34+ }
35+
2036</ style >
2137</ head >
2238
@@ -171,12 +187,17 @@ <h4 class="modal-title">JSON File</h4>
171187 < div class ="modal-body ">
172188 < label for ="inputFile " class ="col-lg-2 control-label "> File</ label >
173189 < div class ="col-lg-10 ">
174- < input type ="file " class ="form-control " id ="inputFile ">
190+ < input type ="file " class ="form-control file " id ="inputFile ">
191+ </ div >
192+ < br />
193+ < label for ="drop-zone " class ="col-lg-2 control-label "> Or drag and drop a file below</ label >
194+ < div class ="upload-drop-zone " id ="drop-zone ">
195+ Just drag and drop a JSON file here
175196 </ div >
176197 </ div >
177198 < div class ="modal-footer ">
178199 < button type ="button " class ="btn btn-primary " data-dismiss ="modal " id ="loadFile "> Load</ button >
179- < button type ="button " class ="btn btn-default " data-dismiss ="modal "> Close</ button >
200+ < button type ="button " class ="btn btn-default " data-dismiss ="modal " id =" fileClose " > Close</ button >
180201 </ div >
181202 </ div >
182203 </ div >
@@ -345,14 +366,14 @@ <h4 class="modal-title">JSON File</h4>
345366function updateInfoBox ( d ) {
346367 if ( d ) {
347368 var el = document . getElementById ( "node-info" ) ;
348- var s = "Type: " + d . type + "\n " ;
369+ var s = "Type: " + d . type + "</br> " ;
349370 if ( d . type == "domain" ) {
350- s = s + "Domain: " + d . id + "\n ";
351- s = s + "Status: " + d . status + "\n " ;
371+ s = s + "Domain: " + linkifyDomain ( d ) + "</br> ";
372+ s = s + "Status: " + d . status + "</br> " ;
352373 } else if ( d . type = "certificate" ) {
353- s = s + "Hash: " + d . id + "\n ";
374+ s = s + "Hash: " + linkifyCert ( d ) + "</br> ";
354375 }
355- el . innerText = s ;
376+ el . innerHTML = s ;
356377 }
357378}
358379
@@ -375,13 +396,13 @@ <h4 class="modal-title">JSON File</h4>
375396 if ( d . root == "true" ) {
376397 c = "info" ;
377398 }
378- $ ( '#domain-list' ) . append ( '<tr class="' + c + '"><td>' + ++ domainCount + '</td><td><a target="_blank" href="https://' + d . id + '">' + d . id + '</a> </td><td>'+ d . status + '</td></tr>' ) ;
399+ $ ( '#domain-list' ) . append ( '<tr class="' + c + '"><td>' + ++ domainCount + '</td><td>' + linkifyDomain ( d ) + ' </td><td>'+ d . status + '</td></tr>' ) ;
379400 }
380401
381402 var certCount = 0 ;
382403 function addTableCert ( d ) {
383404 //console.log("cert", d);
384- $ ( '#cert-list' ) . append ( '<tr><td>' + ++ certCount + '</td><td><a target="_blank" href="https://crt.sh/?q=' + d . id + '">' + d . id + '</a> </td></tr>') ;
405+ $ ( '#cert-list' ) . append ( '<tr><td>' + ++ certCount + '</td><td>' + linkifyCert ( d ) + ' </td></tr>') ;
385406 }
386407
387408
@@ -396,6 +417,14 @@ <h4 class="modal-title">JSON File</h4>
396417 } )
397418}
398419
420+ function linkifyCert ( d ) {
421+ return '<a target="_blank" href="https://crt.sh/?q=' + d . id + '">' + d . id + '</a>' ;
422+ }
423+
424+ function linkifyDomain ( d ) {
425+ return '<a target="_blank" href="https://crt.sh/?q=' + d . id + '">' + d . id + '</a>' ;
426+ }
427+
399428function getQueryVariable ( variable ) {
400429 var query = window . location . search . substring ( 1 ) ;
401430 var vars = query . split ( "&" ) ;
@@ -440,6 +469,52 @@ <h4 class="modal-title">JSON File</h4>
440469 reader . readAsText ( file ) ;
441470}
442471
472+ var dropbox = document . getElementById ( 'drop-zone' ) ;
473+ function dragenter ( e ) {
474+ e . stopPropagation ( ) ;
475+ e . preventDefault ( ) ;
476+ dropbox . className = 'upload-drop-zone drop' ;
477+ // console.log("enter");
478+ return false ;
479+ }
480+ function dragover ( e ) {
481+ e . stopPropagation ( ) ;
482+ e . preventDefault ( ) ;
483+ // console.log("over");
484+ }
485+ function dragleave ( e ) {
486+ e . stopPropagation ( ) ;
487+ e . preventDefault ( ) ;
488+ dropbox . className = 'upload-drop-zone' ;
489+ // console.log("leave");
490+ return false ;
491+ }
492+ function drop ( e ) {
493+ // console.log("drop");
494+ e . stopPropagation ( ) ;
495+ e . preventDefault ( ) ;
496+ dropbox . className = 'upload-drop-zone' ;
497+
498+ var dt = e . dataTransfer ;
499+ var files = dt . files ;
500+
501+ var reader = new FileReader ( ) ;
502+ reader . onload = function ( e ) {
503+ var dataStr = reader . result ;
504+ var data = JSON . parse ( dataStr ) ;
505+ resetGraph ( ) ;
506+ createGraph ( null , data ) ;
507+ }
508+ reader . readAsText ( files [ 0 ] ) ;
509+ $ ( '#fileClose' ) . click ( ) ;
510+ return false ;
511+ }
512+ dropbox . addEventListener ( "dragenter" , dragenter , false ) ;
513+ dropbox . addEventListener ( "dragover" , dragover , false ) ;
514+ dropbox . addEventListener ( "drop" , drop , false ) ;
515+ dropbox . addEventListener ( "dragleave" , dragleave , false ) ;
516+
517+
443518// load initial graph data
444519var dataURL = getQueryVariable ( "data" ) ;
445520if ( dataURL == "" ) {
0 commit comments