[tools] testbot/cgi: Clean up CollectionBlock's property handling.

Francois Gouget fgouget at codeweavers.com
Thu Apr 14 09:58:04 CDT 2022


Delegate generating the inside of a cell to GenerateDataView() such that
GenerateDataCell() only deals with the cell itself.
Remove GetDisplayValue() and GetEscapedDisplayValue(): CollectionBlocks
don't deal with editing so there is no need for access to the 'raw'
data. Thus they are both replaced by GenerateDataView().

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 .../lib/ObjectModel/CGI/CollectionBlock.pm    | 251 +++++++++++-------
 testbot/web/JobDetails.pl                     |  36 +--
 testbot/web/PatchesList.pl                    |  14 +-
 testbot/web/WineTestBot.css                   |   4 +-
 testbot/web/admin/UsersList.pl                |  14 +-
 testbot/web/index.pl                          |  58 ++--
 6 files changed, 210 insertions(+), 167 deletions(-)

diff --git a/testbot/lib/ObjectModel/CGI/CollectionBlock.pm b/testbot/lib/ObjectModel/CGI/CollectionBlock.pm
index f124e646b..435c44e7f 100644
--- a/testbot/lib/ObjectModel/CGI/CollectionBlock.pm
+++ b/testbot/lib/ObjectModel/CGI/CollectionBlock.pm
@@ -183,116 +183,134 @@ sub GetSortedItems($$)
   return $self->{Collection}->GetSortedItems($Items);
 }
 
