From 668101ec0faac73fc70ed7921c5ee111a77bbc2c Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Fri, 2 Apr 2010 11:45:15 +0200 Subject: [PATCH] display first tabular data --- lib/MojoFacets.pm | 2 +- lib/MojoFacets/Data.pm | 85 ++++++++++++++++++++++++++++------ templates/data/columns.html.ep | 11 ++++- templates/data/index.html.ep | 18 +++++++ templates/data/table.html.ep | 23 +++++++++ 5 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 templates/data/index.html.ep create mode 100644 templates/data/table.html.ep diff --git a/lib/MojoFacets.pm b/lib/MojoFacets.pm index 3455b95..f353f33 100644 --- a/lib/MojoFacets.pm +++ b/lib/MojoFacets.pm @@ -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; diff --git a/lib/MojoFacets/Data.pm b/lib/MojoFacets/Data.pm index 846421a..41c19c2 100644 --- a/lib/MojoFacets/Data.pm +++ b/lib/MojoFacets/Data.pm @@ -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; diff --git a/templates/data/columns.html.ep b/templates/data/columns.html.ep index e1f0900..dd6c449 100644 --- a/templates/data/columns.html.ep +++ b/templates/data/columns.html.ep @@ -13,10 +13,17 @@ } +
+ + + + +
diff --git a/templates/data/index.html.ep b/templates/data/index.html.ep new file mode 100644 index 0000000..0cc07ea --- /dev/null +++ b/templates/data/index.html.ep @@ -0,0 +1,18 @@ +% layout 'default'; +

Select data file to load

+ +
+ + + + + +
diff --git a/templates/data/table.html.ep b/templates/data/table.html.ep new file mode 100644 index 0000000..e38b0e2 --- /dev/null +++ b/templates/data/table.html.ep @@ -0,0 +1,23 @@ +% layout 'default'; + +columns: <%= join(',',@$columns) %> + + + + +% foreach my $n ( @$columns ) { + +% } + + +% foreach my $row ( @$sorted ) { + +% foreach my $col ( @$columns ) { + +% } + +% } + +
<%= $n %>
<%= ref $row->{$col} eq 'ARRAY' ? join(', ',@{ $row->{$col} }) : $row->{$col} %>
+ + -- 2.20.1