Author: spadkins
Date: Thu Feb 19 10:30:22 2009
New Revision: 12515

Modified:
   p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm

Log:
0002611: days left category displays wrong sort order on graph axis

Modified: p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm
==============================================================================
--- p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm       (original)
+++ p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm       Thu Feb 19 10:30:22 2009
@@ -85,25 +85,6 @@
     $self->load_data($spec) if (!$spec->{y});
     my $x = $spec->{x};
 
-    my $context     = $self->{context};
-    my $column_defs = $spec->{column_defs};
-    my $keys        = $spec->{keys};
-    if (!ref($keys)) {
-        $keys = $keys ? [split(/,/, $keys)] : [];
-    }
-    foreach my $graph_key (@$keys) {
-        my $domain = $column_defs->{$graph_key}{domain};
-        if ($domain eq "dow") {
-            my $x_new;
-            my $value_domain = $context->value_domain($domain);
-            my $labels = $value_domain->labels();
-            foreach my $x_val (@$x) { 
-                push(@$x_new, $labels->{$x_val});
-            }
-            $x = $x_new;
-        }
-    }
-
     &App::sub_exit($x) if ($App::trace);
     return($x);
 }
@@ -307,6 +288,54 @@
                 $x_seen{$x_value} = 1;
             }
         }
+
+        foreach my $graph_key (@$keys) {
+            my $domain = $column_defs->{$graph_key}{domain};
+            if ($domain =~ /^dow$/) {
+                my @x_new;
+                my $value_domain = $context->value_domain($domain);
+                my $labels       = $value_domain->labels();
+                foreach my $x_val (@x) {
+                    push(@x_new, $labels->{$x_val});
+                }
+                @x = @x_new;
+            }
+            if ($domain =~ /days_left_type\d_abbr/) {
+                my ($val_sort, $vals_sort_idx, $sign, @x_new, @yn_new);
+
+                my %numeric      = ( "integer" => 1, "float" => 1 );
+                my $value_domain = $context->value_domain($domain);
+                my $domain_vals  = $value_domain->values();
+
+                for (my $i = 0; $i <= $#$domain_vals; $i++) {
+                    $val_sort->{$graph_key}{$domain_vals->[$i]} = $i;
+                }
+
+                @$vals_sort_idx = sort {
+                    $sign = 0;
+                    for (my $i = 0; $i <= $#x; $i++) {
+                        my $val_a = $x[$a];
+                        my $val_b = $x[$b];
+                        $sign = (defined $val_sort->{$graph_key}) ?
+                            ($val_sort->{$graph_key}{$val_a} <=> 
$val_sort->{$graph_key}{$val_b}) :
+                            ($numeric{$column_defs->{$graph_key}{type}} ? 
($val_a <=> $val_b) : ($val_a cmp $val_b));
+                        last if ($sign);
+                    }
+                    $sign;
+                } (0 .. $#x);
+
+                for (my $i = 0; $i <= $#$vals_sort_idx; $i++) {
+                    push(@x_new, $x[$vals_sort_idx->[$i]]);
+                }
+                for (my $i = 0; $i <= $#$vals_sort_idx; $i++) {
+                    $yn_new[0][$i] = $yn[0][$vals_sort_idx->[$i]]
+                }
+
+                @x = @x_new;
+                $spec->{y} = \...@yn_new;
+            }
+        }
+
         $spec->{x} = \...@x;
     }
     else {  # there is only one column ($#$columns == 0)
@@ -342,7 +371,7 @@
             $yn_val = $object->{$column};
 
             if ($format && $format =~ /%/) {
-                if ($yn_val ne "") { 
+                if ($yn_val ne "") {
                     $yn_val = App::Widget->format($yn_val, 
$column_defs->{$column});
                     $yn_val =~ s/%//;
                 }

Reply via email to