version 1.472, 2011/12/18 17:15:03
|
version 1.481, 2012/03/05 11:15:37
|
Line 225 automatically.
|
Line 225 automatically.
|
|
|
=over 4 |
=over 4 |
|
|
=item * B<iterator: default: constructs one from %env |
=item * B<iterator: default: constructs one from %env> |
|
|
A reference to a fresh ::iterator to use from the navmaps. The |
A reference to a fresh ::iterator to use from the navmaps. The |
rendering will reflect the options passed to the iterator, so you can |
rendering will reflect the options passed to the iterator, so you can |
Line 464 returns 4
|
Line 464 returns 4
|
|
|
=item add_linkitem() |
=item add_linkitem() |
|
|
=item show_linkitems() |
=item show_linkitems_toolbar() |
|
|
=back |
=back |
|
|
Line 542 my %colormap =
|
Line 542 my %colormap =
|
# is not yet done and due in less than 24 hours |
# is not yet done and due in less than 24 hours |
my $hurryUpColor = "#FF0000"; |
my $hurryUpColor = "#FF0000"; |
|
|
my $future_slots_checked = 0; |
|
my $future_slots = 0; |
|
|
|
sub addToFilter { |
sub addToFilter { |
my $hashIn = shift; |
my $hashIn = shift; |
my $addition = shift; |
my $addition = shift; |
Line 635 sub getDescription {
|
Line 632 sub getDescription {
|
return &mt('Reserved - next open [_1]', |
return &mt('Reserved - next open [_1]', |
timeToHumanString($slot_time,'start')); |
timeToHumanString($slot_time,'start')); |
} elsif ($slot_status == $res->RESERVABLE) { |
} elsif ($slot_status == $res->RESERVABLE) { |
return &mt('Reservable ending [_1]', |
return &mt('Reservable, reservations close [_1]', |
timeToHumanString($slot_time,'end')); |
timeToHumanString($slot_time,'end')); |
} elsif ($slot_status == $res->RESERVABLE_LATER) { |
} elsif ($slot_status == $res->RESERVABLE_LATER) { |
return &mt('Reservable starting [_1]', |
return &mt('Reservable, reservations open [_1]', |
timeToHumanString($slot_time,'start')); |
timeToHumanString($slot_time,'start')); |
} elsif ($slot_status == $res->NOT_IN_A_SLOT) { |
} elsif ($slot_status == $res->NOT_IN_A_SLOT) { |
return &mt('Reserve a time/place to work'); |
return &mt('Reserve a time/place to work'); |
Line 899 sub part_status_summary { return 4; }
|
Line 896 sub part_status_summary { return 4; }
|
sub render_resource { |
sub render_resource { |
my ($resource, $part, $params) = @_; |
my ($resource, $part, $params) = @_; |
|
|
|
my $editmapLink; |
my $nonLinkedText = ''; # stuff after resource title not in link |
my $nonLinkedText = ''; # stuff after resource title not in link |
|
|
my $link = $params->{"resourceLink"}; |
my $link = $params->{"resourceLink"}; |
Line 980 sub render_resource {
|
Line 978 sub render_resource {
|
$linkopen = ""; |
$linkopen = ""; |
$linkclose = ""; |
$linkclose = ""; |
} |
} |
|
if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && |
|
($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/)) { |
|
my $icon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png'; |
|
$editmapLink=' '. |
|
'<a href="/adm/coursedocs?command=direct&symb='.&escape($resource->symb()).'">'. |
|
'<img src="'.$icon.'" alt="'.&mt('Edit Content').'" title="'.&mt('Edit Content').'" />'. |
|
'</a>'; |
|
} |
} |
} |
|
|
if ($resource->randomout()) { |
if ($resource->randomout()) { |
Line 1013 sub render_resource {
|
Line 1019 sub render_resource {
|
# Is this the current resource? |
# Is this the current resource? |
if (!$params->{'displayedHereMarker'} && |
if (!$params->{'displayedHereMarker'} && |
$resource->symb() eq $params->{'here'} ) { |
$resource->symb() eq $params->{'here'} ) { |
$curMarkerBegin = '<span class="LC_current_nav_location">'; |
unless ($resource->is_map()) { |
$curMarkerEnd = '</span>'; |
$curMarkerBegin = '<span class="LC_current_nav_location">'; |
|
$curMarkerEnd = '</span>'; |
|
} |
$params->{'displayedHereMarker'} = 1; |
$params->{'displayedHereMarker'} = 1; |
} |
} |
|
|
Line 1033 sub render_resource {
|
Line 1041 sub render_resource {
|
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 href=\"$link\">$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>"; |
} else { |
} else { |
$result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>"; |
$result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$editmapLink$nonLinkedText</td>"; |
} |
} |
|
|
return $result; |
return $result; |
Line 1047 sub render_communication_status {
|
Line 1055 sub render_communication_status {
|
my $linkopen = "<a href=\"$link\">"; |
my $linkopen = "<a href=\"$link\">"; |
my $linkclose = "</a>"; |
my $linkclose = "</a>"; |
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc"); |
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc"); |
|
|
if ($resource->hasDiscussion()) { |
if ($resource->hasDiscussion()) { |
$discussionHTML = $linkopen . |
$discussionHTML = $linkopen . |
'<img alt="'.&mt('New Discussion').'" src="'.$location.'/chat.gif" title="'.&mt('New Discussion').'"/>' . |
'<img alt="'.&mt('New Discussion').'" src="'.$location.'/chat.gif" title="'.&mt('New Discussion').'"/>' . |
Line 1135 sub render_long_status {
|
Line 1144 sub render_long_status {
|
$result .= getDescription($resource, $part); |
$result .= getDescription($resource, $part); |
if ($color) {$result .= "</b></font>"; } |
if ($color) {$result .= "</b></font>"; } |
} |
} |
if ($resource->is_map()) { |
|
if (&Apache::lonnet::allowed('mdc')) { |
|
if ($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/) { |
|
$result.=" <a href='/adm/coursedocs?command=direct&symb=".&escape($resource->symb())."'>". |
|
"<span class='LC_setting'>".&mt("Edit Content").'</span></a> '; |
|
} |
|
} |
|
} |
|
if ($resource->is_map() && &advancedUser() && $resource->randompick()) { |
if ($resource->is_map() && &advancedUser() && $resource->randompick()) { |
$result .= &mt('(randomly select [_1])', $resource->randompick()); |
$result .= &mt('(randomly select [_1])', $resource->randompick()); |
} |
} |
Line 1465 sub render {
|
Line 1466 sub render {
|
$link .= '&register='.$env{'form.register'}; |
$link .= '&register='.$env{'form.register'}; |
} |
} |
if ($args->{'caller'} eq 'navmapsdisplay') { |
if ($args->{'caller'} eq 'navmapsdisplay') { |
&add_linkitem($args->{'linkitems'},'changefolder', |
unless ($args->{'notools'}) { |
"location.href='$link'",$text); |
&add_linkitem($args->{'linkitems'},'changefolder', |
|
"location.href='$link'",$text); |
|
} |
} else { |
} else { |
$result.= '<a href="'.$link.'">'.&mt($text).'</a>'; |
$result.= '<a href="'.$link.'">'.&mt($text).'</a>'; |
} |
} |
Line 1474 sub render {
|
Line 1477 sub render {
|
} |
} |
|
|
# Check for any unread discussions in all resources. |
# Check for any unread discussions in all resources. |
if ($args->{'caller'} eq 'navmapsdisplay') { |
if (($args->{'caller'} eq 'navmapsdisplay') && (!$args->{'notools'})) { |
&add_linkitem($args->{'linkitems'},'clearbubbles', |
&add_linkitem($args->{'linkitems'},'clearbubbles', |
'document.clearbubbles.submit()', |
'document.clearbubbles.submit()', |
'Mark all posts read'); |
'Mark all posts read'); |
Line 1507 END
|
Line 1510 END
|
} |
} |
$result.='</form>'; |
$result.='</form>'; |
} |
} |
|
if (($args->{'caller'} eq 'navmapsdisplay') && |
|
(&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq |
|
"uploaded/$cdom/$cnum/default.sequence") { |
|
&add_linkitem($args->{'linkitems'},'edittoplevel', |
|
"javascript:gocmd('/adm/coursedocs','editdocs');", |
|
'Content Editor'); |
|
} |
|
} |
|
|
if ($args->{'caller'} eq 'navmapsdisplay') { |
if ($args->{'caller'} eq 'navmapsdisplay') { |
$result .= '<table><tr><td>'. |
$result .= &show_linkitems_toolbar($args,$condition); |
&Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT').'</td>'; |
|
$result .= '<td> </td>'; |
|
$result.='<td class="LC_middle">'.&mt('Tools:').'</td>'; |
|
$result.=&show_linkitems_toolbar($args->{'linkitems'}); |
|
if ($args->{'sort_html'}) { |
|
$result.='<td> </td><td> </td><td> </td>'. |
|
'<td align="right">'.$args->{'sort_html'}.'</td></tr>'; |
|
} |
|
$result .= '</table>'; |
|
} elsif ($args->{'sort_html'}) { |
} elsif ($args->{'sort_html'}) { |
$result.=$args->{'sort_html'}; |
$result.=$args->{'sort_html'}; |
} |
} |
Line 1856 sub add_linkitem {
|
Line 1861 sub add_linkitem {
|
} |
} |
|
|
sub show_linkitems_toolbar { |
sub show_linkitems_toolbar { |
my ($linkitems,$condition)=@_; |
my ($args,$condition) = @_; |
my @linkorder = ('firsthomework','everything','uncompleted', |
my $result; |
'changefolder','clearbubbles'); |
if (ref($args) eq 'HASH') { |
my $result .='<td align="left">'."\n". |
if (ref($args->{'linkitems'}) eq 'HASH') { |
'<span class="LC_nobreak">'."\n". |
my $numlinks = scalar(keys(%{$args->{'linkitems'}})); |
'<ul id="LC_toolbar">'; |
if ($numlinks > 1) { |
foreach my $link (@linkorder) { |
$result = '<td>'. |
my $link_id = 'LC_content_toolbar_'.$link; |
&Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen', |
if (defined($linkitems->{$link})) { |
undef,'RAT'). |
if ($linkitems->{$link}{'text'} ne '') { |
'</td>'. |
$linkitems->{$link}{'cmd'}=~s/"/'/g; |
'<td> </td>'. |
if ($linkitems->{$link}{'cmd'}) { |
'<td class="LC_middle">'.&mt('Tools:').'</td>'; |
if ($link eq 'changefolder') { |
} |
if ($condition) { |
$result .= '<td align="left">'."\n". |
$link_id='LC_content_toolbar_changefolder_toggled'; |
'<span class="LC_nobreak">'."\n". |
} else { |
'<ul id="LC_toolbar">'; |
$link_id='LC_content_toolbar_changefolder'; |
my @linkorder = ('firsthomework','everything','uncompleted', |
|
'changefolder','clearbubbles','edittoplevel'); |
|
foreach my $link (@linkorder) { |
|
if (ref($args->{'linkitems'}{$link}) eq 'HASH') { |
|
if ($args->{'linkitems'}{$link}{'text'} ne '') { |
|
$args->{'linkitems'}{$link}{'cmd'}=~s/"/'/g; |
|
if ($args->{'linkitems'}{$link}{'cmd'}) { |
|
my $link_id = 'LC_content_toolbar_'.$link; |
|
if ($link eq 'changefolder') { |
|
if ($condition) { |
|
$link_id='LC_content_toolbar_changefolder_toggled'; |
|
} else { |
|
$link_id='LC_content_toolbar_changefolder'; |
|
} |
|
} |
|
$result .= '<li><a href="#" '. |
|
'onclick="'.$args->{'linkitems'}{$link}{'cmd'}.'" '. |
|
'id="'.$link_id.'" '. |
|
'class="LC_toolbarItem" '. |
|
'title="'.$args->{'linkitems'}{$link}{'text'}.'">'. |
|
'</a></li>'."\n"; |
} |
} |
} |
} |
$result .= '<li><a href="#" '. |
|
'onclick="'.$linkitems->{$link}{'cmd'}.'" '. |
|
'id="'.$link_id.'" '. |
|
'class="LC_toolbarItem" '. |
|
'title="'.$linkitems->{$link}{'text'}.'">'. |
|
'</a></li>'."\n"; |
|
} |
} |
} |
} |
|
$result .= '</ul>'. |
|
'</span></td>'; |
|
if (($numlinks==1) && (exists($args->{'linkitems'}{'edittoplevel'}))) { |
|
$result .= '<td><a href="'.$args->{'linkitems'}{'edittoplevel'}{'cmd'}.'">'. |
|
&mt('Content Editor').'</a></td>'; |
|
} |
|
} |
|
if ($args->{'sort_html'}) { |
|
$result .= '<td> </td><td> </td><td> </td>'. |
|
'<td align="right">'.$args->{'sort_html'}.'</td>'; |
} |
} |
} |
} |
$result .= '</ul>'. |
if ($result) { |
'</span></td>'."\n"; |
$result = "<table><tr>$result</tr></table>"; |
|
} |
return $result; |
return $result; |
} |
} |
|
|
|
|
1; |
1; |
|
|
|
|
Line 3585 sub new {
|
Line 3614 sub new {
|
$self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self; |
$self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self; |
$self->{RESOURCE_ERROR} = 0; |
$self->{RESOURCE_ERROR} = 0; |
|
|
|
$self->{DUEDATE_CACHE} = undef; |
|
|
# A hash that can be used by two-pass algorithms to store data |
# A hash that can be used by two-pass algorithms to store data |
# about this resource in. Not used by the resource object |
# about this resource in. Not used by the resource object |
# directly. |
# directly. |
Line 4223 sub checkedin {
|
Line 4254 sub checkedin {
|
|
|
sub duedate { |
sub duedate { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
|
if (defined ($self->{DUEDATE_CACHE}->{$part})) { |
|
return $self->{DUEDATE_CACHE}->{$part}; |
|
} |
my $date; |
my $date; |
my @interval=$self->parmval("interval", $part); |
my @interval=$self->parmval("interval", $part); |
my $due_date=$self->parmval("duedate", $part); |
my $due_date=$self->parmval("duedate", $part); |
Line 4239 sub duedate {
|
Line 4273 sub duedate {
|
} else { |
} else { |
$date = $due_date; |
$date = $due_date; |
} |
} |
|
$self->{DUEDATE_CACHE}->{$part} = $date; |
return $date; |
return $date; |
} |
} |
sub handgrade { |
sub handgrade { |
Line 5090 sub status {
|
Line 5125 sub status {
|
} |
} |
|
|
# Otherwise, it's untried and open |
# Otherwise, it's untried and open |
return OPEN; |
return OPEN; |
} |
} |
|
|
sub check_for_slot { |
sub check_for_slot { |
my $self = shift; |
my $self = shift; |
my $part = shift; |
my $part = shift; |
|
my $symb = $self->symb(); |
my ($use_slots,$available,$availablestudent) = $self->slot_control($part); |
my ($use_slots,$available,$availablestudent) = $self->slot_control($part); |
if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) { |
if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) { |
my @slots = (split(/:/,$availablestudent),split(/:/,$available)); |
my @slots = (split(/:/,$availablestudent),split(/:/,$available)); |
Line 5103 sub check_for_slot {
|
Line 5139 sub check_for_slot {
|
my $cdom=$env{'course.'.$cid.'.domain'}; |
my $cdom=$env{'course.'.$cid.'.domain'}; |
my $cnum=$env{'course.'.$cid.'.num'}; |
my $cnum=$env{'course.'.$cid.'.num'}; |
my $now = time; |
my $now = time; |
|
my $num_usable_slots = 0; |
if (@slots > 0) { |
if (@slots > 0) { |
my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum); |
my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum); |
if (&Apache::lonnet::error(%slots)) { |
if (&Apache::lonnet::error(%slots)) { |
return (UNKNOWN); |
return (UNKNOWN); |
} |
} |
my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots); |
my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); |
my ($checkedin,$checkedinslot); |
my ($checkedin,$checkedinslot); |
foreach my $slot_name (@sorted_slots) { |
foreach my $slot_name (@sorted_slots) { |
next if (!defined($slots{$slot_name}) || |
next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); |
!ref($slots{$slot_name})); |
|
my $end = $slots{$slot_name}->{'endtime'}; |
my $end = $slots{$slot_name}->{'endtime'}; |
my $start = $slots{$slot_name}->{'starttime'}; |
my $start = $slots{$slot_name}->{'starttime'}; |
my $ip = $slots{$slot_name}->{'ip'}; |
my $ip = $slots{$slot_name}->{'ip'}; |
if ($self->simpleStatus() == OPEN) { |
if ($self->simpleStatus() == OPEN) { |
my $startreserve = $slots{$slot_name}->{'startreserve'}; |
|
my $endreserve = $slots{$slot_name}->{'endreserve'}; |
|
my @proctors; |
|
if ($slots{$slot_name}->{'proctor'} ne '') { |
|
@proctors = split(',',$slots{$slot_name}->{'proctor'}); |
|
} |
|
if ($end > $now) { |
if ($end > $now) { |
($checkedin,$checkedinslot) = $self->checkedin(); |
if ($start > $now) { |
if ($startreserve < $now) { |
return (RESERVED_LATER,$start,$slot_name); |
if ($start > $now) { |
} else { |
return (RESERVED_LATER,$start,$slot_name); |
if ($ip ne '') { |
} else { |
if (!&Apache::loncommon::check_ip_acc($ip)) { |
if ($ip ne '') { |
return (RESERVED_LOCATION,$ip,$slot_name); |
if (!&Apache::loncommon::check_ip_acc($ip)) { |
|
return (RESERVED_LOCATION,$ip,$slot_name); |
|
} |
|
} |
|
if (@proctors > 0) { |
|
unless ((grep(/^\Q$checkedin\E/,@proctors)) && |
|
($checkedinslot eq $slot_name)) { |
|
return (NEEDS_CHECKIN,undef,$slot_name); |
|
} |
|
} |
} |
return (RESERVED,$end,$slot_name); |
|
} |
} |
} else { |
my @proctors; |
if ($start > $now) { |
if ($slots{$slot_name}->{'proctor'} ne '') { |
if (!$endreserve || $endreserve > $now) { |
@proctors = split(',',$slots{$slot_name}->{'proctor'}); |
return (RESERVABLE,$startreserve,$slot_name); |
} |
|
if (@proctors > 0) { |
|
($checkedin,$checkedinslot) = $self->checkedin(); |
|
unless ((grep(/^\Q$checkedin\E/,@proctors)) && |
|
($checkedinslot eq $slot_name)) { |
|
return (NEEDS_CHECKIN,undef,$slot_name); |
} |
} |
} |
} |
|
return (RESERVED,$end,$slot_name); |
} |
} |
} |
} |
|
} elsif ($end > $now) { |
|
$num_usable_slots ++; |
} |
} |
} |
} |
my ($is_correct,$got_grade); |
my ($is_correct,$got_grade); |
Line 5170 sub check_for_slot {
|
Line 5198 sub check_for_slot {
|
return (CORRECT); |
return (CORRECT); |
} |
} |
} |
} |
return(NOT_IN_A_SLOT); |
if ($num_usable_slots) { |
} else { |
|
if (!$future_slots_checked) { |
|
$future_slots = &get_future_slots($cdom,$cnum,$now); |
|
$future_slots_checked = 1; |
|
} |
|
if ($future_slots) { |
|
return(NOT_IN_A_SLOT); |
return(NOT_IN_A_SLOT); |
} |
} |
return(NOTRESERVABLE); |
|
} |
} |
} |
my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'}, |
return; |
$env{'user.domain'}); |
} |
if (ref($reservable) eq 'HASH') { |
|
if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) { |
sub get_future_slots { |
foreach my $slot (reverse (@{$reservable->{'now_order'}})) { |
my ($cdom,$cnum,$now) = @_; |
if (($reservable->{'now'}{$slot}{'symb'} eq '') || |
my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum); |
($reservable->{'now'}{$slot}{'symb'} eq $symb)) { |
my $future_slots = 0; |
return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'}); |
foreach my $slot (keys(%slots)) { |
} |
if (($slots{$slot}->{'starttime'} > $now) && |
} |
($slots{$slot}->{'endtime'} > $now)) { |
} |
$future_slots ++; |
if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) { |
|
foreach my $slot (@{$reservable->{'future_order'}}) { |
|
if (($reservable->{'future'}{$slot}{'symb'} eq '') || |
|
($reservable->{'future'}{$slot}{'symb'} eq $symb)) { |
|
return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'}); |
|
} |
|
} |
|
} |
} |
} |
|
return(NOTRESERVABLE); |
} |
} |
return $future_slots; |
return; |
} |
} |
|
|
sub CLOSED { return 23; } |
sub CLOSED { return 23; } |