version 1.8, 2013/11/13 01:40:07
|
version 1.21, 2024/12/26 17:12:36
|
Line 33 loncourserespicker - Utilities to choose
|
Line 33 loncourserespicker - Utilities to choose
|
|
|
=head1 SYNOPSIS |
=head1 SYNOPSIS |
|
|
loncourserespicker provides an interface for selecting which folders and/or |
loncourserespicker provides either (1) an interface for selecting which |
resources are to be either: |
folders and/or resources are to be selected for a specific action, one of: |
|
|
(a) exported to an IMS Content Package |
(a) export to an IMS Content Package |
(b) subject to access blocking for the duriation of an exam/quiz. |
(b) be subject to access blocking for the duration of an exam/quiz. |
(c) dumped to an Authoring Space |
(c) dump to an Authoring Space |
|
(d) receive shortened URLs to be used when deep-linking into a course |
|
|
|
or (2) an interface for selecting a single folder or resource for which |
|
existing passback credentials can be used to send scores to another Course |
|
Management System (CMS). |
|
|
=head1 DESCRIPTION |
=head1 DESCRIPTION |
|
|
This module provides routines to generate a hierarchical display of folders |
This module provides routines to generate a hierarchical display of folders |
and resources in a course which can be selected for specific actions. |
and resources in a course which can be selected for specific actions. In |
|
all except one use case all items in the course are shown. The case where |
The choice of items is copied back to the main window from which the pop-up |
only a filtered list is shown is passback of scores, and filtering limits |
window used to display the Course Contents was opened. |
folders and resources to those items for which passback credentials exist, |
|
(and their parent folders). |
|
|
|
When the display is shown in a pop-up window, The choice of items will be |
|
copied back to the main window from which the pop-up window used to display |
|
the Course Contents was opened. |
|
|
=head1 OVERVIEW |
=head1 OVERVIEW |
|
|
The main subroutine: &create_picker() will display the hierarchy of folders, |
In the cases where multiple items may be selected the main subroutine: |
sub-folders, and resources in the Main Content area. Items can be selected |
&create_picker() will display the hierarchy of folders, sub-folders, and |
using checkboxes, and/or a "Check All" button. Selection of a folder |
resources in the Main Content area. Items can be selected using checkboxes, |
causes the contents of the folder to also be selected automatically. The |
and/or a "Check All" button. Selection of a folder causes the contents of |
propagation of check status is recursive into sub-folders. Likewise, if an |
the folder to also be selected automatically. The propagation of check |
item deep in a nested set of folders and sub-folders is unchecked, the |
status is recursive into sub-folders. Likewise, if an item deep in a nested |
uncheck will propagate up through the hierarchy causing any folders at |
set of folders and sub-folders is unchecked, the uncheck will propagate up |
a higher level to become unchecked. |
through the hierarchy causing any folders at a higher level to become |
|
unchecked. |
|
|
|
In the case where only a single item may be selected the main subroutine: |
|
&create_picker() will display the hierarchy of folders and sub-folders for |
|
only those items for which passback credentials exist, |
|
|
There is a submit button, which will be named differently according to the |
There is a submit button, which will be named differently according to the |
context in which resource/folder selection is being made. |
context in which resource/folder selection is being made. |
|
|
The three contexts currently supported are: IMS export, selection of |
The five contexts currently supported are: IMS export, selection of |
content to be subject to access restructions for the duration of an |
content to be subject to access restructions for the duration of an |
exam, and selection of items for dumping to an Authoring Space. |
exam, selection of items for dumping to an Authoring Space, display or |
|
creation of shortened URLs for deep-linking, and selection of a single |
|
item for apssback of grades to another CMS. |
|
|
=head1 INTERNAL SUBROUTINES |
=head1 INTERNAL SUBROUTINES |
|
|
=item &create_picker() |
=item &create_picker() |
|
|
Created HTML mark up to display contents of course with checkboxes to |
In the cases where multiple items may be selected ... |
|
|
|
Creates HTML markup to display contents of course with checkboxes to |
select items. Checking a folder causes recursive checking of items |
select items. Checking a folder causes recursive checking of items |
within the folder. Unchecking a resource causing unchecking of folders |
within the folder. Unchecking a resource causing unchecking of folders |
containing the item back up to the top level. |
containing the item back up to the top level. |
|
|
Inputs: 9. |
In the case where only a single item may be selected ... |
|
|
|
Creates HTML markup to display filtered contents of course with radio |
|
buttons to select an item. |
|
|
|
Inputs: 13. |
- $navmap -- Reference to LON-CAPA navmap object |
- $navmap -- Reference to LON-CAPA navmap object |
(encapsulates information about resources in the course). |
(encapsulates information about resources in the course). |
|
|
- $context -- Context in which course resource selection is being made. |
- $context -- Context in which course resource selection is being made. |
Currently imsexport and examblock are supported. |
Currently imsexport, examblock, dumpdocs, and shorturls |
|
are supported. |
|
|
- $formname -- Name of the form in the window from which the pop-up |
- $formname -- Name of the form in the window from which the pop-up |
used to select course items was launched. |
used to select course items was launched. |
Line 107 Inputs: 9.
|
Line 132 Inputs: 9.
|
- $uploadedfiles -- Reference to hash: keys are paths to files in |
- $uploadedfiles -- Reference to hash: keys are paths to files in |
/home/httpd/lonUsers/$cdom/$1/$2/$3/$cnum/userfiles. |
/home/httpd/lonUsers/$cdom/$1/$2/$3/$cnum/userfiles. |
|
|
|
- $tiny -- Reference to hash: keys are symbs of course items for which |
|
shortened URLs have already been created. |
|
|
|
- $passback -- Reference to hash: keys are symbs of course items for |
|
which passback credentials exist. For each symb the |
|
hash value is itself a hash of deeplink launch items |
|
for that symb with inner hash key set to: |
|
$linkuri\0$linkprotector\0$scope, and corresponding |
|
value of 1. |
|
|
|
- $readonly -- if true, no "check all" or "uncheck all" buttons will |
|
be displayed, and checkboxes will be disabled, if this |
|
is for an exam block or for shortened URL creation, |
|
and radio buttons will be disabled, if this is for |
|
passback of scores to another CMS, |
|
|
|
|
Output: $output is the HTML mark-up for display/selection of content |
Output: $output is the HTML mark-up for display/selection of content |
items in the pop-up window. |
items, either in a pop-up window, or in the main window, |
|
depending on context. |
|
|
=item &respicker_javascript() |
=item &respicker_javascript() |
|
|
Creates javascript functions for checking/unchecking all items, and |
Creates javascript functions for checking/unchecking all items, and |
for recursive checking triggered by checking a folder, or recursive |
for recursive checking triggered by checking a folder, or recursive |
(upeards) unchecking of an item within a folder. |
(upwards) unchecking of an item within a folder. |
|
|
Inputs: 7. |
Inputs: 9. |
- $startcount -- Starting offset of form element numbering for items |
- $startcount -- Starting offset of form element numbering for items |
|
|
- $numcount -- Total numer of folders and resources in course. |
- $numcount -- Total number of folders and resources in course. |
|
|
- $context -- Context in which resources are being displayed |
- $context -- Context in which resources are being displayed |
(imsexport, examblock or dumpdocs). |
(imsexport, examblock, dumpdocs, shorturls, or |
|
crsauthored). |
|
|
- $formname -- Name of form. |
- $formname -- Name of form. |
|
|
Line 133 Inputs: 7.
|
Line 176 Inputs: 7.
|
|
|
- $checked_maps -- Reference to array of folders currently checked. |
- $checked_maps -- Reference to array of folders currently checked. |
|
|
|
- $numhome -- Number of possible Authoring Spaces on this server |
|
(context is dumpdocs or crsauthored). |
|
|
|
- $chkname -- Name of checkboxes used to indicate selection of folder |
|
or resource. |
|
|
Output: 1. Javascript (within <script></script> tags. |
Output: 1. Javascript (within <script></script> tags. |
|
|
|
|
Line 144 no object instantiated.
|
Line 193 no object instantiated.
|
Inputs: 2. |
Inputs: 2. |
- $crstype -- Container type: Course or Community |
- $crstype -- Container type: Course or Community |
|
|
- $context -- Context: imsexport, examblock or dumpdocs |
- $context -- Context: imsexport, examblock, dumpdocs, shorturls |
|
or passback. |
|
|
|
|
=item &clean() |
=item &clean() |
|
|
Takes incoming title and replaces non-alphanumeric characters with underscore, |
Takes incoming title and replaces non-alphanumeric characters with underscore, |
so title can be used as suggested file name (with appended extension) for file |
so title can be used as suggested file name (with appended extension) for file |
copied from course to Authoring space. |
copied from course to Authoring Space. |
|
|
|
|
=item &enumerate_course_contents() |
=item &enumerate_course_contents() |
Line 161 a course, where keys are numbers (starti
|
Line 211 a course, where keys are numbers (starti
|
map url, or symb, for an iteration through the course, as seen by |
map url, or symb, for an iteration through the course, as seen by |
a Course Coordinator. Used to generate numerical IDs to facilitate |
a Course Coordinator. Used to generate numerical IDs to facilitate |
(a) storage of lists of maps or resources to be blocked during an exam, |
(a) storage of lists of maps or resources to be blocked during an exam, |
(b) processing selected form element during dumping of selected course |
(b) processing selected form elements during dumping of selected course |
content to Authoring space. |
content to Authoring Space. |
|
(c) processing of checked checkboxes for creation of shortened URLs for |
|
deep-linking to course content. |
|
|
Inputs: 7 |
Inputs: 7 |
|
|
Line 176 Inputs: 7
|
Line 228 Inputs: 7
|
$title_ref - reference to hash containing titles for items in |
$title_ref - reference to hash containing titles for items in |
course |
course |
|
|
$context - examblock or dumpdocs |
$context - examblock, dumpdocs or shorturls |
|
|
$cdom - course's domain |
$cdom - course's domain |
|
|
$cnum - courseID |
$cnum - courseID |
|
|
Outputs: None |
Outputs: None |
|
|
Line 206 use Apache::lonlocal;
|
Line 258 use Apache::lonlocal;
|
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
|
sub create_picker { |
sub create_picker { |
my ($navmap,$context,$formname,$crstype,$blockedmaps,$blockedresources,$block,$preamble,$numhome,$uploadedfiles) = @_; |
my ($navmap,$context,$formname,$crstype,$blockedmaps,$blockedresources,$block,$preamble, |
|
$numhome,$uploadedfiles,$tiny,$passback,$readonly) = @_; |
return unless (ref($navmap)); |
return unless (ref($navmap)); |
my ($it,$output,$numdisc,%maps,%resources,%discussiontime,%currmaps,%currresources,%files); |
my ($it,$output,$numdisc,%discussiontime,%currmaps,%currresources,%files, |
|
%shorturls,%shownmaps,%shownsymbs,%recursed,%retrieved,%pb,$chkname); |
|
$chkname = 'archive'; |
|
if ($context eq 'shorturls') { |
|
$chkname = 'addtiny'; |
|
} elsif ($context eq 'passback') { |
|
$chkname = 'passback'; |
|
} |
$it = $navmap->getIterator(undef,undef,undef,1,undef,undef); |
$it = $navmap->getIterator(undef,undef,undef,1,undef,undef); |
if (ref($blockedmaps) eq 'HASH') { |
if (ref($blockedmaps) eq 'HASH') { |
%currmaps = %{$blockedmaps}; |
%currmaps = %{$blockedmaps}; |
Line 217 sub create_picker {
|
Line 277 sub create_picker {
|
%currresources = %{$blockedresources}; |
%currresources = %{$blockedresources}; |
} elsif (ref($uploadedfiles) eq 'HASH') { |
} elsif (ref($uploadedfiles) eq 'HASH') { |
%files = %{$uploadedfiles}; |
%files = %{$uploadedfiles}; |
|
} elsif (ref($tiny) eq 'HASH') { |
|
%shorturls = %{$tiny}; |
|
} elsif ($context eq 'passback') { |
|
if (ref($passback) eq 'HASH') { |
|
%pb = %{$passback}; |
|
foreach my $symb (keys(%pb)) { |
|
my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb); |
|
my @recurseup; |
|
if ($url =~ /\.(page|sequence)$/) { |
|
@recurseup = $navmap->recurseup_maps($url); |
|
$shownmaps{&Apache::lonnet::clutter($url)} = 1; |
|
if (ref($pb{$symb}) eq 'HASH') { |
|
foreach my $entry (keys(%{$pb{$symb}})) { |
|
my $scope = (split("\0",$entry))[-1]; |
|
if (($scope eq 'map') || ($scope eq 'rec')) { |
|
my @contents; |
|
if ($scope eq 'map') { |
|
unless ($retrieved{$url} || $recursed{$url}) { |
|
@contents = $navmap->retrieveResources($url,sub { $_[0]->is_gradable() },0); |
|
$retrieved{$url} = 1; |
|
} |
|
} elsif ($scope eq 'rec') { |
|
unless ($recursed{$url}) { |
|
@contents = $navmap->retrieveResources($url,sub { $_[0]->is_gradable() },1,0,1); |
|
my @subfolders = $navmap->retrieveResources($url,sub { $_[0]->is_map() },1,0,1); |
|
if (@subfolders) { |
|
map { $shownmaps{$_->src()} = 1; } @subfolders; |
|
} |
|
$recursed{$url} = 1; |
|
} |
|
} |
|
if (@contents) { |
|
map { $shownsymbs{$_->symb()} = 1; } @contents; |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
@recurseup = $navmap->recurseup_maps($map); |
|
$shownmaps{&Apache::lonnet::clutter($map)} = 1; |
|
$shownsymbs{$symb} = 1; |
|
} |
|
if (@recurseup) { |
|
map { $shownmaps{&Apache::lonnet::clutter($_)} = 1; } @recurseup; |
|
} |
|
} |
|
} |
} |
} |
my @checked_maps; |
my @checked_maps; |
my $curRes; |
my $curRes; |
Line 236 sub create_picker {
|
Line 343 sub create_picker {
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $crsprefix = &propath($cdom,$cnum).'/userfiles/'; |
my $crsprefix = &propath($cdom,$cnum).'/userfiles/'; |
|
|
my ($info,$display,$onsubmit,$togglebuttons); |
my ($info,$display,$onsubmit,$togglebuttons,$disabled,$action); |
if ($context eq 'examblock') { |
if ($context eq 'examblock') { |
my $maps_elem = 'docs_maps_'.$block; |
my $maps_elem = 'docs_maps_'.$block; |
my $res_elem = 'docs_resources_'.$block; |
my $res_elem = 'docs_resources_'.$block; |
$onsubmit = ' onsubmit="return writeToOpener('."'$maps_elem','$res_elem'".');"'; |
$onsubmit = ' onsubmit="return writeToOpener('."'$maps_elem','$res_elem'".');"'; |
$info = &mt('Items in '.lc($crstype).' for which access will be blocked.'); |
$info = &mt('Items in '.lc($crstype).' for which access will be blocked.'); |
|
if ($readonly) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
} |
} |
if ($context eq 'dumpdocs') { |
if ($context eq 'dumpdocs') { |
$info = '<span class="LC_fontsize_medium">'. |
$info = '<span class="LC_fontsize_medium">'. |
&mt('Choose the uploaded course items and templated pages/problems to be copied to Authoring space.'). |
&mt('Choose the uploaded course items and templated pages/problems to be copied to Authoring Space.'). |
'</span><br /><br />'; |
'</span><br /><br />'; |
$startcount = 3 + $numhome; |
$startcount = 3 + $numhome; |
$onsubmit = ' onsubmit="return checkUnique(document.'.$formname.',document.'.$formname.'.archive);"'; |
$onsubmit = ' onsubmit="return checkUnique(document.'.$formname.',document.'.$formname.'.'.$chkname.');"'; |
|
} elsif ($context eq 'shorturls') { |
|
$info = '<span class="LC_fontsize_medium">'. |
|
&mt('Choose the resource(s) and/or folder(s) from Main Content for which shortened URL(s) are needed.'). |
|
'</span><br /><br />'; |
} elsif ($context eq 'imsexport') { |
} elsif ($context eq 'imsexport') { |
$info = &mt('Choose which items you wish to export from your '.$crstype.'.'); |
$info = &mt('Choose which items you wish to export from your '.$crstype.'.'); |
$startcount = 5; |
$startcount = 5; |
|
} elsif ($context eq 'passback') { |
|
$action = '/adm/grades'; |
|
$info = '<p>'. |
|
&mt('Select link-protected launch item for which scores should be sent to launcher CMS, then push Next [_1].', |
|
'→'). |
|
'</p><br />'; |
|
if ($readonly) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
} |
} |
$togglebuttons = '<input type="button" value="'.&mt('check all').'" '. |
if ($disabled) { |
'onclick="javascript:checkAll(document.'.$formname.'.archive)" />'. |
$togglebuttons = '<br />'; |
' <input type="button" value="'.&mt('uncheck all').'"'. |
} elsif ($context ne 'passback') { |
' onclick="javascript:uncheckAll(document.'.$formname.'.archive)" />'; |
$togglebuttons = '<input type="button" value="'.&mt('check all').'" '. |
$display = '<form name="'.$formname.'" action="" method="post"'.$onsubmit.'>'."\n"; |
'onclick="javascript:checkAll(document.'.$formname.'.'.$chkname.')" />'. |
|
' <input type="button" value="'.&mt('uncheck all').'"'. |
|
' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />'; |
|
} |
|
$display = '<form name="'.$formname.'" action="'.$action.'" method="post"'.$onsubmit.'>'."\n"; |
if ($context eq 'imsexport') { |
if ($context eq 'imsexport') { |
$display .= $info. |
$display .= $info. |
'<div class="LC_columnSection">'."\n". |
'<div class="LC_columnSection">'."\n". |
Line 278 sub create_picker {
|
Line 405 sub create_picker {
|
'</fieldset>'; |
'</fieldset>'; |
} |
} |
$display .= '</div>'; |
$display .= '</div>'; |
} elsif ($context eq 'examblock') { |
} elsif (($context eq 'examblock') || ($context eq 'shorturls') || ($context eq 'passback')) { |
$display .= $info.$togglebuttons; |
$display .= $info.$togglebuttons; |
} elsif ($context eq 'dumpdocs') { |
} elsif ($context eq 'dumpdocs') { |
$display .= $preamble. |
$display .= $preamble. |
Line 299 sub create_picker {
|
Line 426 sub create_picker {
|
$display .= '<th>'.&mt('Access blocked?').'</th>'; |
$display .= '<th>'.&mt('Access blocked?').'</th>'; |
} elsif ($context eq 'dumpdocs') { |
} elsif ($context eq 'dumpdocs') { |
$display .= '<th>'.&mt('Copy?').'</th>'. |
$display .= '<th>'.&mt('Copy?').'</th>'. |
'<th>'.&mt("Title in $crstype"). |
'<th>'.&mt("Title in $crstype").'</th>'. |
'<th>'.&mt('Internal Identifier').'</th>'. |
'<th>'.&mt('Internal Identifier').'</th>'. |
'<th>'.&mt('Save as ...').'</th>'; |
'<th>'.&mt('Save as ...').'</th>'; |
|
} elsif ($context eq 'shorturls') { |
|
$display .= '<th colspan="2">'.&mt('Tiny URL').'</th>'. |
|
'<th>'.&mt("Title in $crstype").'</th>'; |
|
} elsif ($context eq 'passback') { |
|
$display .= '<th>'.&mt("Title in $crstype").'</th>'. |
|
'<th>'.&mt('Tiny URL Deep-link').'</th>'. |
|
'<th>'.&mt('Launcher').'</th>'. |
|
'<th style="padding-left: 6px; padding-right: 6px">'.&mt('Score Type').'</th>'. |
|
'<th style="padding-left: 6px; padding-right: 6px">'.&mt('Select').'</th>'; |
} |
} |
$display .= &Apache::loncommon::end_data_table_header_row(); |
$display .= &Apache::loncommon::end_data_table_header_row(); |
while ($curRes = $it->next()) { |
while ($curRes = $it->next()) { |
Line 327 sub create_picker {
|
Line 463 sub create_picker {
|
} |
} |
} |
} |
$count ++; |
$count ++; |
my $currelem; |
my ($currelem,$mapurl,$is_map,$showitem); |
if ($context eq 'imsexport') { |
if ($context eq 'imsexport') { |
$currelem = $count+$boards+$startcount; |
$currelem = $count+$boards+$startcount; |
} else { |
} else { |
$currelem = $count+$startcount; |
$currelem = $count+$startcount; |
} |
} |
$display .= &Apache::loncommon::start_data_table_row(). |
|
'<td>'."\n". |
|
'<input type="checkbox" name="archive" value="'.$count.'" '; |
|
if (($curRes->is_sequence()) || ($curRes->is_page())) { |
if (($curRes->is_sequence()) || ($curRes->is_page())) { |
$lastcontainer = $currelem; |
$lastcontainer = $currelem; |
$display .= 'onclick="javascript:checkFolder(document.'.$formname.','."'$currelem'".')" '; |
$mapurl = (&Apache::lonnet::decode_symb($symb))[2]; |
my $mapurl = (&Apache::lonnet::decode_symb($symb))[2]; |
$is_map = 1; |
if ($currmaps{$mapurl}) { |
} |
$display .= 'checked="checked"'; |
if ($context eq 'passback') { |
push(@checked_maps,$currelem); |
if (($curRes->is_sequence()) || ($curRes->is_page())) { |
|
next unless ($shownmaps{$curRes->src}); |
|
} else { |
|
next unless ($shownsymbs{$symb}); |
} |
} |
} else { |
} else { |
if ($curRes->is_problem()) { |
$display .= &Apache::loncommon::start_data_table_row()."\n"; |
$numprobs ++; |
} |
|
if ($context eq 'shorturls') { |
|
if ($shorturls{$symb}) { |
|
$display .= '<td> </td><td align="right"><b>'."/tiny/$cdom/$shorturls{$symb}".'</b></td>'."\n"; |
|
} else { |
|
$display .= '<td align="left"><label><input type="checkbox" name="'.$chkname.'" '. |
|
'value="'.$count.'"'.$disabled.' />'.&mt('Add').'</label></td>'. |
|
'<td> </td>'."\n"; |
} |
} |
$display .= 'onclick="javascript:checkResource(document.'.$formname.','."'$currelem'".')" '; |
} elsif ($context ne 'passback') { |
if ($currresources{$symb}) { |
$display .= '<td><input type="checkbox" name="'.$chkname.'" value="'.$count.'" '; |
$display .= 'checked="checked"'; |
if ($is_map) { |
|
$display .= 'onclick="javascript:checkFolder(document.'.$formname.','."'$currelem'".')" '; |
|
if ($currmaps{$mapurl}) { |
|
$display .= 'checked="checked"'; |
|
push(@checked_maps,$currelem); |
|
} |
|
} else { |
|
if ($curRes->is_problem()) { |
|
$numprobs ++; |
|
} |
|
$display .= 'onclick="javascript:checkResource(document.'.$formname.','."'$currelem'".')" '; |
|
if ($currresources{$symb}) { |
|
$display .= 'checked="checked"'; |
|
} |
} |
} |
|
$display .= $disabled.' />'."\n"; |
} |
} |
$display .= ' />'."\n"; |
|
if ($context eq 'dumpdocs') { |
if ($context eq 'dumpdocs') { |
$display .= '</td><td valign="top">'; |
$display .= '</td><td valign="top">'; |
|
} elsif ($context eq 'shorturls') { |
|
$display .= '<td valign="top">'; |
} |
} |
for (my $i=0; $i<$depth; $i++) { |
for (my $i=0; $i<$depth; $i++) { |
$display .= "$whitespace\n"; |
$showitem .= "$whitespace\n"; |
} |
} |
my $icon = 'src="'.$location.'/unknown.gif" alt=""'; |
my $icon = 'src="'.$location.'/unknown.gif" alt=""'; |
if ($curRes->is_sequence()) { |
if ($curRes->is_sequence()) { |
Line 372 sub create_picker {
|
Line 530 sub create_picker {
|
} elsif ($curRes->src ne '') { |
} elsif ($curRes->src ne '') { |
$icon = 'src="'.&Apache::loncommon::icon($curRes->src).'" alt=""'; |
$icon = 'src="'.&Apache::loncommon::icon($curRes->src).'" alt=""'; |
} |
} |
$display .= '<img '.$icon.' /> '."\n"; |
$showitem .= '<img '.$icon.' /> '."\n"; |
$children{$parent{$depth}} .= $currelem.':'; |
$children{$parent{$depth}} .= $currelem.':'; |
if ($context eq 'examblock') { |
if ($context eq 'examblock') { |
if ($parent{$depth} > 1) { |
if ($parent{$depth} > 1) { |
Line 383 sub create_picker {
|
Line 541 sub create_picker {
|
} |
} |
} |
} |
} |
} |
$display .= ' '.$curRes->title().$whitespace.'</td>'."\n"; |
$showitem .= ' '.$curRes->title().$whitespace; |
|
if ($context eq 'passback') { |
|
if ((exists($pb{$symb})) && (ref($pb{$symb}) eq 'HASH')) { |
|
my $numlinks = scalar(keys(%{$pb{$symb}})); |
|
my $count = 0; |
|
foreach my $launcher (sort(keys(%{$pb{$symb}}))) { |
|
if ($count == 0) { |
|
$display .= &Apache::loncommon::start_data_table_row()."\n"; |
|
if ($numlinks > 1) { |
|
$display .= '<td rowspan="'.$numlinks.'">'.$showitem.'</td>'; |
|
} else { |
|
$display .= '<td style="vertical-align: baseline">'.$showitem.'</td>'; |
|
} |
|
} else { |
|
$display .= &Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::start_data_table_row()."\n"; |
|
} |
|
my ($linkuri,$linkprotector,$scope) = split("\0",$launcher); |
|
my ($ltinum,$ltitype) = ($linkprotector =~ /^(\d+)(c|d)$/); |
|
my ($appname,$setter); |
|
if ($ltitype eq 'c') { |
|
my %lti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider'); |
|
if (ref($lti{$ltinum}) eq 'HASH') { |
|
$appname = $lti{$ltinum}{'name'}; |
|
if ($appname) { |
|
$setter = ' (defined in course)'; |
|
} |
|
} |
|
} elsif ($ltitype eq 'd') { |
|
my %lti = &Apache::lonnet::get_domain_lti($cdom,'linkprot'); |
|
if (ref($lti{$ltinum}) eq 'HASH') { |
|
$appname = $lti{$ltinum}{'name'}; |
|
if ($appname) { |
|
$setter = ' (defined in domain)'; |
|
} |
|
} |
|
} |
|
my $shownscope; |
|
if ($scope eq 'res') { |
|
$shownscope = &mt('Resource'); |
|
} elsif ($scope eq 'map') { |
|
$shownscope = &mt('Folder'); |
|
} elsif ($scope eq 'rec') { |
|
$shownscope = &mt('Folder + sub-folders'); |
|
} |
|
$display .= '<td style="vertical-align: baseline"><span style="font-weight: bold;">'.$linkuri.'</span></td>'."\n". |
|
'<td style="vertical-align: baseline; padding-left: 6px; padding-right: 6px">'.$appname.$setter.'</td>'."\n". |
|
'<td style="vertical-align: baseline"><span style="font-style: italic;">'.$shownscope.'</span></td>'."\n". |
|
'<td align="right" style="vertical-align: baseline"><input type="radio" name="'.$chkname.'" '. |
|
'value="'.&escape($launcher).'"'.$disabled.' /></td>'."\n"; |
|
$count ++; |
|
} |
|
} else { |
|
$display .= &Apache::loncommon::start_data_table_row()."\n". |
|
'<td colspan="5">'.$showitem.'</td>'; |
|
} |
|
} else { |
|
$display .= $showitem.'</td>'."\n"; |
|
} |
if ($context eq 'imsexport') { |
if ($context eq 'imsexport') { |
# Existing discussion posts? |
# Existing discussion posts? |
if ($discussiontime{$ressymb} > 0) { |
if ($discussiontime{$ressymb} > 0) { |
Line 450 sub create_picker {
|
Line 665 sub create_picker {
|
&mt('Export').'" /></p>'; |
&mt('Export').'" /></p>'; |
$numcount = $count + $boards + $startcount; |
$numcount = $count + $boards + $startcount; |
} elsif ($context eq 'examblock') { |
} elsif ($context eq 'examblock') { |
$display .= |
unless ($readonly) { |
'<p>'. |
$display .= |
'<input type="submit" name="resourceblocks" value="'. |
'<p>'. |
&mt('Copy Choices to Main Window').'" /></p>'; |
'<input type="submit" name="resourceblocks" value="'. |
|
&mt('Copy Choices to Main Window').'" /></p>'; |
|
} |
$numcount = $count + $startcount; |
$numcount = $count + $startcount; |
} elsif ($context eq 'dumpdocs') { |
} elsif ($context eq 'dumpdocs') { |
$display .= '</fieldset>'. |
$display .= '</fieldset>'. |
Line 462 sub create_picker {
|
Line 679 sub create_picker {
|
'<input type="submit" name="dumpcourse" value="'.&mt("Copy $crstype Content").'" />'. |
'<input type="submit" name="dumpcourse" value="'.&mt("Copy $crstype Content").'" />'. |
'</div>'; |
'</div>'; |
$numcount = $count + $startcount; |
$numcount = $count + $startcount; |
|
} elsif ($context eq 'shorturls') { |
|
unless ($readonly) { |
|
$display .= |
|
'<p>'. |
|
'<input type="submit" name="shorturls" value="'. |
|
&mt('Create Tiny URL(s)').'" /></p>'; |
|
} |
|
} elsif ($context eq 'passback') { |
|
unless ($readonly) { |
|
$display .= |
|
'<p>'. |
|
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($env{'form.symb'}).'" />'."\n". |
|
'<input type="hidden" name="command" value="passback" />'. |
|
'<input type="submit" name="picklauncher" value="'. |
|
&mt('Next').' →" /></p>'; |
|
} |
} |
} |
$display .= '</form>'; |
$display .= '</form>'; |
my $scripttag = |
if ($context eq 'passback') { |
|
return $display; |
|
} |
|
my $scripttag = |
&respicker_javascript($startcount,$numcount,$context,$formname,\%children, |
&respicker_javascript($startcount,$numcount,$context,$formname,\%children, |
\%hierarchy,\@checked_maps); |
\%hierarchy,\@checked_maps,$numhome,$chkname); |
if ($context eq 'dumpdocs') { |
if (($context eq 'dumpdocs') || ($context eq 'shorturls')) { |
return $scripttag.$display; |
return $scripttag.$display; |
} |
} |
my ($title,$crumbs,$args); |
my ($title,$crumbs,$args); |
Line 484 sub create_picker {
|
Line 720 sub create_picker {
|
$output .= &Apache::lonhtmlcommon::breadcrumbs('IMS Export'). |
$output .= &Apache::lonhtmlcommon::breadcrumbs('IMS Export'). |
&Apache::londocs::startContentScreen('tools'); |
&Apache::londocs::startContentScreen('tools'); |
} elsif ($context eq 'dumpdocs') { |
} elsif ($context eq 'dumpdocs') { |
$output .= &Apache::lonhtmlcommon::breadcrumbs('Copying to Authoring Space'). |
$output .= &Apache::lonhtmlcommon::breadcrumbs('Copying to Authoring Space'). |
&Apache::londocs::startContentScreen('tools'); |
&Apache::londocs::startContentScreen('tools'); |
} |
} |
$output .= $display; |
$output .= $display; |
if ($context eq 'examblock') { |
if ($context eq 'examblock') { |
Line 498 sub create_picker {
|
Line 734 sub create_picker {
|
|
|
sub respicker_javascript { |
sub respicker_javascript { |
my ($startcount,$numitems,$context,$formname,$children,$hierarchy, |
my ($startcount,$numitems,$context,$formname,$children,$hierarchy, |
$checked_maps) = @_; |
$checked_maps,$numhome,$chkname) = @_; |
return unless ((ref($children) eq 'HASH') && (ref($hierarchy) eq 'HASH') |
my $check_uncheck = <<"FIRST"; |
&& (ref($checked_maps) eq 'ARRAY')); |
|
my ($elem,$nested,$nameforelem); |
|
if ($context eq 'dumpdocs') { |
|
$elem='((parseInt(item)-'.$startcount.')*2)+'.$startcount; |
|
$nested='((parseInt(nesting[item][i])-'.$startcount.')*2)+'.$startcount; |
|
$nameforelem=$elem+1; |
|
} else { |
|
$elem='parseInt(item)'; |
|
$nested='parseInt(nesting[item][i])'; |
|
} |
|
my $scripttag = <<"START"; |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
function checkAll(field) { |
function checkAll(field) { |
if (field.length > 0) { |
if (field.length > 0) { |
for (i = 0; i < field.length; i++) { |
for (i = 0; i < field.length; i++) { |
Line 532 function uncheckAll(field) {
|
Line 755 function uncheckAll(field) {
|
field.checked = false; |
field.checked = false; |
} |
} |
} |
} |
|
FIRST |
|
if ($context eq 'shorturls') { |
|
return <<"END"; |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
$check_uncheck |
|
// ]]> |
|
</script> |
|
END |
|
} |
|
return unless ((ref($children) eq 'HASH') && (ref($hierarchy) eq 'HASH') |
|
&& (ref($checked_maps) eq 'ARRAY')); |
|
my ($elem,$nested,$nameforelem); |
|
if ($context eq 'dumpdocs') { |
|
$elem='((parseInt(item)-'.$startcount.')*2)+'.$startcount; |
|
$nested='((parseInt(nesting[item][i])-'.$startcount.')*2)+'.$startcount; |
|
$nameforelem=$elem+1; |
|
} else { |
|
$elem='parseInt(item)'; |
|
$nested='parseInt(nesting[item][i])'; |
|
} |
|
my $scripttag = <<"START"; |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
$check_uncheck |
|
|
function checkFolder(form,item) { |
function checkFolder(form,item) { |
var elem = $elem; |
var elem = $elem; |
Line 549 function checkResource(form,item) {
|
Line 797 function checkResource(form,item) {
|
} |
} |
} |
} |
|
|
numitems = $numitems; |
numitems = $startcount + $numitems; |
var parents = new Array(numitems); |
var parents = new Array(numitems); |
var nesting = new Array(numitems); |
var nesting = new Array(numitems); |
var initial = new Array(); |
var initial = new Array(); |
Line 591 EXTRA
|
Line 839 EXTRA
|
} elsif ($context eq 'dumpdocs') { |
} elsif ($context eq 'dumpdocs') { |
my $blankmsg = &mt('An item selected has no filename set in the "Save as ..." column.'); |
my $blankmsg = &mt('An item selected has no filename set in the "Save as ..." column.'); |
my $dupmsg = &mt('Items selected for copying need unique filenames in the "Save as ..." column.'); |
my $dupmsg = &mt('Items selected for copying need unique filenames in the "Save as ..." column.'); |
|
my $homemsg = &mt('An Authoring Space needs to be selected.'); |
|
&js_escape(\$blankmsg); |
|
&js_escape(\$dupmsg); |
|
&js_escape(\$homemsg); |
$scripttag .= <<"EXTRA"; |
$scripttag .= <<"EXTRA"; |
|
|
function checkUnique(form,field) { |
function checkUnique(form,field) { |
var duplicate = 0; |
var duplicate = 0; |
var blank = 0; |
var blank = 0; |
|
var numhome = '$numhome'; |
if (field.length > 0) { |
if (field.length > 0) { |
for (i=0; i<field.length; i++) { |
for (i=0; i<field.length; i++) { |
if (field[i].checked) { |
if (field[i].checked) { |
Line 635 function checkUnique(form,field) {
|
Line 888 function checkUnique(form,field) {
|
alert('$dupmsg'); |
alert('$dupmsg'); |
return false; |
return false; |
} |
} |
|
if (numhome > 1) { |
|
if (!form.authorspace.options[form.authorspace.selectedIndex].value) { |
|
alert('$homemsg'); |
|
return false; |
|
} |
|
} |
return true; |
return true; |
} |
} |
|
|
Line 674 END
|
Line 933 END
|
function writeToOpener(maps,resources) { |
function writeToOpener(maps,resources) { |
var checkedmaps = ''; |
var checkedmaps = ''; |
var checkedresources = ''; |
var checkedresources = ''; |
for (var i=0; i<document.$formname.archive.length; i++) { |
for (var i=0; i<document.$formname.${chkname}.length; i++) { |
if (document.$formname.archive[i].checked) { |
if (document.$formname.${chkname}[i].checked) { |
var isResource = 1; |
var isResource = 1; |
var include = 1; |
var include = 1; |
var elemnum = i+1+$startcount; |
var elemnum = i+1+$startcount; |
Line 685 function writeToOpener(maps,resources) {
|
Line 944 function writeToOpener(maps,resources) {
|
} |
} |
} |
} |
if (isResource == 1) { |
if (isResource == 1) { |
if (nesting[elemnum].length > 0) { |
if (nesting[elemnum] != null) { |
var lastelem = nesting[elemnum].length-1; |
if (nesting[elemnum].length > 0) { |
if (document.$formname.elements[nesting[elemnum][lastelem]].checked) { |
var lastelem = nesting[elemnum].length-1; |
include = 0; |
if (document.$formname.elements[nesting[elemnum][lastelem]].checked) { |
|
include = 0; |
|
} |
} |
} |
} |
} |
} |
} |
if (include == 1) { |
if (include == 1) { |
if (isResource == 1) { |
if (isResource == 1) { |
checkedresources += document.$formname.archive[i].value+','; |
checkedresources += document.$formname.${chkname}[i].value+','; |
} else { |
} else { |
checkedmaps += document.$formname.archive[i].value+','; |
checkedmaps += document.$formname.${chkname}[i].value+','; |
} |
} |
} |
} |
} |
} |
Line 730 sub get_navmap_object {
|
Line 991 sub get_navmap_object {
|
undef,{'only_body' => 1,}). |
undef,{'only_body' => 1,}). |
'<h2>'.&mt('Resource Display Failed').'</h2>'; |
'<h2>'.&mt('Resource Display Failed').'</h2>'; |
} elsif ($context eq 'dumpdocs') { |
} elsif ($context eq 'dumpdocs') { |
$outcome = '<h2>'.&mt('Copying to Authoring Space unavilable'); |
$outcome = '<h2>'.&mt('Copying to Authoring Space unavailable').'</h2>'; |
|
} elsif ($context eq 'shorturls') { |
|
$outcome = '<h2>'.&mt('Display/Setting of shortened URLs unavailable').'</h2>'; |
} |
} |
$outcome .= '<div class="LC_error">'; |
$outcome .= '<div class="LC_error">'; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
Line 739 sub get_navmap_object {
|
Line 1002 sub get_navmap_object {
|
$outcome .= &mt('Unable to retrieve information about course contents'); |
$outcome .= &mt('Unable to retrieve information about course contents'); |
} |
} |
$outcome .= '</div>'; |
$outcome .= '</div>'; |
if (($context eq 'imsexport') || ($context eq 'dumpdocs')) { |
if (($context eq 'imsexport') || ($context eq 'dumpdocs') || ($context eq 'shorturls') ) { |
$outcome .= '<a href="/adm/coursedocs">'; |
$outcome .= '<a href="/adm/coursedocs">'; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$outcome .= &mt('Return to Community Editor'); |
$outcome .= &mt('Return to Community Editor'); |
Line 749 sub get_navmap_object {
|
Line 1012 sub get_navmap_object {
|
$outcome .= '</a>'; |
$outcome .= '</a>'; |
if ($context eq 'imsexport') { |
if ($context eq 'imsexport') { |
&Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); |
&Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); |
} else { |
} elsif ($context eq 'dumpdocs') { |
&Apache::lonnet::logthis('Copying to Authoring Space failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); |
&Apache::lonnet::logthis('Copying to Authoring Space failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); |
|
} elsif ($context eq 'shorturls') { |
|
&Apache::lonnet::logthis('Displaying and/or saving URL shortcuts failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); |
} |
} |
} elsif ($context eq 'examblock') { |
} elsif ($context eq 'examblock') { |
$outcome .= '<href="javascript:window.close();">'.&mt('Close window').'</a>'; |
$outcome .= '<href="javascript:window.close();">'.&mt('Close window').'</a>'; |
Line 789 sub enumerate_course_contents {
|
Line 1054 sub enumerate_course_contents {
|
} |
} |
} |
} |
$count ++; |
$count ++; |
if (($curRes->is_sequence()) || ($curRes->is_page())) { |
if ($context eq 'shorturls') { |
$map_url->{$count} = (&Apache::lonnet::decode_symb($symb))[2]; |
|
} else { |
|
$resource_symb->{$count} = $ressymb; |
$resource_symb->{$count} = $ressymb; |
|
} else { |
|
if (($curRes->is_sequence()) || ($curRes->is_page())) { |
|
$map_url->{$count} = (&Apache::lonnet::decode_symb($symb))[2]; |
|
} else { |
|
$resource_symb->{$count} = $ressymb; |
|
} |
} |
} |
$titleref->{$count} = $curRes->title(); |
$titleref->{$count} = $curRes->title(); |
} |
} |