:
+
+Useful for renderers: If this resource is currently the first resource
+of a new branch, this will be true. The Resource column (leftmost in the
+navmaps screen) uses this to display the "new branch" icon
+
+=back
+
+=cut
+
+sub resource { return 0; }
+sub communication_status { return 1; }
+sub quick_status { return 2; }
+sub long_status { return 3; }
+sub part_status_summary { return 4; }
+
+sub render_resource {
+ my ($resource, $part, $params) = @_;
+
+ my $nonLinkedText = ''; # stuff after resource title not in link
+
+ my $link = $params->{"resourceLink"};
+
+ # The URL part is not escaped at this point, but the symb is...
+ # The stuff to the left of the ? must have ' replaced by \' since
+ # it will be quoted with ' in the href.
+
+ my ($left,$right) = split(/\?/, $link);
+ $link = $left.'?'.$right;
+
+ my $src = $resource->src();
+ my $it = $params->{"iterator"};
+ my $filter = $it->{FILTER};
+
+ my $title = $resource->compTitle();
+
+ my $partLabel = "";
+ my $newBranchText = "";
+ my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
+ # If this is a new branch, label it so
+ if ($params->{'isNewBranch'}) {
+ $newBranchText = "
";
}
- &Apache::loncommon::no_cache($r);
- $r->send_http_header;
- my $firstres=$hash{'map_start_'.
- &Apache::lonnet::clutter($ENV{'request.course.uri'})};
- my $lastres=$hash{'map_finish_'.
- &Apache::lonnet::clutter($ENV{'request.course.uri'})};
- if (!(($firstres) && ($lastres))) {
- $r->print('Coursemap undefined.');
+ # links to open and close the folder
+
+
+ my $linkopen = "";
+
+
+ my $linkclose = "";
+
+ # Default icon: unknown page
+ my $icon = "
";
+
+ if ($resource->is_problem()) {
+ if ($part eq '0' || $params->{'condensed'}) {
+ $icon ='
';
+ } else {
+ $icon = $params->{'indentString'};
+ }
} else {
+ $icon = "
";
+ }
-# ----------------------------------------------------------------- Render page
-# -------------------------------------------------------------- Set parameters
+ # Display the correct map icon to open or shut map
+ if ($resource->is_map()) {
+ my $mapId = $resource->map_pc();
+ my $nowOpen = !defined($filter->{$mapId});
+ if ($it->{CONDITION}) {
+ $nowOpen = !$nowOpen;
+ }
+ my $folderType = $resource->is_sequence() ? 'folder' : 'page';
+ my $title=$resource->title;
+ $title=~s/\"/\"/g;
+ if (!$params->{'resource_no_folder_link'}) {
+ $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';
+ $icon = "
";
+
+ $linkopen = "{'url'} . '?' .
+ $params->{'queryString'} . '&filter=';
+ $linkopen .= ($nowOpen xor $it->{CONDITION}) ?
+ addToFilter($filter, $mapId) :
+ removeFromFilter($filter, $mapId);
+ $linkopen .= "&condition=" . $it->{CONDITION} . '&hereType='
+ . $params->{'hereType'} . '&here=' .
+ &Apache::lonnet::escape($params->{'here'}) .
+ '&jump=' .
+ &Apache::lonnet::escape($resource->symb()) .
+ "&folderManip=1\">";
-# ---------------------------- initialize coursedata and userdata for this user
- undef %courseopt;
- undef %useropt;
-
- my $uname=$ENV{'user.name'};
- my $udom=$ENV{'user.domain'};
- my $uhome=$ENV{'user.home'};
- my $cid=$ENV{'request.course.id'};
- my $chome=$ENV{'course.'.$cid.'.home'};
- my ($cdom,$cnum)=split(/\_/,$cid);
+ } else {
+ # Don't allow users to manipulate folder
+ $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') .
+ '.nomanip.gif';
+ $icon = "
";
- my $userprefix=$uname.'_'.$udom.'_';
-
- unless ($uhome eq 'no_host') {
-# ------------------------------------------------- Get coursedata (if present)
- unless ((time-$courserdatas{$cid.'.last_cache'})<240) {
- my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.
- ':resourcedata',$chome);
- if ($reply!~/^error\:/) {
- $courserdatas{$cid}=$reply;
- $courserdatas{$cid.'.last_cache'}=time;
- }
- # check to see if network failed
- elsif ( $reply=~/no.such.host/i || $reply=~/con.*lost/i )
- {
- $networkFailedFlag = 1;
- }
- }
- foreach (split(/\&/,$courserdatas{$cid})) {
- my ($name,$value)=split(/\=/,$_);
- $courseopt{$userprefix.&Apache::lonnet::unescape($name)}=
- &Apache::lonnet::unescape($value);
- }
-# --------------------------------------------------- Get userdata (if present)
- unless ((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) {
- my $reply=&Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);
- if ($reply!~/^error\:/) {
- $userrdatas{$uname.'___'.$udom}=$reply;
- $userrdatas{$uname.'___'.$udom.'.last_cache'}=time;
- }
- }
- foreach (split(/\&/,$userrdatas{$uname.'___'.$udom})) {
- my ($name,$value)=split(/\=/,$_);
- $useropt{$userprefix.&Apache::lonnet::unescape($name)}=
- &Apache::lonnet::unescape($value);
- }
+ $linkopen = "";
+ $linkclose = "";
}
+ }
- @rows=();
+ if ($resource->randomout()) {
+ $nonLinkedText .= ' ('.&mt('hidden').') ';
+ }
+ if (!$resource->condval()) {
+ $nonLinkedText .= ' ('.&mt('conditionally hidden').') ';
+ }
+
+ # We're done preparing and finally ready to start the rendering
+ my $result = "";
- &tracetable(0,$firstres,'&','',0);
+ my $indentLevel = $params->{'indentLevel'};
+ if ($newBranchText) { $indentLevel--; }
-# ------------------------------------------------------------------ Page parms
+ # print indentation
+ for (my $i = 0; $i < $indentLevel; $i++) {
+ $result .= $params->{'indentString'};
+ }
- my $j;
- my $i;
- my $lcm=1;
- my $contents=0;
+ # Decide what to display
-# ---------------------------------------------- Go through table to get layout
+ $result .= "$newBranchText$linkopen$icon$linkclose";
+
+ my $curMarkerBegin = '';
+ my $curMarkerEnd = '';
- for ($i=0;$i<=$#rows;$i++) {
- if ($rows[$i]) {
- &Apache::lonxml::debug("Row $i is:".$rows[$i]);
- $contents++;
- my @colcont=split(/\&/,$rows[$i]);
- $lcm*=($#colcont+1)/euclid($lcm,($#colcont+1));
- }
- }
+ # Is this the current resource?
+ if (!$params->{'displayedHereMarker'} &&
+ $resource->symb() eq $params->{'here'} ) {
+ $curMarkerBegin = '>';
+ $curMarkerEnd = '<';
+ $params->{'displayedHereMarker'} = 1;
+ }
+ if ($resource->is_problem() && $part ne '0' &&
+ !$params->{'condensed'}) {
+ my $displaypart=$resource->part_display($part);
+ $partLabel = " (".&mt('Part: [_1]', $displaypart).")";
+ if ($link!~/\#/) { $link.='#'.&Apache::lonnet::escape($part); }
+ $title = "";
+ }
- unless ($contents) {
- $r->print('Empty Map.');
- } else {
+ if ($params->{'condensed'} && $resource->countParts() > 1) {
+ $nonLinkedText .= ' ('.&mt('[_1] parts', $resource->countParts()).')';
+ }
-# ------------------------------------------------------------------ Build page
+ my $target;
+ if ($env{'environment.remotenavmap'} eq 'on') {
+ $target=' target="loncapaclient" ';
+ }
+ if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) {
+ $result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText | ";
+ } else {
+ $result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText";
+ }
- my $currenturl=$ENV{'form.postdata'};
- $currenturl=~s/^http\:\/\///;
- $currenturl=~s/^[^\/]+//;
-
-# ---------------------------------------------------------------- Send headers
-
- my $date=localtime;
- my $now=time;
-# ----------------------------------------- Get email status and discussiontime
-
- my %emailstatus=&Apache::lonnet::dump('email_status');
- my $logouttime=$emailstatus{'logout'};
- my $courseleave=$emailstatus{'logout_'.$ENV{'request.course.id'}};
- my $lastcheck=($courseleave>$logouttime?$courseleave:$logouttime);
-
- my %discussiontimes=&Apache::lonnet::dump('discussiontimes',
- $cdom,$cnum);
-
- my %feedback=();
- my %error=();
- foreach my $msgid (split(/\&/,&Apache::lonnet::reply('keys:'.
- $ENV{'user.domain'}.':'.
- $ENV{'user.name'}.':nohist_email',
- $ENV{'user.home'}))) {
- $msgid=&Apache::lonnet::unescape($msgid);
- my $plain=&Apache::lonnet::unescape(&Apache::lonnet::unescape($msgid));
- if ($plain=~/(Error|Feedback) \[([^\]]+)\]/) {
- my ($what,$url)=($1,$2);
- my %status=
- &Apache::lonnet::get('email_status',[$msgid]);
- if ($status{$msgid}=~/^error\:/) {
- $status{$msgid}='';
- }
-
- if (($status{$msgid} eq 'new') ||
- (!$status{$msgid})) {
- if ($what eq 'Error') {
- $error{$url}.=','.$msgid;
- } else {
- $feedback{$url}.=','.$msgid;
- }
- }
- }
- }
-# ----------------------------------------------------------- Start Page Output
- my $bodytagadd='';
- $r->print(
- 'Navigate Course Map');
- if (($currenturl=~/^\/res/) &&
- ($currenturl!~/^\/res\/adm/)) {
- $bodytagadd='onLoad="window.location.hash='."'curloc'".'"';
- }
- $r->print(&Apache::loncommon::bodytag('Navigate Course Map','',
- $bodytagadd));
- $r->print('');
- my $desc=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};
- if (defined($desc)) { $r->print("$desc
\n"); }
- $r->print("$date
\n");
- $r->rflush();
- $r->print('
New discussion since '.
- localtime($lastcheck).
- '
New message (click to open)');
- if (($currenturl=~/^\/res/) &&
- ($currenturl!~/^\/res\/adm/)) {
- $r->print('Current Location
');
- }
+ return $result;
+}
- # Handle a network error
+sub render_communication_status {
+ my ($resource, $part, $params) = @_;
+ my $discussionHTML = ""; my $feedbackHTML = ""; my $errorHTML = "";
- if ($networkFailedFlag)
- {
- $r->print('
LON-CAPA network failure.
'."\n");
- $r->print("LON-CAPA's network is having difficulties, some problem" .
- " information, such as due dates, will not be available.");
- }
-# ----------------------------------------------------- The little content list
- for ($i=0;$i<=$#rows;$i++) {
- if ($rows[$i]) {
- my @colcont=split(/\&/,$rows[$i]);
- my $avespan=$lcm/($#colcont+1);
- for ($j=0;$j<=$#colcont;$j++) {
- my $rid=$colcont[$j];
- if ($rid=~/^h(.+)/) {
- $rid=$1;
- $r->print(' '.$hash{'title_'.$rid}.
- '
');
- }
- }
- }
+ my $link = $params->{"resourceLink"};
+ my $target;
+ if ($env{'environment.remotenavmap'} eq 'on') {
+ $target=' target="loncapaclient" ';
+ }
+ my $linkopen = "";
+ my $linkclose = "";
+ my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc");
+ if ($resource->hasDiscussion()) {
+ $discussionHTML = $linkopen .
+ '
' .
+ $linkclose;
+ }
+
+ if ($resource->getFeedback()) {
+ my $feedback = $resource->getFeedback();
+ foreach (split(/\,/, $feedback)) {
+ if ($_) {
+ $feedbackHTML .= ' '
+ . '
';
}
-# ----------------------------------------------------------------- Start table
- $r->print('
');
- for ($i=0;$i<=$#rows;$i++) {
- if ($rows[$i]) {
- $r->print("\n");
- my @colcont=split(/\&/,$rows[$i]);
- my $avespan=$lcm/($#colcont+1);
-
- # for each item I wish to print on this row...
- for ($j=0;$j<=$#colcont;$j++) {
- my $indent;my $indentstr;
- my $linkid;
- my $rid=$colcont[$j];
- $rid=~/(\d+)\.(\d+)$/;
- my $src=
- &Apache::lonnet::declutter($hash{'src_'.$1.'.'.$2});
- my $symb=
- &Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.$src;
- my $add='';
- my $adde=' | ';
- my $hwk='';
- my $hwke='';
- if ($rid=~/^l(\d+\.\d+),(.+)/) { $linkid=$1; $rid=$2; }
- if ($rid=~/^i(\d+),(.+)/) { $indent=$1; $rid=$2; }
- if ($rid=~/^h(.+)/) {
- $rid=$1;
- $add='';
- $adde=' | ';
- if (($ENV{'user.adv'}) &&
- ($parmhash{$symb.'.0.parameter_randompick'})) {
- $adde=' (randomly select '.
- $parmhash{$symb.'.0.parameter_randompick'}.
- ')';
- }
- }
- if ($rid=~/^j(.+)/) { $rid=$1; }
- if ($rid=~/^p(\d)(\d)\"([\w\: \(\)\/\,]*)\"(.+)/) {
- # sub astatus describes what code/tcode mean
- my $code=$1;
- my $tcode=$2;
- my $ctext=$3;
- $rid=$4;
-
- # will open later
- if ($tcode eq '1') {
- $add='';
- }
-
- # solved/correct
- if ($code eq '3') {
- $add=' | ';
- } elsif ($code eq '4') { # partially correct
- $add=' | ';
- } else {
- # not attempted
-
- # we end up here on network failure, so pick a neutral
- # color if the network failed instead of bright red.
- if ( $networkFailedFlag )
- {
- $add = ' | ';
- }
- else
- {
- $add=' | ';
- }
-
- if ($tcode eq '2') { # open, not past due
- $add=' | ';
- }
-
- if ($tcode eq '4') { # due in next 24 hours
- $add=' | ';
- $adde=' | ';
- }
- }
- $hwk='';
- $hwke='';
- if ($code eq '1') {
- $hwke=' ('.$ctext.')';
- }
- if ($code eq '2' || $code eq '4') {
- $hwk='';
- $hwke=' ('.$ctext.')';
- }
- if ($code eq '3') {
- $hwk='';
- $hwke=' ('.$ctext.')';
- }
- if ($networkFailedFlag)
- {
- $hwke=' (status unavailable)';
- }
- }
- if ($rid && $hash{'src_'.$rid} eq $currenturl) {
- $add=$add.''.
- '> ';
- $adde=
- ' <'.$adde;
- }
- if ($discussiontimes{$symb}>$lastcheck) {
- $adde=
- '
'.
- $adde;
- }
- if ($error{$src}) {
- foreach (split(/\,/,$error{$src})) {
- if ($_) {
- $adde=
- '
'
- .$adde;
- }
- }
- }
- if ($feedback{$src}) {
- foreach (split(/\,/,$feedback{$src})) {
- if ($_) {
- $adde=
- '
'
- .$adde;
- }
- }
- }
- if ($indent) {
- my $is=" ";
- for(my $i=-1;$i<$indent;$i++) { $indentstr.=$is; }
- }
- if (!$linkid) { $linkid=$rid; }
- if ($hash{'randomout_'.$rid}) {
- $adde=' (hidden)'.$adde;
- }
- $r->print($add.$indentstr);
- if ($rid) {
- $r->print(''.
- $hwk.$hash{'title_'.$rid}.$hwke.'');
- }
- $r->print($adde);
- }
- $r->print('
');
- }
+ }
+ }
+
+ if ($resource->getErrors()) {
+ my $errors = $resource->getErrors();
+ my $errorcount = 0;
+ foreach (split(/,/, $errors)) {
+ last if ($errorcount>=10); # Only output 10 bombs maximum
+ if ($_) {
+ $errorcount++;
+ $errorHTML .= ' '
+ . '
';
}
- $r->print("\n
");
- $r->print('