display first tabular data
authorDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 2 Apr 2010 09:45:15 +0000 (11:45 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 2 Apr 2010 09:45:15 +0000 (11:45 +0200)
lib/MojoFacets.pm
lib/MojoFacets/Data.pm
templates/data/columns.html.ep
templates/data/index.html.ep [new file with mode: 0644]
templates/data/table.html.ep [new file with mode: 0644]

index 3455b95..f353f33 100644 (file)
@@ -15,7 +15,7 @@ sub startup {
     my $r = $self->routes;
 
     # Default route
-    $r->route('/:controller/:action/:id')->to('data#stats', id => 1);
+    $r->route('/:controller/:action/:id')->to('data#index', id => 1);
 }
 
 1;
index 846421a..41c19c2 100644 (file)
@@ -9,36 +9,93 @@ use Data::Dump qw(dump);
 use File::Slurp;
 use JSON;
 
-our $data;
-
-sub _data {
+sub index {
        my $self = shift;
 
-       # we could use Mojo::JSON here, but it's too slow
-       $data ||= from_json read_file $self->app->home->rel_file( 'data/bibpsi.js' );
+       my $path = $self->app->home->rel_dir('data');
+       die "no data dir $path" unless -d $path;
+
+       opendir(my $dir, $path) || die $!;
+       my @files = 
+               grep { -f "$path/$_" && $_ =~ m/\.js(on)?$/ }
+               readdir $dir;
+       close($dir);
+
+       $self->render( files => [ @files ] );
 }
 
+our $data;
+our $stats;
 
-sub stats {
-    my $self = shift;
+sub load {
+       my $self = shift;
 
-       $self->_data;
+       my $path = $self->app->home->rel_file( 'data/' . $self->param('path') );
+       die "$path $!" unless -r $path;
 
-       my $stats;
+       # we could use Mojo::JSON here, but it's too slow
+       $data = from_json read_file $path;
 
        foreach my $e ( @{ $data->{items} } ) {
                foreach my $n ( keys %$e ) {
-                       $stats->{column}->{$n}->{count}++;
-                       $stats->{column}->{$n}->{number}++ if $e->{$n} =~ m/[-+]?([0-9]*\.[0-9]+|[0-9]+)/;
+                       $stats->{$n}->{count}++;
+                       $stats->{$n}->{number}++
+                               if $e->{$n} =~ m/^[-+]?([0-9]*\.[0-9]+|[0-9]+)$/;
+                       $stats->{$n}->{array} += $#{ $e->{$n} } + 1
+                               if ref $e->{$n} eq 'ARRAY';
                }
        }
 
-       $self->app->log->debug( 'stats', dump($stats) );
-    # Render template "example/welcome.html.ep" with message
+       foreach my $n ( keys %$stats ) {
+               next unless defined $stats->{$n}->{array};
+               delete $stats->{$n}->{array}
+                       if $stats->{$n}->{array} == $stats->{$n}->{count};
+       }
+
+       warn dump($stats);
+
+       $self->redirect_to( '/data/columns' );
+}
+
+
+sub columns {
+    my $self = shift;
+
     $self->render(
-               message => 'Welcome to the Mojolicious Web Framework!',
+               message => 'Select columns to display',
                stats => $stats,
        );
 }
 
+sub table {
+    my $self = shift;
+
+       $self->redirect_to('/data/index') unless $data->{items};
+
+       my @columns = $self->param('columns');
+
+       my $order  = $self->param('order') || $columns[0];
+       my $offset = $self->param('offset') || 0;
+       my $limit  = $self->param('limit') || 10;
+
+       my @sorted = sort {
+               $a->{$order} cmp $b->{$order}
+       } @{ $data->{items} };
+
+       @sorted = splice @sorted, $offset, $limit;
+
+       warn "# sorted ", dump @sorted;
+
+       warn "$order $offset $limit";
+
+       $self->render(
+               order => $order,
+               offset => $offset,
+               limit => $limit,
+               sorted => [ @sorted ],
+               columns => [ @columns ],
+       );
+
+}
+
 1;
index e1f0900..dd6c449 100644 (file)
 }
 </style>
 
+<form method=post action=/data/table >
+
 <ul>
-% foreach my $n ( keys %{ $stats->{column} } ) {
+% foreach my $n ( keys %$stats ) {
 <li>
+<input type=checkbox name=columns value="<%= $n %>" <%= param($n) ? 'checked' : '' %>>
 <%= $n %>
-<span class="count"><%= $stats->{column}->{$n}->{count} %></span>
+<span class="count"><%= $stats->{$n}->{count} %></span>
 % }
 </ul>
+
+<input type=submit>
+
+</form>
diff --git a/templates/data/index.html.ep b/templates/data/index.html.ep
new file mode 100644 (file)
index 0000000..0cc07ea
--- /dev/null
@@ -0,0 +1,18 @@
+% layout 'default';
+<h2>Select data file to load</h2>
+
+<form method=post action=/data/load >
+
+<ul>
+% foreach my $n ( @$files ) {
+<li>
+<label>
+<input type=radio name=path value=<%= $n %> >
+<%= $n %>
+</label>
+% }
+</ul>
+
+<input type=submit value="Load">
+
+</form>
diff --git a/templates/data/table.html.ep b/templates/data/table.html.ep
new file mode 100644 (file)
index 0000000..e38b0e2
--- /dev/null
@@ -0,0 +1,23 @@
+% layout 'default';
+
+columns: <%= join(',',@$columns) %>
+
+<table>
+
+<tr>
+% foreach my $n ( @$columns ) {
+<th><%= $n %></th>
+% }
+</tr>
+
+% foreach my $row ( @$sorted ) {
+<tr>
+% foreach my $col ( @$columns ) {
+<td><%= ref $row->{$col} eq 'ARRAY' ? join(', ',@{ $row->{$col} }) : $row->{$col} %></td>
+% }
+</tr>
+% }
+
+</table>
+
+