-sub GetDisplayValue($$$)
-{
-  my ($self, $Item, $PropertyDescriptor) = @_;
+=pod
+=over 12
 
-  my $PropertyName = $PropertyDescriptor->GetName();
-  my $Value = $Item->$PropertyName;
+=item C<GetDetailsLink()>
 
-  if ($PropertyDescriptor->GetClass() eq "Itemref")
-  {
-    if (defined($Value))
-    {
-      # Note: This only supports single-key Itemrefs
-      foreach $PropertyDescriptor (@{$Value->GetPropertyDescriptors()})
-      {
-        if ($PropertyDescriptor->GetIsKey())
-        {
-          $PropertyName = $PropertyDescriptor->GetName();
-          $Value = $Value->$PropertyName;
-          last;
-        }
-      }
-    }
-  }
+Returns the URL of the details page for the current row's object.
+
+See GenerateDataView() for details about the Row parameter.
 
-  if ($PropertyDescriptor->GetClass() eq "Basic")
+=back
+=cut
+
+sub GetDetailsLink($$)
+{
+  my ($self, $Row) = @_;
+
+  if (!$Row->{DetailsLink})
   {
-    if ($PropertyDescriptor->GetType() eq "B")
-    {
-      $Value = ($Value ? "Yes" : "No");
-    }
-    elsif ($PropertyDescriptor->GetType() eq "DT")
+    $Row->{DetailsLink} = "$Row->{DetailsPage}?Key=". uri_escape($Row->{Item}->GetKey());
+    my ($MasterColNames, $MasterColValues) = $Row->{Item}->GetMasterCols();
+    if (defined $MasterColNames)
     {
-      if (defined($Value))
+      foreach my $ColIndex (0 .. @$MasterColNames - 1)
       {
-        $Value =
-         "<noscript><div>" .
-         strftime("%Y-%m-%d %H:%M:%S", localtime($Value)) . "</div></noscript>\n" .
-"<script type='text/javascript'><!--\n" .
-         "ShowDateTime($Value);\n" .
-         "//--></script>\n";
+        $Row->{DetailsLink} .= "&". $MasterColNames->[$ColIndex] ."=".
+                               uri_escape($MasterColValues->[$ColIndex]);
       }
     }
   }
-
-  return $Value;
+  return $Row->{DetailsLink};
 }
 
-sub GetEscapedDisplayValue($$$)
-{
-  my ($self, $Item, $PropertyDescriptor) = @_;
+=pod
+=over 12
 
-  my $PropertyName = $PropertyDescriptor->GetName();
-  my $Value = $Item->$PropertyName;
+=item C<GenerateHeaderView()>
 
-  if ($PropertyDescriptor->GetClass() eq "Basic" &&
-      $PropertyDescriptor->GetType() eq "DT")
-  {
-    if (defined($Value))
-    {
-      $Value = "<script type='text/javascript'><!--\n" .
-               "ShowDateTime($Value);\n" .
-               "//--></script><noscript><div>" .
-               strftime("%Y-%m-%d %H:%M:%S", localtime($Value)) .
-               "</div></noscript>\n";
-    }
-  }
-  else
-  {
-    $Value = $self->escapeHTML($self->GetDisplayValue($Item, $PropertyDescriptor));
-  }
+Generates an HTML snippet for the column title.
 
-  return $Value;
-}
+The Row parameter contains the following information:
+=over 12
 
+=item PropertyDescriptors
+The list of item properties, including those that DisplayProperty() says
+should be hidden.
 
-#
-# Item cell generation
-#
+=item DetailsPage
+The base link to the item details page if any. See GetDetailsPage().
+
+=item ItemActions
+The list of per-item actions.
+
+=cut
+
+=back
+=cut
 
-sub GenerateHeaderCell($$)
+sub GenerateHeaderView($$$)
 {
-  my ($self, $PropertyDescriptor) = @_;
-  print "<th>", $self->escapeHTML($PropertyDescriptor->GetDisplayName()),
-        "</th>\n";
+  my ($self, $_Row, $PropertyDescriptor) = @_;
+
+  print $self->escapeHTML($PropertyDescriptor->GetDisplayName());
 }
 
-sub GenerateDataCell($$$$)
+=pod
+=over 12
+
+=item C<GenerateDataView()>
+
+Generates an HTML snippet representing the property value in a user-readable
+form.
+
+The Row parameter contains the same information as for GenerateHeaderView()
+plus:
+=over 12
+
+=item Row
+The row number starting at 1.
+
+=item Item
+The object for the current row.
+
+=back
+
+Furthermore one can get the link to the current object's details page by
+passing the row to GetDetailsLink().
+
+=back
+=cut
+
+sub GenerateDataView($$$)
 {
-  my ($self, $Item, $PropertyDescriptor, $DetailsPage) = @_;
+  my ($self, $Row, $PropertyDescriptor) = @_;
 
-  print "<td>";
-  my $NeedLink;
-  if ($PropertyDescriptor->GetIsKey() && $DetailsPage)
+  my $PropertyName = $PropertyDescriptor->GetName();
+  my $Value = $Row->{Item}->$PropertyName;
+
+  if ($PropertyDescriptor->GetClass() eq "Itemref" and defined $Value)
   {
-    $NeedLink = 1;
-    my $Query = "$DetailsPage?Key=" . uri_escape($Item->GetKey());
-    my ($MasterColNames, $MasterColValues) = $Item->GetMasterCols();
-    if (defined($MasterColNames))
+    # Note: This only supports single-key Itemrefs
+    foreach my $ValuePD (@{$Value->GetPropertyDescriptors()})
     {
-      foreach my $ColIndex (0 .. @$MasterColNames - 1)
+      if ($ValuePD->GetIsKey())
       {
-        $Query .= "&" . $MasterColNames->[$ColIndex] . "=" .
-                  uri_escape($MasterColValues->[$ColIndex]);
+        $PropertyName = $ValuePD->GetName();
+        print $self->escapeHTML($Value->$PropertyName);
+        return;
       }
     }
-    print "<a href='", $self->escapeHTML($Query), "'>";
   }
-  print $self->GetEscapedDisplayValue($Item, $PropertyDescriptor);
-  print "</a>" if ($NeedLink);
-  print "</td>\n";
+  elsif ($PropertyDescriptor->GetClass() eq "Basic")
+  {
+    if ($PropertyDescriptor->GetType() eq "B")
+    {
+      print $Value ? "Yes" : "No";
+      return;
+    }
+    if ($PropertyDescriptor->GetType() eq "DT" and defined $Value)
+    {
+      print "<script type='text/javascript'><!--\n",
+            "ShowDateTime($Value);\n",
+            "//--></script><noscript><div>",
+            strftime("%Y-%m-%d %H:%M:%S", localtime($Value)),
+            "</div></noscript>\n";
+      return;
+    }
+  }
+  print defined $Value ? $self->escapeHTML($Value) : " ";
 }
 
 
@@ -317,23 +335,31 @@ sub GenerateFormStart($)
   }
 }
 
