Rev 26 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/usr/bin/perl#if ($ENV{SHELL}) { die "This script shouldn't be executed from the command line!\n"; }#use strict;use cPanelUserConfig;use CGI qw/param cookie header start_html url/;use HTML::Tiny;use tableViewer;use RollerCon;our $h = HTML::Tiny->new( mode => 'html' );my $cookie_string = authenticate (2) || die;our ($EML, $PWD, $LVL) = split /&/, $cookie_string;my $user = getUser ($EML);my $username = $h->a ({ href=>"/schedule/manage_user.pl?submit=View&RCid=$user->{RCid}" }, $user->{derby_name});my $RCid = $user->{RCid};my $RCAUTH_cookie = CGI::Cookie->new(-name=>'RCAUTH',-value=>"$cookie_string",-expires=>"+30m");my $YEAR;my $pageTitle = "User Report";my $prefscookie = "userreport";our $DBTABLE = 'official';my %COLUMNS = (# colname => [qw(DisplayName N type status)], status -> static | default | <blank>RCid => [qw(ID 5 number )],derby_name => [qw(DerbyName 10 text default )],email => [qw(Email 15 text default )],real_name => [qw(RealName 20 text default )],pronouns => [qw(Pronouns 25 text default )],tshirt => [qw(TShirtSize 30 select default )],phone => [qw(Phone 35 text )],access => [qw(vOrcAccess 40 select )],department => [qw(Department 45 select default )],added => [qw(Added 50 date )],last_login => [qw(LastLogin 55 date )]);my $ROLE = getAccessLevels;my $DepartmentNames = getDepartments ();my $stylesheet = "/style.css";my $homeURL = '/schedule/';my @pagelimitoptions = ("All", 5, 10, 25);# If we need to modify line item values, create a subroutine named "modify_$columnname"# It will receive a hashref to the object lineitem# You can also create specific "filter_column" subroutines...#sub modify_RCid {# my $li = shift // "";# return join " ", $li->{RCid},# $h->a ({ href=>"manage_user.pl?RCid=$li->{RCid}" }, "[Edit]"),# ;#}sub modify_department {my $li = shift // "";if ($li->{"department"}) {my $Ds = convertDepartments $li->{"department"};return join $h->br, map { ($Ds->{$_} == 0 and ($ORCUSER->{department}->{$_} > 1 or $LVL > 4)) ? $h->a ({ onClick=>"event.stopPropagation(); window.open('activate_user.pl?RCid=$li->{RCid}&department=$_','Activating User','resizable,height=260,width=370');" }, "$DepartmentNames->{$_} - $ROLE->{$Ds->{$_}}") : "$DepartmentNames->{$_} - $ROLE->{$Ds->{$_}}" } sort keys %{$Ds};} else {return "";}}sub modify_access {my $li = shift // "";my @levels = ($li->{"access"});if ($li->{"department"}) {push @levels, values %{convertDepartments $li->{"department"}};}return $ROLE->{ max @levels };}sub filter_department {my $colName = shift;my $filter = shift // "";if ($filter) {if ($filter eq "-blank-") {return "($colName = '' or isNull($colName) = 1)";}if ($filtered_by_access ne "") {return "$colName like \"%$filter-$filtered_by_access%\"";} else {return "$colName like \"%$filter%\"";}} else {my @options = ("");push @options, "-blank-" unless $LVL < 4;push @options, ($LVL < 4 and $ORCUSER->{department}->{VCI} < 2) ? grep { $ORCUSER->{department}->{$_} >= 2 } sort keys %{$ORCUSER->{department}} : sort keys %{$DepartmentNames};@options = map { $FORM{"filter-department"} eq $_ ?( $h->option ({ selected=>[], value=>$_ }, $_ eq "-blank-" ? $_ : $DepartmentNames->{$_}) ) :( $h->option ({ value=>$_ }, $_ eq "-blank-" ? $_ : $DepartmentNames->{$_}) ) } @options;return $FORM{autoload} ? $h->select ({ name=>"filter-department", onChange=>"page.value = 1; submit();" }, [@options]) : $h->select ({ name=>"filter-department" }, [$h->option (), @options]);}}our $filtered_by_access = "";sub filter_access {my $colName = shift;my $filter = shift // "";if ($filter ne "") {$filtered_by_access = $filter;return $filter eq "-1" ? "$colName = $filter" : "($colName = $filter or department like '%$filter%')";} else {my @options = ("", -1, 0, 1, 2, 3, 4, 5);@options = map { $FORM{"filter-access"} eq $_ ?( $h->option ({ selected=>[], value=>$_ }, $ROLE->{$_}) ) :( $h->option ({ value=>$_ }, $ROLE->{$_}) ) } @options;return $FORM{autoload} ? $h->select ({ name=>"filter-access", onChange=>"page.value = 1; submit();" }, [@options]) : $h->select ({ name=>"filter-access" }, [$h->option (), @options]);}}# Ideally, nothing below this comment needs to change#-------------------------------------------------------------------------------our %NAME = map { $_ => $COLUMNS{$_}->[0] } keys %COLUMNS;our %colOrderHash = map { $_ => $COLUMNS{$_}->[1] } keys %COLUMNS;our %colFilterTypeHash = map { $_ => $COLUMNS{$_}->[2] } keys %COLUMNS;our @staticFields = sort byfield grep { $COLUMNS{$_}->[3] eq 'static' } keys %COLUMNS;our @defaultFields = sort byfield grep { defined $COLUMNS{$_}->[3] } keys %COLUMNS;#our @defaultFields = grep { $COLUMNS{$_}->[3] eq 'default' or inArray ($_, \@staticFields) } keys %COLUMNS;our @allFields = sort byfield keys %NAME;our @displayFields = ();our @hideFields = ();my $QUERY_STRING;my $pagelimit = param ("limit") // $pagelimitoptions[$#pagelimitoptions];my $curpage = param ("page") // 1;our %FORM;my $FILTER;foreach (param()) {if (/^year$/) { #$YEAR = param($_);next;}$FORM{$_} = param($_); # Retrieve all of the FORM data submittedif ((/^filter/) and ($FORM{$_} ne '')) { # Build a set of filters to applymy ($filter,$field) = split /-/, $_;$FILTER->{$field} = $FORM{$_};} elsif ($FORM{$_} eq "true") # Compile list of fields to display{ push @displayFields, $_; }}if (exists $FORM{autoload}) { # If the FORM was submitted (i.e. the page is being redisplayed),# build the data for the cookie that remembers the page setupmy $disFields = join ":", @displayFields;my $fils = join ":", map { "$_=$FILTER->{$_}" } keys %{$FILTER};$QUERY_STRING = $disFields.'&'.$fils.'&'.$FORM{sortby}.'&'.$FORM{autoload};}if (!(exists $FORM{autoload})) { # No FORM was submitted...if (my $prefs = cookie ($prefscookie) and !defined param ("ignoreCookie")) { # Check for cookies from previous visits.my ($disF, $filts, $sb, $al) = split /&/,$prefs;@displayFields = split /:/,$disF;foreach my $pair (split /:/, $filts) {my ($key, $value) = split /=/, $pair;$FORM{"filter-$key"} = $value;$FILTER->{$key} = $value;}$FORM{sortby} = $sb;$FORM{autoload} = $al;$QUERY_STRING = $prefs;} else {@displayFields = @defaultFields; # Otherwise suppply a default list of columns.$FORM{autoload} = 1; # And turn aut0load on by default.}}# let's just make sure the columns are in the right order (and there aren't any missing)@displayFields = sort byfield uniq @displayFields, @staticFields;# If the field isn't in the displayFields list, then add it to the hideFields list@hideFields = grep { notInArray ($_, \@displayFields) } @allFields;# Process any filters provided in the form to pass to the databasemy @whereClause = map { filter ($_, $FILTER->{$_}) } grep { defined $FILTER->{$_} } @displayFields;#warn @whereClause;if ($LVL < 4 and $ORCUSER->{department}->{VCI} < 2) {# warn keys %{$ORCUSER->{department}};my $string = join " or ", map { 'department like "%'.$_.'%"' } grep { $ORCUSER->{department}->{$_} >= 2 } keys %{$ORCUSER->{department}};$string = "($string)";# warn $string;push @whereClause, $string;}#push @whereClause, "year(date) = '$YEAR'";# Given the fields to display and the where conditions,# "getData" will return a reference to an array of# hash references of the results.my ($data, $datacount) = getData (\@displayFields, \@whereClause, $DBTABLE, $FORM{sortby}, $curpage, $pagelimit);my @ProductList = @{ $data };#my @ProductList = @{ getData (\@displayFields, \@whereClause, $DBTABLE, $FORM{sortby}, $curpage, $pagelimit) };my $x = scalar @ProductList; # How many results were returned?# If the user is trying to download the Excel file, send it to them and then exit out.if ($FORM{excel}) {exportExcel (\@ProductList, "RC_Officiating_Shifts");exit;}my $signedOnAs = $username ? "Welcome, $username. ".$h->a ({ href=>"index.pl", onClick=>"document.cookie = 'RCAUTH=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/';return true;" }, "[Log Out]") : "You are not signed in.";# Set some cookie stuff...my $path = `dirname $ENV{REQUEST_URI}`; chomp $path; $path .= '/' unless $path eq "/";my $queryCookie = cookie(-NAME=>$prefscookie,-VALUE=>"$QUERY_STRING",-PATH=>"$path",-EXPIRES=>'+365d');# Print the headerprint header (-cookie=> [ $queryCookie, $RCAUTH_cookie ] );# print "<!-- FORM \n\n"; # Debug code to dump the FORM to a html comment# print "I'm catching updates!!!\n\n";# foreach $key (sort (keys %FORM)) # Must be done after the header is written!# { print "\t$key: $FORM{$key}\n"; }# print "--> \n\n";### print "<!-- ENV \n\n"; # Debug code to dump the ENV to a html comment# foreach $key (sort (keys %ENV)) # Must be done after the header is written!# { print "\t$key: $ENV{$key}\n"; }# print "--> \n\n";## print "\n\n\n\n<!-- $QUERY_STRING --> \n\n\n\n";#------------------# Toggle the autoload fields within the table elementsour ($onClick, $onChange); # (also used in scanFunctions)my ($radiobutton, $refreshbutton, $sortby);if ($FORM{autoload}) {$onClick = "onClick='submit();'";$onChange = "onChange='page.value = 1; submit();'";$radiobutton = $h->div ({ class=>'autoload' },["Autoload Changes: ",$h->input ({ type=>"radio", name=>'autoload', class=>'accent', value=>1, onClick=>'submit();', checked=>[] }), "On ",$h->input ({ type=>"radio", name=>'autoload', class=>'accent', value=>0, onClick=>'submit();' }), "Off ",]);$sortby = $h->select ({name=>"sortby", onChange=>'submit();' }, [ map { $FORM{sortby} eq $_ ? $h->option ({ value=>$_, selected=>[] }, $NAME{$_}) : $h->option ({ value=>$_ }, $NAME{$_}) } @displayFields ]);} else {$onClick = "";$onChange = "onChange='page.value = 1;'";$radiobutton = $h->div ({ class=>'autoload' },["Autoload Changes: ",$h->input ({ type=>"radio", name=>'autoload', class=>'accent', value=>1, onClick=>'submit();' }), "On ",$h->input ({ type=>"radio", name=>'autoload', class=>'accent', value=>0, onClick=>'submit();', checked=>[] }), "Off ",]);$refreshbutton = $h->input ({ type=>"button", value=>"Refresh", onClick=>"submit(); return false;" });$sortby = $h->select ({name=>"sortby" }, [ map { $FORM{sortby} eq $_ ? $h->option ({ value=>$_, selected=>[] }, $NAME{$_}) : $h->option ({ value=>$_ }, $NAME{$_}) } @displayFields ]);}print start_html (-title => $pageTitle, -style => {'src' => $stylesheet} );print $h->open ('form', { action=>url, method=>'POST', name=>'Req' });print $h->input ({ type=>"hidden", name=>"excel", value=>0 });print $h->div ({ class => "accent pageheader" }, [$h->h1 ($pageTitle),$h->div ({ class=>"sp0" }, [$h->div ({ class=>"spLeft" }, [$radiobutton]),$h->div ({ class=>"spRight" }, [$h->input ({ type=>"button", value=>"Home", onClick=>"window.location.href='$homeURL'" }),$refreshbutton]),]),]);# Print the Hidden fields' check boxes (if there are any)my $c = 1;my @hiddencheckboxes;my @hiddenrows;foreach my $field (sort { $NAME{$a} cmp $NAME{$b}; } @hideFields) {if ($FORM{autoload}) {push @hiddencheckboxes, $h->div ({ class=>'rTableCell quarters nowrap', onClick=>"Req.$field.click();" }, [ $h->input ({ type=>'checkbox', class=>'accent', name=>$field, value=>'true', onClick=>"event.stopPropagation(); submit();" }), $NAME{$field} ]);} else {push @hiddencheckboxes, $h->div ({ class=>'rTableCell quarters nowrap', onClick=>"Req.$field.checked=!Req.$field.checked;" }, [ $h->input ({ type=>'checkbox', class=>'accent', name=>$field, value=>'true', onClick=>"event.stopPropagation();" }), $NAME{$field} ]);}if ($c++ % 4 == 0) {push @hiddenrows, $h->div ({ class=>'rTableRow' }, [ @hiddencheckboxes ]);@hiddencheckboxes = [];}}push @hiddenrows, $h->div ({ class=>'rTableRow' }, [ @hiddencheckboxes ]) unless --$c % 4 == 0;if (scalar @hideFields) {my @topleft;push @topleft, $h->div ({ class=>"nowrap" }, "Hidden Columns:");push @topleft, $h->div ({ class=>'rTable' }, [ @hiddenrows ]);print $h->div ({ class=>"sp0" }, [$h->div ({ class=>"spLeft" }, [ @topleft ]),$h->div ({ class=>"spRight" }, [$signedOnAs])]);}# Print the main table...............................................print $h->open ('div', { class=>'rTable' });my @tmptitlerow;foreach my $f (@displayFields) { # Print the Column headingsif (inArray ($f, \@staticFields)) {push @tmptitlerow, $h->div ({ class=>'rTableHead' }, [ $h->input ({ type=>"hidden", name=>$f, value=>"true" }), $NAME{$f} ]);} else {if ($FORM{autoload}) {push @tmptitlerow, $h->div ({ class=>'rTableHead', onClick=>"Req.$f.click();" }, [ $h->input ({ type=>"checkbox", class=>"accent", name=>$f, value=>"true", checked=>[], onClick=>'event.stopPropagation(); submit();' }), $NAME{$f} ]);} else {push @tmptitlerow, $h->div ({ class=>'rTableHead', onClick=>"Req.$f.checked=!Req.$f.checked;" }, [ $h->input ({ type=>"checkbox", class=>"accent", name=>$f, value=>"true", checked=>[], onClick=>"event.stopPropagation();" }), $NAME{$f} ]);}}}# Print the filter boxes...print $h->div ({ class=>'rTableHeading' }, [ @tmptitlerow ], [ map { $h->div ({ class=>'rTableCell filters' }, filter ($_)) } @displayFields ], $h->div ({ class=>"rTableCell" }));# Print the thingsforeach my $t (@ProductList) {print $h->div ({ class=>'rTableRow shaded', onclick=>"location.href='manage_user.pl?RCid=$t->{RCid}'" }, [ map { $h->div ({ class=>'rTableCell' }, exists &{"modify_".$_} ? &{"modify_".$_} ($t) : $t->{$_}) } @displayFields ]);}print $h->close ('div');# close things out................................................my $pages = $pagelimit eq "All" ? 1 : int( $datacount / $pagelimit + 0.99 );if ($curpage > $pages) { $curpage = $pages; }my @pagerange;if ($pages <= 5 ) {@pagerange = 1 .. $pages;} else {if ($curpage <= 3) {@pagerange = (1, 2, 3, 4, ">>");} elsif ($curpage >= $pages - 2) {@pagerange = ("<<", $pages-3, $pages-2, $pages-1, $pages);} else {@pagerange = ("<<", $curpage-1, $curpage, $curpage+1, ">>");}}print $h->br; # print $h->br;print $h->div ({ class=>"sp0" }, [$h->div ({ class=>"spLeft" }, [$h->div ({ class=>"footer" }, ["To bookmark, save, or send this exact view, use the ",$h->a ({ href=>'', onClick=>"window.document.Req.method = 'GET'; Req.submit(); return false;" }, "[Full URL]"),$h->br,"If this page is displaying oddly, ", $h->a ({ href=>url ()."?ignoreCookie=1" }, "[Reset Your View]"),$h->br,$h->a ({ href=>"", target=>"_new", onClick=>"window.document.Req.excel.value=1; window.document.Req.submit(); window.document.Req.excel.value=0; return false;" }, "[Export Displayed Data as an Excel Document.]"),$h->br,"This page was displayed on ", currentTime (),$h->br,"Please direct questions, problems, and concerns to Officials.RollerCon.Schedule\@gmail.com"])]),$h->div ({ class=>"spRight" }, [$h->h5 (["$x of $datacount Record". ($x == 1 ? "" : "s") ." Displayed", $h->br,"Sorted by ", $sortby, $h->br,"Displaying ", $h->select ({ name=>"limit", onChange=>"page.value = 1; submit();" }, [ map { $pagelimit == $_ ? $h->option ({ selected=>[] }, $_) : $h->option ($_) } @pagelimitoptions ]), " Per Page", $h->br,( $pages > 1 ? ( join " ", map { $_ == $curpage ? "<B>$_</b>" :$_ eq "<<" ? $h->a ({ onClick=>qq{Req.page.value=1; Req.submit();} }, "$_") :$_ eq ">>" ? $h->a ({ onClick=>qq{Req.page.value=$pages; Req.submit();} }, "$_") :$h->a ({ onClick=>qq{Req.page.value=$_; Req.submit();} }, "[$_]") } @pagerange ) : "" ), $h->br,$h->input ({ type=>"hidden", name=>"page", value=>$curpage })])]),]);#print $h->br; # print $h->br;#print $h->h5 ("$x Record(s) Displayed");#print $h->div ({ class=>"footer" }, [# "To bookmark, save, or send this exact view, use the ",# $h->a ({ href=>'', onClick=>"window.document.Req.method = 'GET'; Req.submit(); return false;" }, "[Full URL]"),# $h->br,# "This page was displayed on $now",# $h->br,# "Please direct questions, problems, and concerns to noone\@gmail.com"#]);print $h->close('form');print $h->close('html');