From 73719727b1bbbc4294c9364e7e728111114faa5d Mon Sep 17 00:00:00 2001 From: Thomas Worle Date: Fri, 14 Mar 2025 07:57:18 +0000 Subject: [PATCH 1/6] display total time in the list function --- src/view/list.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/view/list.rs b/src/view/list.rs index 1eb8dda..23611c1 100644 --- a/src/view/list.rs +++ b/src/view/list.rs @@ -1,3 +1,4 @@ +use chrono::Duration; use chrono::NaiveDate; use nu_ansi_term::Color; use std::collections::BTreeMap; @@ -73,7 +74,13 @@ fn create_activities_group(title: &str, activities: &[&activity::Activity]) -> t .iter() .map(|a| get_activity_table_row(a, false)) .collect(); - table::Group::new(Some(title.to_string()), rows) + + let total_duration = activities + .iter() + .map(|a| a.get_duration()) + .fold(Duration::zero(), |acc, e| acc + e); + + table::Group::new(Some(format!("{}\t{}",title.to_string(), format_util::format_duration(&total_duration))), rows) } // displays a table with running activities (no end time) From a4ee07700b27a4d060897ecede4dadf438a2fdad Mon Sep 17 00:00:00 2001 From: Thomas Worle Date: Tue, 18 Mar 2025 15:51:21 +0000 Subject: [PATCH 2/6] use the sum durations function from the report module --- src/view/list.rs | 7 +++---- src/view/report.rs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/view/list.rs b/src/view/list.rs index 23611c1..3b2f6f3 100644 --- a/src/view/list.rs +++ b/src/view/list.rs @@ -3,10 +3,12 @@ use chrono::NaiveDate; use nu_ansi_term::Color; use std::collections::BTreeMap; + use crate::conf; use crate::data::activity; use crate::view::format_util; use crate::view::table; +use crate::view::report; // displays a table with activities pub fn list_activities(activities: &[&activity::Activity], with_start_dates: bool) { @@ -75,10 +77,7 @@ fn create_activities_group(title: &str, activities: &[&activity::Activity]) -> t .map(|a| get_activity_table_row(a, false)) .collect(); - let total_duration = activities - .iter() - .map(|a| a.get_duration()) - .fold(Duration::zero(), |acc, e| acc + e); + let total_duration = report::sum_duration(activities); table::Group::new(Some(format!("{}\t{}",title.to_string(), format_util::format_duration(&total_duration))), rows) } diff --git a/src/view/report.rs b/src/view/report.rs index 22c456a..ecb7927 100644 --- a/src/view/report.rs +++ b/src/view/report.rs @@ -79,7 +79,7 @@ fn create_project_map<'a>(activities: &'a [&'a activity::Activity]) -> ProjectMa project_map } -fn sum_duration(activities: &[&activity::Activity]) -> Duration { +pub fn sum_duration(activities: &[&activity::Activity]) -> Duration { let mut duration = Duration::seconds(0); for activity in activities { From 88b820312d56dba0df7894ba1880e95028806ef6 Mon Sep 17 00:00:00 2001 From: Nikolas Schmidt-Voigt Date: Wed, 2 Apr 2025 10:13:08 +0200 Subject: [PATCH 3/6] Updated changelog and fixed formatting --- CHANGELOG.md | 1 + src/view/list.rs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b6729a..2e97ce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Added total hours to the grouped list (thanks to [@Niatross](https://github.com/Niatross)) - Update of libc:musl to support longarch64 (thanks to [@zhaixiaojuan](https://github.com/zhaixiaojuan)) - Improved general `--help` output (thanks to [@RossBarnie](https://github.com/RossBarnie)) diff --git a/src/view/list.rs b/src/view/list.rs index 3b2f6f3..b529b80 100644 --- a/src/view/list.rs +++ b/src/view/list.rs @@ -1,4 +1,3 @@ -use chrono::Duration; use chrono::NaiveDate; use nu_ansi_term::Color; use std::collections::BTreeMap; From 8b6de736c67e6651f2cbd1033aaf6624dbf7b7ae Mon Sep 17 00:00:00 2001 From: Nikolas Schmidt-Voigt Date: Wed, 2 Apr 2025 10:23:09 +0200 Subject: [PATCH 4/6] fixed formatting --- src/view/list.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/view/list.rs b/src/view/list.rs index b529b80..4355ecf 100644 --- a/src/view/list.rs +++ b/src/view/list.rs @@ -2,12 +2,11 @@ use chrono::NaiveDate; use nu_ansi_term::Color; use std::collections::BTreeMap; - use crate::conf; use crate::data::activity; use crate::view::format_util; -use crate::view::table; use crate::view::report; +use crate::view::table; // displays a table with activities pub fn list_activities(activities: &[&activity::Activity], with_start_dates: bool) { @@ -77,8 +76,15 @@ fn create_activities_group(title: &str, activities: &[&activity::Activity]) -> t .collect(); let total_duration = report::sum_duration(activities); - - table::Group::new(Some(format!("{}\t{}",title.to_string(), format_util::format_duration(&total_duration))), rows) + + table::Group::new( + Some(format!( + "{}\t{}", + title.to_string(), + format_util::format_duration(&total_duration) + )), + rows, + ) } // displays a table with running activities (no end time) From 9599169c71210775553a7cb6d15f21614dbd590e Mon Sep 17 00:00:00 2001 From: Nikolas Schmidt-Voigt Date: Wed, 2 Apr 2025 10:40:10 +0200 Subject: [PATCH 5/6] fixed linting --- src/data/filter.rs | 4 ++-- src/data/getter.rs | 3 +-- src/view/list.rs | 5 ++--- src/view/report.rs | 8 ++++---- src/view/status.rs | 6 +++--- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/data/filter.rs b/src/data/filter.rs index 5af0de5..8ee4c27 100644 --- a/src/data/filter.rs +++ b/src/data/filter.rs @@ -110,11 +110,11 @@ mod tests { start: date(2024, 3, 19), end: None, }; - return vec![a0, a1, a2, a3, a4]; + vec![a0, a1, a2, a3, a4] } fn date(year: i32, month: u32, day: u32) -> NaiveDateTime { let date = NaiveDate::from_ymd_opt(year, month, day).unwrap(); - return NaiveDateTime::new(date, chrono::NaiveTime::from_hms_opt(10, 0, 0).unwrap()); + NaiveDateTime::new(date, chrono::NaiveTime::from_hms_opt(10, 0, 0).unwrap()) } } diff --git a/src/data/getter.rs b/src/data/getter.rs index dd7bec2..f3c9e9e 100644 --- a/src/data/getter.rs +++ b/src/data/getter.rs @@ -98,8 +98,7 @@ pub fn filter_activities<'a>( }) .filter(move |activity| { filter - .project - .map_or(true, |p| WildMatch::new(p).matches(&activity.project)) + .project.is_none_or(|p| WildMatch::new(p).matches(&activity.project)) }) .collect() } diff --git a/src/view/list.rs b/src/view/list.rs index 4355ecf..4c24d4a 100644 --- a/src/view/list.rs +++ b/src/view/list.rs @@ -80,7 +80,7 @@ fn create_activities_group(title: &str, activities: &[&activity::Activity]) -> t table::Group::new( Some(format!( "{}\t{}", - title.to_string(), + title, format_util::format_duration(&total_duration) )), rows, @@ -180,8 +180,7 @@ pub fn list_descriptions_and_projects_with_index( // the date of the end is shown when it is not the same date as the start fn get_activity_table_row(activity: &activity::Activity, with_start_dates: bool) -> table::Row { let more_then_one_day = activity - .end - .map_or(false, |end| activity.start.date() != end.date()); + .end.is_some_and(|end| activity.start.date() != end.date()); let display_end = activity.end.map_or_else( || "-".to_string(), diff --git a/src/view/report.rs b/src/view/report.rs index ecb7927..f2757dc 100644 --- a/src/view/report.rs +++ b/src/view/report.rs @@ -27,7 +27,7 @@ impl<'a> Report<'a> { } } -impl<'a> fmt::Display for Report<'a> { +impl fmt::Display for Report<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut longest_line = get_longest_line(&self.project_map).unwrap_or(0); let longest_duration_string = get_longest_duration_string(self).unwrap_or(0); @@ -61,7 +61,7 @@ pub fn show_activities<'a>(activities: &'a [&'a activity::Activity]) { println!("\n{report}"); } -fn create_project_map<'a>(activities: &'a [&'a activity::Activity]) -> ProjectMap { +fn create_project_map<'a>(activities: &'a [&'a activity::Activity]) -> ProjectMap<'a> { let mut project_map: ProjectMap = BTreeMap::new(); for a in activities { @@ -172,8 +172,8 @@ fn print_total_duration( fn group_activities_by_description<'a>( activities: &'a [&'a activity::Activity], -) -> BTreeMap<&str, Vec<&'a activity::Activity>> { - let mut activity_map: BTreeMap<&str, Vec<&'a activity::Activity>> = BTreeMap::new(); +) -> BTreeMap<&'a str, Vec<&'a activity::Activity>> { + let mut activity_map: BTreeMap<&'a str, Vec<&'a activity::Activity>> = BTreeMap::new(); for a in activities { activity_map.entry(&a.description).or_default().push(a); diff --git a/src/view/status.rs b/src/view/status.rs index 0272195..9c9b1e6 100644 --- a/src/view/status.rs +++ b/src/view/status.rs @@ -16,7 +16,7 @@ impl StatusReportWriter for StatusReport { } } -impl<'a> fmt::Display for StatusReportData<'a> { +impl fmt::Display for StatusReportData<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let longest_line = 30; print_title(f, self.project)?; @@ -236,7 +236,7 @@ mod tests { fn clean(a: &str) -> String { let st_f = "\u{1b}[0m\u{1b}"; - let clean_res = a.replace(st_f, "<>"); - clean_res + + a.replace(st_f, "<>") } } From 3ebe5c527f287fc7dfdde75780f0897622e05d6f Mon Sep 17 00:00:00 2001 From: Nikolas Schmidt-Voigt Date: Wed, 2 Apr 2025 10:45:10 +0200 Subject: [PATCH 6/6] fixed formatting --- src/data/getter.rs | 3 ++- src/view/list.rs | 3 ++- src/view/status.rs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/data/getter.rs b/src/data/getter.rs index f3c9e9e..9823771 100644 --- a/src/data/getter.rs +++ b/src/data/getter.rs @@ -98,7 +98,8 @@ pub fn filter_activities<'a>( }) .filter(move |activity| { filter - .project.is_none_or(|p| WildMatch::new(p).matches(&activity.project)) + .project + .is_none_or(|p| WildMatch::new(p).matches(&activity.project)) }) .collect() } diff --git a/src/view/list.rs b/src/view/list.rs index 4c24d4a..d9aa30e 100644 --- a/src/view/list.rs +++ b/src/view/list.rs @@ -180,7 +180,8 @@ pub fn list_descriptions_and_projects_with_index( // the date of the end is shown when it is not the same date as the start fn get_activity_table_row(activity: &activity::Activity, with_start_dates: bool) -> table::Row { let more_then_one_day = activity - .end.is_some_and(|end| activity.start.date() != end.date()); + .end + .is_some_and(|end| activity.start.date() != end.date()); let display_end = activity.end.map_or_else( || "-".to_string(), diff --git a/src/view/status.rs b/src/view/status.rs index 9c9b1e6..24c2dd5 100644 --- a/src/view/status.rs +++ b/src/view/status.rs @@ -236,7 +236,7 @@ mod tests { fn clean(a: &str) -> String { let st_f = "\u{1b}[0m\u{1b}"; - + a.replace(st_f, "<>") } }