@@ -43,10 +43,22 @@ <h3>📁 Current Folder:</h3>
4343 < button class ="copy-path-btn " data-path ="{{ selected_folder_path }} " title ="Copy folder path ">
4444 📋 Copy path
4545 </ button >
46+ < button class ="delete-experiment-btn " onclick ="deleteExperiment('{{ selected_folder_path }}') " title ="Delete this experiment ">
47+ 🗑️ Delete
48+ </ button >
4649 </ div >
4750 </ div >
4851 </ section >
4952
53+ <!-- Readme Section -->
54+ < section class ="readme-section ">
55+ < h2 > 📝 Readme</ h2 >
56+ < div class ="readme-container ">
57+ < textarea id ="readme-textarea " class ="readme-textarea " placeholder ="Add notes about this experiment... "> </ textarea >
58+ < div class ="readme-status " id ="readme-status "> Loading...</ div >
59+ </ div >
60+ </ section >
61+
5062 <!-- Setup Section -->
5163 < section class ="setup-section ">
5264 < h2 > ⚙️ Setup</ h2 >
@@ -598,10 +610,133 @@ <h3>
598610 } ) ;
599611 }
600612
613+ // Delete experiment function
614+ function deleteExperiment ( folderPath ) {
615+ const confirmed = confirm ( 'Are you sure you want to delete this experiment? This action cannot be undone.\n\nFolder: ' + folderPath ) ;
616+ if ( confirmed ) {
617+ fetch ( '/delete-experiment' , {
618+ method : 'POST' ,
619+ headers : {
620+ 'Content-Type' : 'application/json' ,
621+ } ,
622+ body : JSON . stringify ( {
623+ folder_path : folderPath
624+ } )
625+ } )
626+ . then ( response => response . json ( ) )
627+ . then ( data => {
628+ if ( data . success ) {
629+ alert ( 'Experiment deleted successfully.' ) ;
630+ // Redirect to picker
631+ window . location . href = '/picker' ;
632+ } else {
633+ alert ( 'Error deleting experiment: ' + ( data . error || 'Unknown error' ) ) ;
634+ }
635+ } )
636+ . catch ( error => {
637+ console . error ( 'Error:' , error ) ;
638+ alert ( 'Error deleting experiment: ' + error . message ) ;
639+ } ) ;
640+ }
641+ }
642+
643+ // Readme functionality
644+ let readmeTimeout = null ;
645+ let readmeTextarea = null ;
646+ let readmeStatus = null ;
647+
648+ function loadReadme ( ) {
649+ const urlParams = new URLSearchParams ( window . location . search ) ;
650+ const folder = urlParams . get ( 'folder' ) ;
651+
652+ if ( ! folder ) return ;
653+
654+ fetch ( '/load-readme?folder=' + encodeURIComponent ( folder ) )
655+ . then ( response => response . json ( ) )
656+ . then ( data => {
657+ if ( data . success ) {
658+ readmeTextarea . value = data . content ;
659+ readmeStatus . textContent = 'Loaded' ;
660+ readmeStatus . className = 'readme-status' ;
661+ } else {
662+ readmeStatus . textContent = 'Error loading: ' + data . error ;
663+ readmeStatus . className = 'readme-status error' ;
664+ }
665+ } )
666+ . catch ( error => {
667+ console . error ( 'Error loading readme:' , error ) ;
668+ readmeStatus . textContent = 'Error loading readme' ;
669+ readmeStatus . className = 'readme-status error' ;
670+ } ) ;
671+ }
672+
673+ function saveReadme ( ) {
674+ const urlParams = new URLSearchParams ( window . location . search ) ;
675+ const folder = urlParams . get ( 'folder' ) ;
676+
677+ if ( ! folder ) return ;
678+
679+ readmeStatus . textContent = 'Saving...' ;
680+ readmeStatus . className = 'readme-status saving' ;
681+
682+ fetch ( '/save-readme' , {
683+ method : 'POST' ,
684+ headers : {
685+ 'Content-Type' : 'application/json' ,
686+ } ,
687+ body : JSON . stringify ( {
688+ selected_folder : folder ,
689+ content : readmeTextarea . value
690+ } )
691+ } )
692+ . then ( response => response . json ( ) )
693+ . then ( data => {
694+ if ( data . success ) {
695+ readmeStatus . textContent = 'Saved' ;
696+ readmeStatus . className = 'readme-status saved' ;
697+ } else {
698+ readmeStatus . textContent = 'Error: ' + data . error ;
699+ readmeStatus . className = 'readme-status error' ;
700+ }
701+ } )
702+ . catch ( error => {
703+ console . error ( 'Error saving readme:' , error ) ;
704+ readmeStatus . textContent = 'Error saving' ;
705+ readmeStatus . className = 'readme-status error' ;
706+ } ) ;
707+ }
708+
709+ function setupReadmeAutosave ( ) {
710+ readmeTextarea = document . getElementById ( 'readme-textarea' ) ;
711+ readmeStatus = document . getElementById ( 'readme-status' ) ;
712+
713+ if ( ! readmeTextarea || ! readmeStatus ) return ;
714+
715+ // Load existing content
716+ loadReadme ( ) ;
717+
718+ // Setup autosave on input
719+ readmeTextarea . addEventListener ( 'input' , function ( ) {
720+ // Clear existing timeout
721+ if ( readmeTimeout ) {
722+ clearTimeout ( readmeTimeout ) ;
723+ }
724+
725+ // Set new timeout for autosave (1 second delay)
726+ readmeTimeout = setTimeout ( saveReadme , 1000 ) ;
727+
728+ // Show typing indicator
729+ readmeStatus . textContent = 'Typing...' ;
730+ readmeStatus . className = 'readme-status' ;
731+ } ) ;
732+ }
733+
601734 // Initialize JSON editors when page loads
602735 document . addEventListener ( 'DOMContentLoaded' , function ( ) {
603736 // Setup copy buttons
604737 setupCopyButtons ( ) ;
738+ // Setup readme autosave
739+ setupReadmeAutosave ( ) ;
605740 // Initialize metadata JSON editor
606741 const metadataEditor = new JSONEditor ( document . getElementById ( 'metadata-jsoneditor' ) , {
607742 mode : 'view' ,
0 commit comments