+sub GenerateHeaderCell($$$)
+{
+  my ($self, $Row, $PropertyDescriptor) = @_;
+
+  print "<th>";
+  $self->GenerateHeaderView($Row, $PropertyDescriptor);
+  print "</th>\n";
+}
+
 sub GenerateHeaderRow($$$)
 {
-  my ($self, $PropertyDescriptors, $ItemActions) = @_;
+  my ($self, $Row) = @_;
 
   print "<tr>\n";
-  if (@$ItemActions != 0)
+  if (@{$Row->{ItemActions}})
   {
     print "<th> </th>\n";
   }
-  foreach my $PropertyDescriptor (@$PropertyDescriptors)
+  foreach my $PropertyDescriptor (@{$Row->{PropertyDescriptors}})
   {
     if ($self->DisplayProperty($PropertyDescriptor))
     {
-      $self->GenerateHeaderCell($PropertyDescriptor);
+      $self->GenerateHeaderCell($Row, $PropertyDescriptor);
     }
   }
-
   print "</tr>\n";
 }
 
@@ -345,21 +371,37 @@ sub SelName($$)
   return "sel_" . $Key;
 }
 
-sub GenerateDataRow($$$$$$)
+sub GenerateDataCell($$$)
+{
+  my ($self, $Row, $PropertyDescriptor) = @_;
+
+  print "<td>";
+  my $CloseLink;
+  if ($Row->{DetailsPage} and $PropertyDescriptor->GetIsKey())
+  {
+    print "<a href='", $self->escapeHTML($self->GetDetailsLink($Row)), "'>";
+    $CloseLink = "</a>";
+  }
+  $self->GenerateDataView($Row, $PropertyDescriptor);
+  print "$CloseLink</td>\n";
+}
+
+sub GenerateDataRow($$)
 {
-  my ($self, $Item, $PropertyDescriptors, $DetailsPage, $Class, $ItemActions) = @_;
+  my ($self, $Row) = @_;
 
+  my $Class = ($Row->{Row} % 2) == 0 ? "even" : "odd";
   print "<tr class='$Class'>\n";
-  if (@$ItemActions != 0)
+  if (@{$Row->{ItemActions}})
   {
-    print "<td><input name='", $self->SelName($Item->GetKey()),
+    print "<td><input name='", $self->SelName($Row->{Item}->GetKey()),
           "' type='checkbox' /></td>\n";
   }
-  foreach my $PropertyDescriptor (@$PropertyDescriptors)
+  foreach my $PropertyDescriptor (@{$Row->{PropertyDescriptors}})
   {
     if ($self->DisplayProperty($PropertyDescriptor))
     {
-      $self->GenerateDataCell($Item, $PropertyDescriptor, $DetailsPage);
+      $self->GenerateDataCell($Row, $PropertyDescriptor);
     }
   }
   print "</tr>\n";
@@ -421,20 +463,23 @@ EOF
   print "<table border='0' cellpadding='5' cellspacing='0' summary='" .
         "Overview of " . $Collection->GetCollectionName() . "'>\n";
   print "<thead>\n";
-  my $ItemActions = $self->{RW} ? $self->GetItemActions() : [];
-  $self->GenerateHeaderRow($PropertyDescriptors, $ItemActions);
+  my $Row = {
+    PropertyDescriptors => $PropertyDescriptors,
+    DetailsPage => $self->GetDetailsPage(),
+    ItemActions => $self->{RW} ? $self->GetItemActions() : [],
+    Row => 0, # 0 for the header ---> 1 for the first line
+  };
+  $self->GenerateHeaderRow($Row);
   print "</thead>\n";
 
   print "<tbody>\n";
-  my $DetailsPage = $self->GetDetailsPage();
-  my $Row = 0;
   my $Items = $self->{Collection}->GetSortedItems();
   foreach my $Item (@$Items)
   {
-    my $Class = ($Row % 2) == 0 ? "even" : "odd";
-    $self->GenerateDataRow($Item, $PropertyDescriptors, $DetailsPage,
-                           $Class, $ItemActions);
-    $Row++;
+    $Row->{Row}++;
+    $Row->{Item} = $Item;
+    $Row->{DetailsLink} = undef;
+    $self->GenerateDataRow($Row);
   }
   if (@$Items == 0)
   {
@@ -444,7 +489,7 @@ EOF
   print "</tbody>\n";
   print "</table>\n";
 
-  if (@$ItemActions != 0 && @$Items != 0)
+  if (@{$Row->{ItemActions}} and @$Items)
   {
     print <<EOF;
 <div class='CollectionBlockActions'>
@@ -465,7 +510,7 @@ document.write("<a href='javascript:void(0)' onClick='ToggleAll();'>Toggle All<\
 </script>
 EOF
     print "For selected ", $self->{Collection}->GetCollectionName() . ":";
-    foreach my $Action (@$ItemActions)
+    foreach my $Action (@{$Row->{ItemActions}})
     {
       print " <input type='submit' name='Action' value='" .
             $self->escapeHTML($Action) . "' />";
diff --git a/testbot/web/JobDetails.pl b/testbot/web/JobDetails.pl
index da4ad7e96..2c7901a75 100644
--- a/testbot/web/JobDetails.pl
+++ b/testbot/web/JobDetails.pl
@@ -61,35 +61,36 @@ sub DisplayProperty($$)
 # Item cell generation
 #
 
-sub GenerateHeaderCell($$)
+sub GenerateHeaderView($$$)
 {
-  my ($self, $PropertyDescriptor) = @_;
+  my ($self, $Row, $PropertyDescriptor) = @_;
 
   my $PropertyName = $PropertyDescriptor->GetName();
   if ($PropertyName eq "CmdLineArg")
   {
-    print "<th>Arguments / <span class='MissionHeader'>Missions</span></th>\n";
+    print "Arguments / <span class='MissionHeader'>Missions</span>";
   }
   elsif ($PropertyName eq "Ended")
   {
-    print "<th><a class='title' title='Execution ended'>Time</a></th>\n";
+    print "<a class='title' title='Execution ended'>Time</a>";
   }
   else
   {
-    return $self->SUPER::GenerateHeaderCell($PropertyDescriptor);
+    $self->SUPER::GenerateHeaderView($Row, $PropertyDescriptor);
   }
 }
 
-sub GenerateDataCell($$$$)
+sub GenerateDataView($$$)
 {
-  my ($self, $StepTask, $PropertyDescriptor, $DetailsPage) = @_;
+  my ($self, $Row, $PropertyDescriptor) = @_;
 
+  my $StepTask = $Row->{Item};
   my $PropertyName = $PropertyDescriptor->GetName();
   if ($PropertyName eq "VM")
   {
-    print "<td><a href='#k", $self->escapeHTML($StepTask->GetKey()), "'>";
+    print "<a href='#k", $self->escapeHTML($Row->{Item}->GetKey()), "'>";
     print $self->escapeHTML($StepTask->VM->Name);
-    print "</a></td>\n";
+    print "</a>";
   }
   elsif ($PropertyName eq "FileName")
   {
@@ -99,13 +100,13 @@ sub GenerateDataCell($$$$)
       my $JobId = $self->{EnclosingPage}->GetJob()->Id;
       my $URI = "/GetFile.pl?JobKey=" . uri_escape($JobId) .
                   "&StepKey=" . uri_escape($StepTask->StepNo);
-      print "<td><a href='" . $self->escapeHTML($URI) . "'>";
+      print "<a href='" . $self->escapeHTML($URI) . "'>";
       print $self->escapeHTML($StepTask->FileName);
-      print "</a></td>\n";
+      print "</a>";
     }
     else
     {
-      $self->SUPER::GenerateDataCell($StepTask, $PropertyDescriptor, $DetailsPage);
+      $self->SUPER::GenerateDataView($Row, $PropertyDescriptor);
     }
   }
   elsif ($PropertyName eq "CmdLineArg")
@@ -124,7 +125,7 @@ sub GenerateDataCell($$$$)
         $Args .= "<span class='Mission'>". $self->escapeHTML(GetTaskMissionDescription($Missions->[0], $StepTask->Type)) ."</span>";
       }
     }
-    print "<td>$Args</td>\n";
+    print $Args;
   }
   elsif ($PropertyName eq "Ended")
   {
@@ -132,22 +133,21 @@ sub GenerateDataCell($$$$)
     {
       my $Duration = $StepTask->Ended - $StepTask->Started;
       my $TagId = "E". $StepTask->Id;
-      print "<td><a id='$TagId' class='title' title='",
+      print "<a id='$TagId' class='title' title='",
             strftime("%Y-%m-%d %H:%M:%S", localtime($StepTask->Ended)),
             "'>", DurationToString($Duration), "</a>\n";
       print "<script type='text/javascript'><!--\n";
       print "  ShowDateTime(", $StepTask->Ended, ",'$TagId');\n";
-      print "--></script>\n";
-      print "</td>\n";
+      print "--></script>";
     }
     else
     {
-      print "<td> </td>\n";
+      print " ";
     }
   }
   else
   {
-    $self->SUPER::GenerateDataCell($StepTask, $PropertyDescriptor, $DetailsPage);
+    $self->SUPER::GenerateDataView($Row, $PropertyDescriptor);
   }
 }
 
diff --git a/testbot/web/PatchesList.pl b/testbot/web/PatchesList.pl
index 854c2768a..943b9c5bb 100644
--- a/testbot/web/PatchesList.pl
+++ b/testbot/web/PatchesList.pl
@@ -46,21 +46,21 @@ sub DisplayProperty($$)
          $PropertyName eq "FromName" || $PropertyName eq "Subject";
 }
 
