src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl 1.12
1.12 2009/05/07 00:12:33 tdreszer
Now the page will be sorted on the defined sort order fields from the metadata.
Index: src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl,v
retrieving revision 1.11
retrieving revision 1.12
diff -b -B -U 4 -r1.11 -r1.12
--- src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl 23 Apr 2009 22:09:22 -0000 1.11
+++ src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl 7 May 2009 00:12:33 -0000 1.12
@@ -62,8 +62,14 @@
print OUT_FILE " <TITLE>Index of $filePath</TITLE>\n";
print OUT_FILE " </HEAD>\n";
print OUT_FILE " <BODY>\n";
print OUT_FILE "<IMG SRC=\"/icons/back.gif\" ALT=\"[DIR]\"> <A HREF=\"../\">Parent Directory</A><BR>\n\n";
+# The following doesn't do any good because we want to sort, not drag and drop!
+# # my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
+# my (undef, $minute, $hour, $dayOfMonth, undef, undef, undef, $dayOfYear, undef) = localtime();
+# print OUT_FILE "<script type='text/javascript' src='../js/jquery.js?v=" . $dayOfYear . $dayOfMonth . $hour . $minute . "'></script>\n";
+# print OUT_FILE "<noscript><b>Your browser does not support JavaScript so some functionality may be missing!</b></noscript>\n";
+# print OUT_FILE "<script type='text/javascript' src='../js/jquery.tablednd.js?v=" . $dayOfYear . $dayOfMonth . $hour . $minute . "'></script>\n";
my $hasPreamble = 0;
if($preamble && length($preamble) > 0) { # TODO check that prolog exists
if(open( PREAMBLE, "$filePath/$preamble")) {
@@ -86,8 +92,56 @@
print OUT_FILE "\n<HR>\n";
print OUT_FILE "</BODY></HTML>\n";
}
+sub cmpRows {
+# Compares the sortable fields of a pair of rows
+ my ($aSortables,undef) = split(/\|/,$a,2);
+ my ($bSortables,undef) = split(/\|/,$b,2);
+ my @As = split(/ /,$aSortables);
+ my @Bs = split(/ /,$bSortables);
+ my $ret = 0;
+ my $ix=0;
+ while($ret == 0 && $As[$ix] && $Bs[$ix]) {
+ $ret = ( $As[$ix] cmp $Bs[$ix] );
+ $ix++;
+ }
+ return $ret;
+}
+
+sub sortAndPrintHtmlTableRows {
+ local *OUT_FILE = shift;
+ my @rows = sort cmpRows @_;
+ while(my $line = shift @rows) {
+ my ( undef,$row ) = split(/\|/, $line,2);
+ print OUT_FILE $row;
+ }
+}
+
+# prints a row closing of an html table
+sub sortableHtmlRow {
+# returns a table row ready to print but prepended by sortable columns
+ my ($sortablesRef,$file,$size,$date,$releaseDate,$metaData) = @_;
+
+ my @sortables = @{$sortablesRef};
+ my $row =join(" ", @sortables);
+ $row .= "|";
+
+ if($releaseDate && length($releaseDate) > 0) {
+ $row .= "<TR valign='top'><TD align='left'> $releaseDate";
+ } else {
+ $row .= "<TR valign='top'><TD align='left'> ";
+ }
+ $row .= "<TD><A type='application/zip' target='_blank' HREF=\"$file\">$file</A>";
+ $row .= "<TD align='right'> $size<TD> $date ";
+ if($metaData && length($metaData) > 0) {
+ $row .= "<TD nowrap>$metaData";
+ # Find cell,dataType,antibody,lab,type,subId
+ # Alternative would be to package up all of the javascript sort code and then make individual columns for sortable metadata
+ }
+ $row .= "</TR>\n";
+}
+
sub htmlTableRow {
# prints a row closing of an html table
local *OUT_FILE = shift;
my ($file,$size,$date,$releaseDate,$metaData) = @_;
@@ -140,9 +194,9 @@
return ( \@tags, \@vals );
}
sub metadataArraysRemoveHash {
-# Removes members of has from metadata Arrays
+# Removes members of hash from metadata Arrays
my ($tagsRef,$valsRef,$removeRef) = @_;
my @tags = @{$tagsRef};
my @vals = @{$valsRef};
my %remove = %{$removeRef};
@@ -161,10 +215,74 @@
}
return ( \@tagsOk, \@valsOk );
}
+sub metadataArraysMoveValuesToFront {
+# Removes members of hash from metadata Arrays
+ my ($tagsRef,$valsRef,$fieldsRef) = @_;
+ my @tags = @{$tagsRef};
+ my @vals = @{$valsRef};
+ my @fields = @{$fieldsRef};
+ my %fldsHash;
+ my @labels;
+ my @values;
+
+ my $ix=0;
+ while($fields[$ix]) {
+ my $tix=0;
+ while($tags[$tix]) {
+ if($tags[$tix] eq $fields[$ix]) {
+ push( @labels, $tags[$tix]);
+ push( @values, $vals[$tix]);
+ }
+ $tix++;
+ }
+ $fldsHash{$fields[$ix++]} = $ix;
+ }
+ ( $tagsRef, $valsRef ) = metadataArraysRemoveHash( \@tags,\@vals,\%fldsHash );
+ @tags = @{$tagsRef};
+ @vals = @{$valsRef};
+ push(@labels,@tags);
+ push(@values,@vals);
+ return ( \@labels, \@values );
+}
+
+sub sortablesSet {
+# Joins metadata tags and vals arrays into single array of tag=val
+ my ($sortablesRef,$fieldsRef,$tag,$val) = @_;
+ my @sortables = @{$sortablesRef};
+ my @sortFields = @{$fieldsRef};
+ my $six = 0; # keep order
+ while($sortFields[$six]) {
+ if($tag eq $sortFields[$six]) {
+ if($val && $val ne "") {
+ $sortables[$six] = $val;
+ } else {
+ $sortables[$six] = "~"; # must maintain field order during split on " "
+ }
+ }
+ $six++;
+ }
+ return @sortables;
+}
+
+sub sortablesSetFromMetadataArrays {
+# Joins metadata tags and vals arrays into single array of tag=val
+ my ($sortablesRef,$fieldsRef,$tagsRef,$valsRef) = @_;
+ my @sortables = @{$sortablesRef};
+ #my @sortFields = @{$fieldsRef};
+ my @tags = @{$tagsRef};
+ my @vals = @{$valsRef};
+ my $tix = 0;
+ while($tags[$tix]) {
+ @sortables = sortablesSet( \@sortables,$fieldsRef,$tags[$tix],$vals[$tix]);
+ $tix++;
+ }
+ return @sortables;
+}
+
sub metadataArraysJoin {
-# Removes members of has from metadata Arrays
+# Joins metadata tags and vals arrays into single array of tag=val
my ($tagsRef,$valsRef) = @_;
my @tags = @{$tagsRef};
my @vals = @{$valsRef};
my @meta;
@@ -227,8 +345,10 @@
# Start the page
htmlStartPage(*OUT_FILE,$downloadsDir,$indexHtml,$preamble);
+my @rows; # Gather rows to be printed here
+
print OUT_FILE "<TABLE cellspacing=0>\n";
print OUT_FILE "<TR valign='bottom'><TH>RESTRICTED<BR>until<TH align='left'> File<TH align='right'>Size<TH>Submitted<TH align='left'> Details</TR>\n";
for my $line (@fileList) {
@@ -256,8 +376,11 @@
my $releaseDate = "";
my $submitDate = "";
my %metaData;
+ ### TODO: Developer: set sort order here; sortables must have same number of strings and '~' is lowest val printable
+ my @sortFields = ("cell","dataType","antibody","lab","type","view","level","annotation","replicate","subId");
+ my @sortables = ( "~", "~", "~", "~", "~", "~", "~", "~", "~", "~");
my $typePrefix = "";
my $results = $db->quickQuery("select type from $database.trackDb where tableName = '$tableName'");
if($results) {
my ($type) = split(/\s+/, $results); # White space
@@ -298,10 +421,11 @@
} elsif($pair[0] eq "dateSubmitted" && length($submitDate) == 0) { # metadata has priority
$submitDate = $pair[1];
} elsif($pair[0] eq "cell" || $pair[0] eq "antibody" || $pair[0] eq "promoter") {
$metaData{$pair[0]} = $pair[1];
+ @sortables = sortablesSet( \@sortables,\@sortFields,$pair[0],$pair[1] );
} elsif($pair[0] eq "metadata") {
- # Use metadata setting with priority ### TODO Need to do this for files
+ # Use metadata setting with priority
my ( $tagRef, $valRef ) = metadataLineToArrays($pair[1]);
my @tags = @{$tagRef};
my @vals = @{$valRef};
my $tix = 0;
@@ -312,41 +436,46 @@
$submitDate = $vals[$tix];
}
$tix++;
}
- my %remove;
- $remove{project} = 1;
- $remove{composite} = 1;
- $remove{fileName} = 1;
- $remove{dateSubmitted} = 1;
- $remove{dateUnrestricted} = 1;
+ if($metaData{type}) {
+ unshift @tags, "type"; # push values onto the front
+ unshift @vals, $metaData{type};
+ }
+ my %remove; # Don't display these metadata values
+ $remove{project} = $remove{composite} = $remove{fileName} = $remove{dateSubmitted} = $remove{dateUnrestricted} = 1;
( $tagRef, $valRef ) = metadataArraysRemoveHash( \@tags,\@vals,\%remove );
+ ( $tagRef, $valRef ) = metadataArraysMoveValuesToFront($tagRef, $valRef,\@sortFields);
@tags = @{$tagRef};
@vals = @{$valRef};
+
+ @sortables = sortablesSetFromMetadataArrays( \@sortables,\@sortFields,\@tags,\@vals );
my @metas = metadataArraysJoin( \@tags,\@vals );
+
$metaData{metadata} = join("; ", @metas);
}
}
- } else {
+ } else { ### Obsoleted by metadata setting
if($dataType eq "fastq" || $dataType eq "tagAlign" || $dataType eq "csfasta" || $dataType eq "csqual") {
$metaData{type} = $dataType;
}
- # pull metadata out of README.txt (if any is available).
- my $active = 0;
- for my $line (@readme) {
- chomp $line;
- if($line =~ /file: $fileName/) {
- $active = 1;
- } elsif($active) {
- if($line =~ /(.*):(.*)/) {
- my ($name, $var) = ($1, $2);
- $metaData{$name} = $var if($name !~ /restricted/i);
- } else {
- last;
- }
- }
- }
+ ### Obsoleted by metadata setting
+ ### # pull metadata out of README.txt (if any is available).
+ ### my $active = 0;
+ ### for my $line (@readme) {
+ ### chomp $line;
+ ### if($line =~ /file: $fileName/) {
+ ### $active = 1;
+ ### } elsif($active) {
+ ### if($line =~ /(.*):(.*)/) {
+ ### my ($name, $var) = ($1, $2);
+ ### $metaData{$name} = $var if($name !~ /restricted/i);
+ ### } else {
+ ### last;
+ ### }
+ ### }
+ ### }
}
if(length($submitDate) == 0) {
$submitDate = $file[3];
}
@@ -357,33 +486,34 @@
$rMon = $rMon + 1;
$releaseDate = sprintf("%04d-%02d-%02d", (1900 + $rYear),$rMon,$rMDay);
}
my @tmp;
- if(my $type = $metaData{type}) {
- push(@tmp, "type: $type");
- delete $metaData{type};
- }
if($metaData{metadata}) {
if($metaData{parent}) {
push(@tmp, $metaData{parent});
delete $metaData{parent};
}
push(@tmp, $metaData{metadata});
} else {
+ if(my $type = $metaData{type}) {
+ push(@tmp, "type=$type");
+ delete $metaData{type};
+ }
if(my $cell = $metaData{cell}) {
- push(@tmp, "cell: $cell");
+ push(@tmp, "cell=$cell");
delete $metaData{cell};
}
if($metaData{parent}) {
push(@tmp, $metaData{parent});
delete $metaData{parent};
}
- push(@tmp, "$_: " . $metaData{$_}) for (sort keys %metaData);
+ push(@tmp, "$_=" . $metaData{$_}) for (sort keys %metaData);
}
- my $metaData = join("; ", @tmp);
- # Now file contains: [file without path] [tableName] [size] [date] [releaseDate] [fullpath/file]
- htmlTableRow(*OUT_FILE,$fileName,$file[2],$submitDate,$releaseDate,$metaData);
+ my $details = join("; ", @tmp);
+ #htmlTableRow(*OUT_FILE,$fileName,$file[2],$submitDate,$releaseDate,$details);
+ push @rows, sortableHtmlRow(\@sortables,$fileName,$file[2],$submitDate,$releaseDate,$details);
}
+sortAndPrintHtmlTableRows(*OUT_FILE,@rows);
print OUT_FILE "</TABLE>\n";
htmlEndPage(*OUT_FILE);