version 1.267.2.1, 2004/07/26 22:22:03
|
version 1.280, 2004/08/27 20:34:13
|
Line 83 my %colormap =
|
Line 83 my %colormap =
|
# is not yet done and due in less then 24 hours |
# is not yet done and due in less then 24 hours |
my $hurryUpColor = "#FF0000"; |
my $hurryUpColor = "#FF0000"; |
|
|
|
sub launch_win { |
|
my ($mode,$script)=@_; |
|
my $result; |
|
if ($script ne 'no') { |
|
$result.='<script type="text/javascript">'; |
|
} |
|
$result.='function launch_navmapwin() { |
|
newWindow=open(\'/adm/navmaps?launchExternal\',\'loncapanav\',\'width=400,height=600,scrollbars=1\'); |
|
}'; |
|
if ($mode eq 'now') { |
|
$result.="\nlaunch_navmapwin();\n"; |
|
} |
|
if ($script ne 'no') { |
|
$result.='</script>'; |
|
} |
|
if ($mode eq 'link') { |
|
$result.='<a href="javascript:launch_navmapwin();void(0);">' |
|
.&mt("Launch navigation window")."</a> "; |
|
} |
|
return $result; |
|
} |
|
|
|
sub close { |
|
if ($ENV{'environment.remotenavmap'} ne 'on') { return ''; } |
|
return(<<ENDCLOSE); |
|
<script type="text/javascript"> |
|
window.status='Accessing Nav Control'; |
|
menu=window.open("/adm/rat/empty.html","loncapanav", |
|
"height=600,width=400,scrollbars=1"); |
|
window.status='Closing Nav Control'; |
|
menu.close(); |
|
window.status='Done.'; |
|
</script> |
|
ENDCLOSE |
|
} |
|
|
|
sub nav_control_js { |
|
my $nav=($ENV{'environment.remotenavmap'} eq 'on'); |
|
return (<<NAVCONTROL); |
|
var w_loncapanav_flag="$nav"; |
|
|
|
|
|
function gonav(url) { |
|
if (w_loncapanav_flag != 1) { |
|
go(url); |
|
} else { |
|
navwindow=window.open(url, |
|
"loncapanav","height=600,width=400,scrollbars=1"); |
|
} |
|
} |
|
NAVCONTROL |
|
} |
|
|
|
sub update { |
|
if ($ENV{'environment.remotenavmap'} ne 'on') { return ''; } |
|
if (!$ENV{'request.course.id'}) { return ''; } |
|
if ($ENV{'REQUEST_URI'}=~m|^/adm/navmaps|) { return ''; } |
|
return(<<ENDUPDATE); |
|
<form name="navform"></form> |
|
<script type="text/javascript"> |
|
this.document.navform.action='/adm/navmaps#curloc'; |
|
this.document.navform.target='loncapanav'; |
|
this.document.navform.submit(); |
|
</script> |
|
ENDUPDATE |
|
} |
|
|
sub handler { |
sub handler { |
my $r = shift; |
my $r = shift; |
real_handler($r); |
real_handler($r); |
Line 111 sub real_handler {
|
Line 178 sub real_handler {
|
&Apache::loncommon::no_cache($r); |
&Apache::loncommon::no_cache($r); |
$r->send_http_header; |
$r->send_http_header; |
|
|
|
if ($ENV{QUERY_STRING} eq 'collapseExternal') { |
|
&Apache::lonnet::put('environment',{'remotenavmap' => 'off'}); |
|
&Apache::lonnet::appenv('environment.remotenavmap' => 'off'); |
|
my $menu=&Apache::lonmenu::reopenmenu(); |
|
my $navstatus=&Apache::lonmenu::get_nav_status(); |
|
if ($menu) { |
|
$menu=(<<MENU) |
|
swmenu=$menu |
|
swmenu.clearTimeout(swmenu.menucltim); |
|
$navstatus |
|
MENU |
|
} else { |
|
my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); |
|
my $mainwindow='window.open('.$nothing.',"loncapaclient","",false);'; |
|
$menu=(<<MENU) |
|
swmenu=$mainwindow |
|
$navstatus |
|
MENU |
|
} |
|
$r->print(<<"ENDSUBM"); |
|
<html> |
|
<head> |
|
<script type="text/javascript"> |
|
function submitthis() { |
|
$menu |
|
self.close(); |
|
} |
|
|
|
</script> |
|
</head> |
|
<body bgcolor="#FFFFFF" onLoad="submitthis()"></body> |
|
</html> |
|
ENDSUBM |
|
return; |
|
} |
|
if ($ENV{QUERY_STRING} eq 'launchExternal') { |
|
&Apache::lonnet::put('environment',{'remotenavmap' => 'on'}); |
|
&Apache::lonnet::appenv('environment.remotenavmap' => 'on'); |
|
} |
|
|
# Create the nav map |
# Create the nav map |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
|
Line 123 sub real_handler {
|
Line 230 sub real_handler {
|
$r->print("<html><head>\n"); |
$r->print("<html><head>\n"); |
$r->print("<title>".&mt('Navigate Course Contents')."</title>"); |
$r->print("<title>".&mt('Navigate Course Contents')."</title>"); |
# ------------------------------------------------------------ Get query string |
# ------------------------------------------------------------ Get query string |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['register']); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['register','sort','showOnlyHomework']); |
|
|
# ----------------------------------------------------- Force menu registration |
# ----------------------------------------------------- Force menu registration |
my $addentries=''; |
my $addentries=''; |
|
my $more_unload; |
|
my $body_only=''; |
|
if ($ENV{'environment.remotenavmap'} eq 'on') { |
|
$r->print('<script type="text/javascript"> |
|
function collapse() { |
|
this.document.location="/adm/navmaps?collapseExternal"; |
|
} |
|
</script>'); |
|
# FIXME need to be smarter to only catch window close events |
|
# $more_unload="collapse()" |
|
$body_only=1; |
|
} |
if ($ENV{'form.register'}) { |
if ($ENV{'form.register'}) { |
$addentries=' onLoad="'.&Apache::lonmenu::loadevents(). |
$addentries=' onLoad="'.&Apache::lonmenu::loadevents(). |
'" onUnload="'.&Apache::lonmenu::unloadevents().'"'; |
'" onUnload="'.&Apache::lonmenu::unloadevents().';'. |
$r->print(&Apache::lonmenu::registerurl(1)); |
$more_unload.'"'; |
|
$r->print(&Apache::lonmenu::registerurl(1)); |
|
} else { |
|
$addentries=' onUnload="'.$more_unload.'"'; |
} |
} |
|
|
# Header |
# Header |
$r->print('</head>'. |
$r->print('</head>'. |
&Apache::loncommon::bodytag('Navigate Course Contents','', |
&Apache::loncommon::bodytag('Navigate Course Contents','', |
$addentries,'','',$ENV{'form.register'})); |
$addentries,$body_only,'', |
|
$ENV{'form.register'})); |
$r->print('<script>window.focus();</script>'. |
$r->print('<script>window.focus();</script>'. |
&Apache::loncommon::help_open_menu('','Navigation Screen','Navigation_Screen','',undef,'RAT')); |
&Apache::loncommon::help_open_menu('','Navigation Screen','Navigation_Screen','',undef,'RAT')); |
|
|
Line 173 sub real_handler {
|
Line 296 sub real_handler {
|
} |
} |
} |
} |
|
|
|
if ($ENV{QUERY_STRING} eq 'launchExternal') { |
|
$r->print(' |
|
<form name="returnwin" action="/adm/flip?postdata=return%3a" |
|
method="post" target="loncapaclient"> |
|
</form>'); |
|
$r->print(' |
|
<script type="text/javascript"> |
|
this.document.returnwin.submit(); |
|
</script>'); |
|
} |
|
|
|
if ($ENV{'environment.remotenavmap'} ne 'on') { |
|
$r->print(&launch_win('link','yes')); |
|
} |
|
if ($ENV{'environment.remotenavmap'} eq 'on') { |
|
# $r->print("<a href='navmaps?collapseExternal'>" . |
|
$r->print("<a href='javascript:collapse();void(0);'>" . |
|
&mt("Close navigation window"). |
|
"</a> "); |
|
} |
|
|
my $jumpToFirstHomework = 0; |
my $jumpToFirstHomework = 0; |
# Check to see if the student is jumping to next open, do-able problem |
# Check to see if the student is jumping to next open, do-able problem |
if ($ENV{QUERY_STRING} eq 'jumpToFirstHomework') { |
if ($ENV{QUERY_STRING} eq 'jumpToFirstHomework') { |
Line 218 sub real_handler {
|
Line 362 sub real_handler {
|
|
|
# Display only due homework. |
# Display only due homework. |
my $showOnlyHomework = 0; |
my $showOnlyHomework = 0; |
if ($ENV{QUERY_STRING} eq 'showOnlyHomework') { |
if ($ENV{'form.showOnlyHomework'} eq "1") { |
$showOnlyHomework = 1; |
$showOnlyHomework = 1; |
$suppressEmptySequences = 1; |
$suppressEmptySequences = 1; |
$filterFunc = sub { my $res = shift; |
$filterFunc = sub { my $res = shift; |
return $res->completable() || $res->is_map(); |
return $res->completable() || $res->is_map(); |
}; |
}; |
|
$r->print("<a href='navmaps?sort=$ENV{'form.sort'}'>" . |
|
&mt("Show Everything")."</a> "); |
$r->print("<p><font size='+2'>".&mt("Uncompleted Homework")."</font></p>"); |
$r->print("<p><font size='+2'>".&mt("Uncompleted Homework")."</font></p>"); |
$ENV{'form.filter'} = ''; |
$ENV{'form.filter'} = ''; |
$ENV{'form.condition'} = 1; |
$ENV{'form.condition'} = 1; |
$resource_no_folder_link = 1; |
$resource_no_folder_link = 1; |
} else { |
} else { |
$r->print("<a href='navmaps?showOnlyHomework'>" . |
$r->print("<a href='navmaps?sort=$ENV{'form.sort'}&showOnlyHomework=1'>" . |
&mt("Show Only Uncompleted Homework")."</a> "); |
&mt("Show Only Uncompleted Homework")."</a> "); |
} |
} |
|
|
|
my %selected=($ENV{'form.sort'} => 'selected=on'); |
|
my $sort_html=("<form> |
|
<nobr> |
|
<input type=\"hidden\" name=\"showOnlyHomework\" value=\"".$ENV{'form.showOnlyHomework'}."\" /> |
|
<input type=\"submit\" value=\"".&mt('Sort by:')."\" /> |
|
<select name=\"sort\"> |
|
<option value=\"default\" $selected{'default'}>".&mt('Default')."</option> |
|
<option value=\"title\" $selected{'title'} >".&mt('Title')."</option> |
|
<option value=\"duedate\" $selected{'duedate'}>".&mt('Duedate')."</option> |
|
</select> |
|
</nobr> |
|
</form>"); |
# renderer call |
# renderer call |
my $renderArgs = { 'cols' => [0,1,2,3], |
my $renderArgs = { 'cols' => [0,2,3], |
|
'sort' => $ENV{'form.sort'}, |
'url' => '/adm/navmaps', |
'url' => '/adm/navmaps', |
'navmap' => $navmap, |
'navmap' => $navmap, |
'suppressNavmap' => 1, |
'suppressNavmap' => 1, |
'suppressEmptySequences' => $suppressEmptySequences, |
'suppressEmptySequences' => $suppressEmptySequences, |
'filterFunc' => $filterFunc, |
'filterFunc' => $filterFunc, |
'resource_no_folder_link' => $resource_no_folder_link, |
'resource_no_folder_link' => $resource_no_folder_link, |
|
'sort_html'=> $sort_html, |
'r' => $r}; |
'r' => $r}; |
my $render = render($renderArgs); |
my $render = render($renderArgs); |
$navmap->untieHashes(); |
$navmap->untieHashes(); |
Line 513 sub timeToHumanString {
|
Line 673 sub timeToHumanString {
|
} |
} |
|
|
# Not this year, so show the year |
# Not this year, so show the year |
my $timeStr = strftime("on %A, %b %e %G at %I:%M %P", localtime($time)); |
my $timeStr = strftime("on %A, %b %e %Y at %I:%M %P", localtime($time)); |
$timeStr =~ s/12:00 am/00:00/; |
$timeStr =~ s/12:00 am/00:00/; |
$timeStr =~ s/12:00 pm/noon/; |
$timeStr =~ s/12:00 pm/noon/; |
return $timeStr; |
return $timeStr; |
Line 959 sub render_resource {
|
Line 1119 sub render_resource {
|
|
|
if ($resource->is_problem() && $part ne '0' && |
if ($resource->is_problem() && $part ne '0' && |
!$params->{'condensed'}) { |
!$params->{'condensed'}) { |
my $displaypart=&Apache::lonnet::EXT('resource.'.$part.'.display', |
my $displaypart=$resource->part_display($part); |
$resource->symb()); |
|
unless ($displaypart) { $displaypart=$part; } |
|
$partLabel = " (Part: $displaypart)"; |
$partLabel = " (Part: $displaypart)"; |
$link.='#'.&Apache::lonnet::escape($part); |
$link.='#'.&Apache::lonnet::escape($part); |
$title = ""; |
$title = ""; |
Line 971 sub render_resource {
|
Line 1129 sub render_resource {
|
$nonLinkedText .= ' (' . $resource->countParts() . ' parts)'; |
$nonLinkedText .= ' (' . $resource->countParts() . ' parts)'; |
} |
} |
|
|
|
my $target; |
|
if ($ENV{'environment.remotenavmap'} eq 'on') { |
|
$target=' target="loncapaclient" '; |
|
} |
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { |
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { |
$result .= " $curMarkerBegin<a href='$link'>$title$partLabel</a>$curMarkerEnd $nonLinkedText</td>"; |
$result .= " $curMarkerBegin<a $target href='$link'>$title$partLabel</a>$curMarkerEnd $nonLinkedText</td>"; |
} else { |
} else { |
$result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText</td>"; |
$result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText</td>"; |
} |
} |
Line 1405 END
|
Line 1567 END
|
$result .= '<br />'; |
$result .= '<br />'; |
} |
} |
} |
} |
|
|
|
if ($args->{'sort_html'}) { $result.=$args->{'sort_html'}; } |
|
|
$result .= "<br />\n"; |
$result .= "<br />\n"; |
if ($r) { |
if ($r) { |
$r->print($result); |
$r->print($result); |
Line 1477 END
|
Line 1642 END
|
$args->{'here'} = $here; |
$args->{'here'} = $here; |
|
|
$args->{'indentLevel'} = -1; # first BEGIN_MAP takes this to 0 |
$args->{'indentLevel'} = -1; # first BEGIN_MAP takes this to 0 |
while ($curRes = $it->next($closeAllPages)) { |
my @resources; |
|
my $code='';# sub { !(shift->is_map();) }; |
|
if ($args->{'sort'} eq 'title') { |
|
my $oldFilterFunc = $filterFunc; |
|
my $filterFunc= |
|
sub { |
|
my ($res)=@_; |
|
if ($res->is_map()) { return 0;} |
|
return &$oldFilterFunc($res); |
|
}; |
|
@resources=$navmap->retrieveResources(undef,$filterFunc); |
|
@resources= sort {lc($a->compTitle) cmp lc($b->compTitle)} @resources; |
|
} elsif ($args->{'sort'} eq 'duedate') { |
|
@resources=$navmap->retrieveResources(undef, |
|
sub { shift->is_problem(); }); |
|
@resources= sort |
|
{ |
|
if ($a->duedate ne $b->duedate) { |
|
return $a->duedate cmp $b->duedate; |
|
} else { |
|
lc($a->compTitle) cmp lc($b->compTitle) |
|
} |
|
} @resources; |
|
} else { |
|
#unknow sort mechanism or default |
|
undef($args->{'sort'}); |
|
} |
|
|
|
|
|
while (1) { |
|
if ($args->{'sort'}) { |
|
$curRes = shift(@resources); |
|
} else { |
|
$curRes = $it->next($closeAllPages); |
|
} |
|
if (!$curRes) { last; } |
|
|
# Maintain indentation level. |
# Maintain indentation level. |
if ($curRes == $it->BEGIN_MAP() || |
if ($curRes == $it->BEGIN_MAP() || |
$curRes == $it->BEGIN_BRANCH() ) { |
$curRes == $it->BEGIN_BRANCH() ) { |
Line 1591 END
|
Line 1792 END
|
|
|
# Set up some data about the parts that the cols might want |
# Set up some data about the parts that the cols might want |
my $filter = $it->{FILTER}; |
my $filter = $it->{FILTER}; |
my $stack = $it->getStack(); |
my $src; |
my $src = getLinkForResource($stack); |
if ($args->{'sort'}) { |
|
$src = $curRes->src(); # FIXME this is wrong for .pages |
|
} else { |
|
my $stack = $it->getStack(); |
|
$src=getLinkForResource($stack); |
|
} |
my $anchor=''; |
my $anchor=''; |
if ($src=~s/(\#.*$)//) { |
if ($src=~s/(\#.*)$//) { |
$anchor=$1; |
$anchor=$1; |
} |
} |
my $srcHasQuestion = $src =~ /\?/; |
my $srcHasQuestion = $src =~ /\?/; |
Line 1602 END
|
Line 1808 END
|
($srcHasQuestion?'&':'?') . |
($srcHasQuestion?'&':'?') . |
'symb=' . &Apache::lonnet::escape($curRes->symb()). |
'symb=' . &Apache::lonnet::escape($curRes->symb()). |
$anchor; |
$anchor; |
|
|
# Now, display each column. |
# Now, display each column. |
foreach my $col (@$cols) { |
foreach my $col (@$cols) { |
my $colHTML = ''; |
my $colHTML = ''; |
Line 2057 sub getById {
|
Line 2263 sub getById {
|
sub getBySymb { |
sub getBySymb { |
my $self = shift; |
my $self = shift; |
my $symb = shift; |
my $symb = shift; |
|
|
my ($mapUrl, $id, $filename) = &Apache::lonnet::decode_symb($symb); |
my ($mapUrl, $id, $filename) = &Apache::lonnet::decode_symb($symb); |
my $map = $self->getResourceByUrl($mapUrl); |
my $map = $self->getResourceByUrl($mapUrl); |
return $self->getById($map->map_pc() . '.' . $id); |
my $returnvalue = undef; |
|
if (ref($map)) { |
|
$returnvalue = $self->getById($map->map_pc() .'.'.$id); |
|
} |
|
return $returnvalue; |
} |
} |
|
|
sub getByMapPc { |
sub getByMapPc { |
Line 2253 in the filter function.
|
Line 2464 in the filter function.
|
|
|
=cut |
=cut |
|
|
|
|
sub getResourceByUrl { |
sub getResourceByUrl { |
my $self = shift; |
my $self = shift; |
my $resUrl = shift; |
my $resUrl = shift; |
Line 3518 sub weight {
|
Line 3730 sub weight {
|
$self->symb(), $ENV{'user.domain'}, |
$self->symb(), $ENV{'user.domain'}, |
$ENV{'user.name'}, |
$ENV{'user.name'}, |
$ENV{'request.course.sec'}); |
$ENV{'request.course.sec'}); |
|
} |
|
sub part_display { |
|
my $self= shift(); my $partID = shift(); |
|
if (! defined($partID)) { $partID = '0'; } |
|
my $display=&Apache::lonnet::EXT('resource.'.$partID.'.display', |
|
$self->symb); |
|
if (! defined($display) || $display eq '') { |
|
$display = $partID; |
|
} |
|
return $display; |
} |
} |
|
|
# Multiple things need this |
# Multiple things need this |
Line 4132 sub status {
|
Line 4353 sub status {
|
|
|
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
$dateStatus == PAST_DUE_NO_ANSWER ) { |
$dateStatus == PAST_DUE_NO_ANSWER ) { |
return $suppressFeedback ? ANSWER_SUBMITTED ? $dateStatus; |
return $suppressFeedback ? ANSWER_SUBMITTED : $dateStatus; |
} |
} |
|
|
if ($dateStatus == ANSWER_OPEN) { |
if ($dateStatus == ANSWER_OPEN) { |