-sub GenerateDataCell($$$$$)
+sub GenerateDataView($$$)
 {
-  my ($self, $Item, $PropertyDescriptor, $DetailsPage) = @_;
+  my ($self, $Row, $PropertyDescriptor) = @_;
 
-  my $PropertyName = $PropertyDescriptor->GetName();
-  if ($PropertyName eq "Disposition" and $Item->Disposition =~ /job ([0-9]+)$/)
+  if ($PropertyDescriptor->GetName() eq "Disposition" and
+      $Row->{Item}->Disposition =~ /job ([0-9]+)$/)
   {
     my $JobId = $1;
     my $URI = "/JobDetails.pl?Key=" . uri_escape($JobId);
-    print "<td><a href='" . $self->escapeHTML($URI) . "'>" .
-          "Job " . $self->escapeHTML($JobId) . "</a></td>\n";
+    print "<a href='" . $self->escapeHTML($URI) . "'>" .
+          "Job " . $self->escapeHTML($JobId) . "</a>";
   }
   else
   {
-    $self->SUPER::GenerateDataCell($Item, $PropertyDescriptor, $DetailsPage);
+    $self->SUPER::GenerateDataView($Row, $PropertyDescriptor);
   }
 }
 
diff --git a/testbot/web/WineTestBot.css b/testbot/web/WineTestBot.css
index 53c939efd..a50125f8e 100644
--- a/testbot/web/WineTestBot.css
+++ b/testbot/web/WineTestBot.css
@@ -241,13 +241,13 @@ h2
   border: 1px solid white;
 }
 
