package EPrints::Plugin::Screen::REF::Report::REF2::Listing; use EPrints::Plugin::Screen::REF; @ISA = ( 'EPrints::Plugin::Screen::REF' ); use strict; our @STATS = ( total_users => sub { my( $s ) = @_; $_[1] = {} if !defined $_[1]; $_[1]{$s->value( "user_id" )}++; return scalar keys %{$_[1]}; }, total => sub { my( $s ) = @_; $_[1]++; return $_[1]; }, mean_self_rating => sub { my( $s ) = @_; $_[1] = [] if !defined $_[1]; $_[1][0] += $s->value( "self_rating" ); $_[1][1] ++; return $_[1][0] / $_[1][1]; }, ); sub new { my( $class, %params ) = @_; my $self = $class->SUPER::new(%params); $self->{appears} = [ { place => "ref_tools", position => 200, } ]; return $self; } sub can_be_viewed { my( $self ) = @_; my $user = $self->{session}->current_user; # who can view the reports? # main REF Admins? role = ? # people who have their ref_uoa_role field set # return 1 if( defined $user && $user->has_role( 'ref/admin' ) ); return 0 if !defined $self->current_benchmark; return 1 if( defined $user && $user->exists_and_set( 'ref_uoa_role' ) ); return 0; } # can the user access ALL the reports (eg. Admin)? If so, show the UoA tree? # can the user access a single report (UoA admin)? If so, show the report for that UoA # otherwise show the personal report? sub render { my( $self ) = @_; my $session = $self->{session}; my $benchmark = $self->{processor}->{benchmark}; my $chunk = $session->make_doc_fragment; my $user = $session->current_user; my $ref_roles = $user->get_value( 'ref_uoa_role' ); return $chunk unless( EPrints::Utils::is_set( $ref_roles ) ); # render current benchmark $chunk->appendChild( $self->render_benchmarks ); my $container = $session->make_element( 'div', align => 'center', style => 'width:100%;text-align:center' ); $chunk->appendChild( $container ); my $table = $session->make_element( 'table', style=> 'margin-left:auto;margin-right:auto;' ); $container->appendChild( $table ); my $tr = $table->appendChild( $session->make_element( "tr" ) ); my $th = $tr->appendChild( $session->make_element( "th" ) ); foreach my $id (map { $STATS[$_] } grep { $_ % 2 == 0 } 0..$#STATS) { my $th = $tr->appendChild( $session->make_element( "th" ) ); $th->appendChild( $session->html_phrase( "ref:stat_$id" ) ); } # link to the available reports foreach my $uoa ( @$ref_roles ) { my $subject = $session->dataset( 'subject' )->dataobj( $uoa ); next if !defined $subject; $table->appendChild( $self->render_result_row( $subject ) ); } return $chunk; } sub render_result_row { my( $self, $subject ) = @_; my $session = $self->{session}; my $benchmark = $self->{processor}->{benchmark}; my $href = URI->new( $session->config( "userhome" ) ); $href->query_form( screen => "REF::Report::REF2::View", uoa => $subject->id, ); my $link = $session->render_link( $href ); my @ctx = map { undef } @STATS; my %results; $benchmark->uoa_selections( $subject )->map(sub { (undef, undef, my $selection) = @_; # perform the compound AND my $ok = 0; for(@{$selection->value( "ref" )}) { $ok = 1, last if $_->{benchmarkid} == $benchmark->id && $_->{uoa} eq $subject->id; } return if !$ok; foreach my $i (grep { $_ % 2 == 0 } 0..$#STATS) { my( $id, $f ) = @STATS[$i,$i+1]; $results{$id} = &$f( $selection, $ctx[$i] ); } }); my $tr = $session->make_element( "tr" ); # title { my $td = $tr->appendChild( $session->make_element( "td" ) ); $link->appendChild( $subject->render_description ); $td->appendChild( $link ); } foreach my $id (map { $STATS[$_] } grep { $_ % 2 == 0 } 0..$#STATS) { my $td = $tr->appendChild( $session->make_element( "td" ) ); $results{$id} = sprintf( "%.3f", $results{$id} ) if( defined $results{$id} && $results{$id} =~ /^\d+\.\d+$/ ); $td->appendChild( $session->make_text( $results{$id} || '0' ) ); } return $tr; } 1;