display sheet name(s) in chart formatter
This commit is contained in:
parent
b75b412c23
commit
83498ac654
|
@ -3,6 +3,7 @@
|
|||
## next
|
||||
|
||||
- `t now` displays a nicer message if no entries are running.
|
||||
- `chart` formatter now shows the sheet name(s) that are being displayed.
|
||||
|
||||
## 1.5.3
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use std::io::Write;
|
||||
use std::fmt::Write as _;
|
||||
use std::collections::HashMap;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
||||
use crate::tabulate::{Tabulate, Col, Align::*};
|
||||
use chrono::{Local, Datelike, Date, Duration};
|
||||
|
@ -81,6 +81,7 @@ pub fn print_formatted<W: Write>(entries: Vec<Entry>, out: &mut W, facts: &Facts
|
|||
let mut entries_by_date = HashMap::new();
|
||||
let mut first_date = None;
|
||||
let mut last_date = None;
|
||||
let mut timesheets = HashSet::new();
|
||||
|
||||
for entry in entries.into_iter() {
|
||||
let entrys_date = entry.start.with_timezone(&Local).date();
|
||||
|
@ -97,6 +98,8 @@ pub fn print_formatted<W: Write>(entries: Vec<Entry>, out: &mut W, facts: &Facts
|
|||
last_date = last_date.map(|d| d.max(entrys_date));
|
||||
}
|
||||
|
||||
timesheets.insert(entry.sheet);
|
||||
|
||||
let e = entries_by_date.entry(entrys_date).or_insert(0.0);
|
||||
|
||||
*e += hours;
|
||||
|
@ -173,6 +176,16 @@ pub fn print_formatted<W: Write>(entries: Vec<Entry>, out: &mut W, facts: &Facts
|
|||
week_total(week_accumulated, weekly_goal_hours),
|
||||
]);
|
||||
|
||||
if timesheets.len() == 1 {
|
||||
out.write_all(format!("Timesheet: {}\n\n", timesheets.into_iter().next().unwrap()).as_bytes())?;
|
||||
} else {
|
||||
let mut timesheets: Vec<_> = timesheets.into_iter().collect();
|
||||
|
||||
timesheets.sort_unstable();
|
||||
|
||||
out.write_all(format!("Timesheets: {}\n\n", timesheets.join(", ")).as_bytes())?;
|
||||
}
|
||||
|
||||
out.write_all(tabs.print(facts.env.stdout_is_tty).as_bytes())?;
|
||||
|
||||
Ok(())
|
||||
|
@ -218,7 +231,10 @@ mod tests {
|
|||
|
||||
print_formatted(entries, &mut out, &facts).unwrap();
|
||||
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), "\
|
||||
Timesheet: default
|
||||
|
||||
Date Day Chart Hours
|
||||
|
||||
Aug 15 Mon \u{1b}[42m \u{1b}[0m\u{1b}[48;5;10m \u{1b}[0m 5.0
|
||||
16 Tue \u{1b}[42m \u{1b}[0m\u{1b}[47m \u{1b}[0m 3.5
|
||||
|
@ -246,7 +262,10 @@ Aug 15 Mon \u{1b}[42m \u{1b}[0m\u{1b}[48;5;10m \u{1b}[0m 5.0
|
|||
|
||||
print_formatted(entries, &mut out, &facts).unwrap();
|
||||
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), "\
|
||||
Timesheet: default
|
||||
|
||||
Date Day Chart Hours
|
||||
|
||||
Aug 28 Sun \u{1b}[48;5;10m \u{1b}[0m 5.0
|
||||
|
||||
|
@ -285,7 +304,10 @@ Aug 29 Mon \u{1b}[48;5;10m \u{1b}[0m 3.0
|
|||
|
||||
print_formatted(entries, &mut out, &facts).unwrap();
|
||||
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), "\
|
||||
Timesheet: default
|
||||
|
||||
Date Day Chart Hours
|
||||
|
||||
Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0
|
||||
16 Tue 0.0
|
||||
|
@ -315,7 +337,44 @@ Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0
|
|||
|
||||
print_formatted(entries, &mut out, &facts).unwrap();
|
||||
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), " Date Day Chart Hours
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), "\
|
||||
Timesheet: default
|
||||
|
||||
Date Day Chart Hours
|
||||
|
||||
Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0
|
||||
16 Tue \u{1b}[48;5;10m \u{1b}[0m 3.5
|
||||
17 Wed \u{1b}[48;5;10m \u{1b}[0m 4.0
|
||||
18 Thu \u{1b}[48;5;10m \u{1b}[0m 2.0
|
||||
|
||||
Week 14.5
|
||||
");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multiple_timesheets_to_display() {
|
||||
std::env::set_var("TZ", "CST+6");
|
||||
|
||||
let day1 = Utc.ymd(2022, 8, 15).and_hms(12, 0, 0);
|
||||
let day2 = Utc.ymd(2022, 8, 16).and_hms(12, 0, 0);
|
||||
let day3 = Utc.ymd(2022, 8, 17).and_hms(12, 0, 0);
|
||||
let day4 = Utc.ymd(2022, 8, 18).and_hms(12, 0, 0);
|
||||
|
||||
let entries = vec![
|
||||
Entry::new_sample(1, day1, Some(day1 + Duration::hours(5))).with_sheet("var"),
|
||||
Entry::new_sample(2, day2, Some(day2 + Duration::minutes(60 * 3 + 30))).with_sheet("var"),
|
||||
Entry::new_sample(3, day3, Some(day3 + Duration::hours(4))).with_sheet("foo"),
|
||||
Entry::new_sample(4, day4, Some(day4 + Duration::hours(2))).with_sheet("foo"),
|
||||
];
|
||||
let mut out = Vec::new();
|
||||
let facts = Facts::new();
|
||||
|
||||
print_formatted(entries, &mut out, &facts).unwrap();
|
||||
|
||||
assert_str_eq!(String::from_utf8_lossy(&out), "\
|
||||
Timesheets: foo, var
|
||||
|
||||
Date Day Chart Hours
|
||||
|
||||
Aug 15 Mon \u{1b}[48;5;10m \u{1b}[0m 5.0
|
||||
16 Tue \u{1b}[48;5;10m \u{1b}[0m 3.5
|
||||
|
|
|
@ -28,6 +28,13 @@ impl Entry {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn with_sheet(self, sheet: &str) -> Entry {
|
||||
Entry {
|
||||
sheet: sheet.into(),
|
||||
..self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn timespan(&self) -> Option<Duration> {
|
||||
self.end.map(|e| e - self.start)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue