@@ -8,7 +8,14 @@ import LogTable from "./LogTable";
88import ToggleBar from "./ToggleBar" ;
99import TripLogs from "./TripLogs" ;
1010import CloudLogging from "./CloudLogging" ;
11- import { uploadFile , getUploadedData , deleteUploadedData , uploadCloudLogs , saveDatasetAsJson } from "./localStorage" ;
11+ import {
12+ uploadFile ,
13+ getUploadedData ,
14+ deleteUploadedData ,
15+ uploadCloudLogs ,
16+ saveDatasetAsJson ,
17+ saveToIndexedDB ,
18+ } from "./localStorage" ;
1219import _ from "lodash" ;
1320import { getQueryStringValue , setQueryStringValue } from "./queryString" ;
1421import "./global.css" ;
@@ -519,18 +526,80 @@ class App extends React.Component {
519526
520527 const handleSaveClick = async ( e ) => {
521528 e . stopPropagation ( ) ;
522- log ( `Save initiated for dataset ${ index } ` ) ;
529+ log ( `Export initiated for dataset ${ index } ` ) ;
523530
524531 // Close menu
525532 this . setState ( { activeMenuIndex : null } ) ;
526533
527534 try {
528535 await saveDatasetAsJson ( index ) ;
529- toast . success ( `Dataset ${ index + 1 } saved successfully` ) ;
530- log ( `Dataset ${ index } saved successfully` ) ;
536+ toast . success ( `Dataset ${ index + 1 } exported successfully` ) ;
537+ log ( `Dataset ${ index } exported successfully` ) ;
531538 } catch ( error ) {
532- console . error ( "Error saving dataset:" , error ) ;
533- toast . error ( `Error saving dataset: ${ error . message } ` ) ;
539+ console . error ( "Error exporting dataset:" , error ) ;
540+ toast . error ( `Error exporting dataset: ${ error . message } ` ) ;
541+ }
542+ } ;
543+
544+ const handlePruneClick = async ( e ) => {
545+ e . stopPropagation ( ) ;
546+ log ( `Prune initiated for dataset ${ index } ` ) ;
547+
548+ // Close menu
549+ this . setState ( { activeMenuIndex : null } ) ;
550+
551+ try {
552+ const { minTime, maxTime } = this . state . timeRange ;
553+ const data = await getUploadedData ( index ) ;
554+
555+ if ( ! data || ! data . rawLogs || ! Array . isArray ( data . rawLogs ) ) {
556+ throw new Error ( "No valid data to prune" ) ;
557+ }
558+
559+ // Calculate how many logs will be removed
560+ const originalLength = data . rawLogs . length ;
561+ const minDate = new Date ( minTime ) ;
562+ const maxDate = new Date ( maxTime ) ;
563+ const remainingLogs = data . rawLogs . filter ( ( log ) => {
564+ const logTime = new Date ( log . timestamp || log . insertTime ) ;
565+ return logTime >= minDate && logTime <= maxDate ;
566+ } ) ;
567+
568+ const removeCount = originalLength - remainingLogs . length ;
569+
570+ if (
571+ ! confirm (
572+ `This will remove ${ removeCount } logs outside the selected time range.\nAre you sure you want to continue?`
573+ )
574+ ) {
575+ log ( "Prune operation cancelled by user" ) ;
576+ return ;
577+ }
578+
579+ log ( `Pruning dataset ${ index } : removing ${ removeCount } logs outside time range` ) ;
580+
581+ data . rawLogs = remainingLogs ;
582+
583+ // Save the pruned dataset back to storage
584+ await saveToIndexedDB ( data , index ) ;
585+
586+ // Update the current dataset if this is the active one
587+ if ( this . state . activeDatasetIndex === index ) {
588+ const tripLogs = new TripLogs ( data . rawLogs , data . solutionType ) ;
589+ this . props . logData . tripLogs = tripLogs ;
590+ this . props . logData . solutionType = data . solutionType ;
591+
592+ // Force update of components
593+ this . forceUpdate ( ) ;
594+
595+ // Select first row after pruning
596+ this . selectFirstRow ( ) ;
597+ }
598+
599+ toast . success ( `Dataset pruned: removed ${ removeCount } logs outside the selected time range.` ) ;
600+ } catch ( error ) {
601+ console . error ( "Error pruning dataset:" , error ) ;
602+ toast . error ( `Error pruning dataset: ${ error . message } ` ) ;
534603 }
535604 } ;
536605
@@ -598,13 +667,16 @@ class App extends React.Component {
598667 >
599668 { isUploaded ? `Dataset ${ index + 1 } ` : `Select Dataset ${ index + 1 } ` }
600669
601- { isUploaded && (
670+ { isUploaded && isActive && (
602671 < span className = "dataset-button-actions" onClick = { toggleMenu } >
603672 ▼
604673 { isMenuOpen && (
605674 < div className = "dataset-button-menu" >
606- < div className = "dataset-button-menu-item save" onClick = { handleSaveClick } >
607- Save
675+ < div className = "dataset-button-menu-item export" onClick = { handleSaveClick } >
676+ Export
677+ </ div >
678+ < div className = "dataset-button-menu-item prune" onClick = { handlePruneClick } >
679+ Prune
608680 </ div >
609681 < div className = "dataset-button-menu-item delete" onClick = { handleDeleteClick } >
610682 Delete
0 commit comments