-.CollectionBlock tr.even
+.CollectionBlock tr.odd
 {
   background-color: #fff8f8;
   color: black;
 }
 
-.CollectionBlock tr.odd
+.CollectionBlock tr.even
 {
   background-color: #f8e8e8;
   color: black;
diff --git a/testbot/web/admin/UsersList.pl b/testbot/web/admin/UsersList.pl
index f54def261..bc5ced8a7 100644
--- a/testbot/web/admin/UsersList.pl
+++ b/testbot/web/admin/UsersList.pl
@@ -46,13 +46,13 @@ sub DisplayProperty($$)
          $PropertyName eq "Status" || $PropertyName eq "RealName";
 }
 
-sub GenerateDataCell($$$$)
+sub GenerateDataCell($$$)
 {
-  my ($self, $User, $PropertyDescriptor, $DetailsPage) = @_;
+  my ($self, $Row, $PropertyDescriptor) = @_;
 
-  my $PropertyName = $PropertyDescriptor->GetName();
-  if ($PropertyName eq "Status")
+  if ($PropertyDescriptor->GetName() eq "Status")
   {
+    my $User = $Row->{Item};
     my $Status = $User->Status;
     my ($Class, $Label);
     if ($Status eq "disabled")
@@ -83,12 +83,12 @@ sub GenerateDataCell($$$$)
     {
       ($Class, $Label) = ('usernone', 'none');
     }
-    print "<td><a href='/admin/UserDetails.pl?Key=", uri_escape($User->GetKey()),
-          "'><span class='$Class'>$Label</span></a></td>";
+    my $DetailsLink = $self->GetDetailsLink($Row);
+    print "<td><a href='$DetailsLink'><span class='$Class'>$Label</span></a></td>";
   }
   else
   {
-    $self->SUPER::GenerateDataCell($User, $PropertyDescriptor, $DetailsPage);
+    $self->SUPER::GenerateDataCell($Row, $PropertyDescriptor);
   }
 }
 
