Rev 11 | 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 (3) || 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 = "Dev Log Viewer";my $prefscookie = "logscookie";our $DBTABLE = 'v_log';my %COLUMNS = (# colname => [qw(DisplayName N type status)], status -> static | default | <blank>eventid => [qw(EventID 5 number default )],timestamp => [qw(Timestamp 10 date default )],event => [qw(Event 15 text default )],RCid => [qw(RCID 20 number default )],derby_name => [qw(DerbyName 25 select default )],email => [qw(Email 30 text )],real_name => [qw(RealName 35 text )],access => [qw(Role 40 select )]);my $stylesheet = "/style.css";my $homeURL = '/';my @pagelimitoptions = ("All", 5, 10, 25);# Set any custom "where" DB filters here...my @whereClause;# If we need to modify line item values, create a subroutine named "modify_$columnname"# It will receive a hashref to the object lineitem# 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 databasepush @whereClause, map { filter ($_, $FILTER->{$_}) } grep { defined $FILTER->{$_} } @displayFields;#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' }, [ 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');