@@ -589,40 +589,51 @@ pub fn view_calendar<Ms>(entries: Vec<(NaiveDate, usize, f64)>, interval: &Inter
589
589
590
590
pub fn view_chart < Ms > (
591
591
labels : & [ ( & str , usize ) ] ,
592
- chart : Result < String , Box < dyn std:: error:: Error > > ,
592
+ chart : Result < Option < String > , Box < dyn std:: error:: Error > > ,
593
+ no_data_label : bool ,
593
594
) -> Node < Ms > {
594
- div ! [
595
- C ![ "container" ] ,
596
- C ![ "has-text-centered" ] ,
597
- h1![
598
- C ![ "is-size-6" ] ,
599
- C ![ "has-text-weight-bold" ] ,
600
- labels
601
- . iter( )
602
- . map( |( label, color_idx) | {
603
- span![
604
- C ![ "icon-text" ] ,
605
- C ![ "mx-1" ] ,
606
- span![
607
- C ![ "icon" ] ,
608
- style![
609
- St :: Color => {
610
- let ( r, g, b) = Palette99 :: pick( * color_idx) . mix( 0.9 ) . rgb( ) ;
611
- format!( "#{r:02x}{g:02x}{b:02x}" )
612
- }
613
- ] ,
614
- i![ C ![ "fas fa-square" ] ]
615
- ] ,
616
- span![ label] ,
617
- ]
618
- } )
619
- . collect:: <Vec <_>>( ) ,
620
- ] ,
621
- raw![ & chart. unwrap_or_else( |err| {
622
- error!( "failed to plot chart:" , err) ;
623
- String :: new( )
624
- } ) ] ,
625
- ]
595
+ match chart {
596
+ Ok ( result) => match result {
597
+ None => if no_data_label {
598
+ div ! [
599
+ C ![ "is-size-7" ] ,
600
+ C ![ "block" ] ,
601
+ C ![ "has-text-centered" ] ,
602
+ C ![ "mb-4" ] ,
603
+ "No data." . to_string( ) ,
604
+ ] } else { div ! [ ] } ,
605
+ Some ( value) => div ! [
606
+ C ![ "container" ] ,
607
+ C ![ "has-text-centered" ] ,
608
+ h1![
609
+ C ![ "is-size-6" ] ,
610
+ C ![ "has-text-weight-bold" ] ,
611
+ labels
612
+ . iter( )
613
+ . map( |( label, color_idx) | {
614
+ span![
615
+ C ![ "icon-text" ] ,
616
+ C ![ "mx-1" ] ,
617
+ span![
618
+ C ![ "icon" ] ,
619
+ style![
620
+ St :: Color => {
621
+ let ( r, g, b) = Palette99 :: pick( * color_idx) . mix( 0.9 ) . rgb( ) ;
622
+ format!( "#{r:02x}{g:02x}{b:02x}" )
623
+ }
624
+ ] ,
625
+ i![ C ![ "fas fa-square" ] ]
626
+ ] ,
627
+ span![ label] ,
628
+ ]
629
+ } )
630
+ . collect:: <Vec <_>>( ) ,
631
+ ] ,
632
+ raw![ & value] ,
633
+ ] ,
634
+ } ,
635
+ Err ( err) => div ! [ raw![ & format!( "failed to plot chart: {err}" ) ] ] ,
636
+ }
626
637
}
627
638
628
639
pub fn plot_line_chart (
@@ -632,7 +643,11 @@ pub fn plot_line_chart(
632
643
y_min_opt : Option < f32 > ,
633
644
y_max_opt : Option < f32 > ,
634
645
theme : & data:: Theme ,
635
- ) -> Result < String , Box < dyn std:: error:: Error > > {
646
+ ) -> Result < Option < String > , Box < dyn std:: error:: Error > > {
647
+ if all_zeros ( data) {
648
+ return Ok ( None ) ;
649
+ }
650
+
636
651
let ( y_min, y_max, y_margin) = determine_y_bounds (
637
652
data. iter ( )
638
653
. flat_map ( |( s, _) | s. iter ( ) . map ( |( _, y) | * y) )
@@ -691,7 +706,7 @@ pub fn plot_line_chart(
691
706
root. present ( ) ?;
692
707
}
693
708
694
- Ok ( result)
709
+ Ok ( Some ( result) )
695
710
}
696
711
697
712
pub fn plot_dual_line_chart (
@@ -700,7 +715,11 @@ pub fn plot_dual_line_chart(
700
715
x_min : NaiveDate ,
701
716
x_max : NaiveDate ,
702
717
theme : & data:: Theme ,
703
- ) -> Result < String , Box < dyn std:: error:: Error > > {
718
+ ) -> Result < Option < String > , Box < dyn std:: error:: Error > > {
719
+ if all_zeros ( data) && all_zeros ( secondary_data) {
720
+ return Ok ( None ) ;
721
+ }
722
+
704
723
let ( y1_min, y1_max, y1_margin) = determine_y_bounds (
705
724
data. iter ( )
706
725
. flat_map ( |( s, _) | s. iter ( ) . map ( |( _, y) | * y) )
@@ -787,7 +806,7 @@ pub fn plot_dual_line_chart(
787
806
root. present ( ) ?;
788
807
}
789
808
790
- Ok ( result)
809
+ Ok ( Some ( result) )
791
810
}
792
811
793
812
pub fn plot_bar_chart (
@@ -798,7 +817,11 @@ pub fn plot_bar_chart(
798
817
y_min_opt : Option < f32 > ,
799
818
y_max_opt : Option < f32 > ,
800
819
theme : & data:: Theme ,
801
- ) -> Result < String , Box < dyn std:: error:: Error > > {
820
+ ) -> Result < Option < String > , Box < dyn std:: error:: Error > > {
821
+ if all_zeros ( data) && all_zeros ( secondary_data) {
822
+ return Ok ( None ) ;
823
+ }
824
+
802
825
let ( y1_min, y1_max, _) = determine_y_bounds (
803
826
data. iter ( )
804
827
. flat_map ( |( s, _) | s. iter ( ) . map ( |( _, y) | * y) )
@@ -884,7 +907,14 @@ pub fn plot_bar_chart(
884
907
root. present ( ) ?;
885
908
}
886
909
887
- Ok ( result)
910
+ Ok ( Some ( result) )
911
+ }
912
+
913
+ fn all_zeros ( data : & [ ( Vec < ( NaiveDate , f32 ) > , usize ) ] ) -> bool {
914
+ return data
915
+ . iter ( )
916
+ . map ( |p| p. 0 . iter ( ) . map ( |s| s. 1 == 0.0 ) . all ( |e| e) )
917
+ . all ( |e| e) ;
888
918
}
889
919
890
920
fn colors ( theme : & data:: Theme ) -> ( RGBColor , RGBColor ) {
0 commit comments