diff --git a/testbot/web/index.pl b/testbot/web/index.pl
index 478cb61c1..a18920533 100644
--- a/testbot/web/index.pl
+++ b/testbot/web/index.pl
@@ -50,49 +50,48 @@ sub DisplayProperty($$)
   return $self->SUPER::DisplayProperty($PropertyDescriptor);
 }
 
-sub GenerateHeaderCell($$$)
+sub GenerateHeaderView($$$)
 {
-  my ($self, $PropertyDescriptor) = @_;
+  my ($self, $Row, $PropertyDescriptor) = @_;
 
   my $PropertyName = $PropertyDescriptor->GetName();
   if ($PropertyName eq "Priority")
   {
-    print "<th><a class='title' title='Higher values indicate a lower priority'>Nice</a></th>\n";
+    print "<a class='title' title='Higher values indicate a lower priority'>Nice</a>";
   }
   elsif ($PropertyName eq "Ended")
   {
-    print "<th><a class='title' title='Ended'>Time</a></th>\n";
+    print "<a class='title' title='Ended'>Time</a>";
   }
   else
   {
-    return $self->SUPER::GenerateHeaderCell($PropertyDescriptor);
+    $self->SUPER::GenerateHeaderView($Row, $PropertyDescriptor);
   }
 }
 
-sub GetDisplayValue($$$)
+sub GenerateDataView($$$)
 {
-  my ($self, $Job, $PropertyDescriptor) = @_;
+  my ($self, $Row, $PropertyDescriptor) = @_;
 
-  if ($PropertyDescriptor->GetName() eq "User" &&
-      defined($Job->Patch) &&
-      $Job->User->GetKey() eq GetBatchUser()->GetKey() &&
-      defined($Job->Patch->FromName))
+  my $Job = $Row->{Item};
+  my $PropertyName = $PropertyDescriptor->GetName();
+  if ($PropertyName eq "User")
   {
-    return $Job->Patch->FromName;
+    if (defined $Job->Patch and defined $Job->Patch->FromName and
+        $Job->User->GetKey() eq GetBatchUser()->GetKey())
+    {
+      print $self->escapeHTML($Job->Patch->FromName);
+    }
+    else
+    {
+      print $self->escapeHTML($Job->User->Name);
+    }
   }
-
-  return $self->SUPER::GetDisplayValue($Job, $PropertyDescriptor);
-}
-
-sub GenerateDataCell($$$$)
-{
-  my ($self, $Job, $PropertyDescriptor, $DetailsPage) = @_;
-
-  my $PropertyName = $PropertyDescriptor->GetName();
-  if ($PropertyName eq "Status")
+  elsif ($PropertyName eq "Status")
   {
-    my $EscapedKey = uri_escape($Job->GetKey());
-    print "<td id='job$EscapedKey'><a href='/JobDetails.pl?Key=$EscapedKey'>";
+    my $EscapedKey = uri_escape($Row->{Item}->GetKey());
+    my $DetailsLink = $self->GetDetailsLink($Row);
+    print "<a id='job$EscapedKey' href='$DetailsLink'>";
 
     my %HTMLChunks = ("queued" => "<span class='queued'>queued</span>",
                       "running" => "<span class='running'>running</span>",
@@ -146,7 +145,7 @@ sub GenerateDataCell($$$$)
     {
       print $HTMLStatus;
     }
-    print "</a></td>\n";
+    print "</a>";
   }
   elsif ($PropertyName eq "Ended")
   {
@@ -154,22 +153,21 @@ sub GenerateDataCell($$$$)
     {
       my $Duration = $Job->Ended - $Job->Submitted;
       my $TagId = "E". $Job->Id;
-      print "<td><a id='$TagId' class='title' title='",
+      print "<a id='$TagId' class='title' title='",
             strftime("%Y-%m-%d %H:%M:%S", localtime($Job->Ended)),
             "'>", DurationToString($Duration), "</a>\n";
       print "<script type='text/javascript'><!--\n";
       print "  ShowDateTime(", $Job->Ended, ",'$TagId');\n";
-      print "--></script>\n";
-      print "</td>\n";
+      print "--></script>";
     }
     else
     {
-      print "<td> </td>\n";
+      print " ";
     }
   }
   else
   {
-    $self->SUPER::GenerateDataCell($Job, $PropertyDescriptor, $DetailsPage);
+    $self->SUPER::GenerateDataView($Row, $PropertyDescriptor);
   }
 }
 
-- 
2.30.2




More information about the wine-devel mailing list