--- loncom/interface/loncourserespicker.pm 2016/10/16 21:49:51 1.14 +++ loncom/interface/loncourserespicker.pm 2024/11/22 22:42:27 1.17 @@ -1,6 +1,6 @@ # The LearningOnline Network # -# $Id: loncourserespicker.pm,v 1.14 2016/10/16 21:49:51 raeburn Exp $ +# $Id: loncourserespicker.pm,v 1.17 2024/11/22 22:42:27 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,8 +37,9 @@ loncourserespicker provides an interface resources are to be either: (a) exported to an IMS Content Package -(b) subject to access blocking for the duriation of an exam/quiz. +(b) subject to access blocking for the duration of an exam/quiz. (c) dumped to an Authoring Space +(d) receive shortened URLs to be used when deep-linking into a course =head1 DESCRIPTION @@ -62,9 +63,10 @@ a higher level to become unchecked. There is a submit button, which will be named differently according to the context in which resource/folder selection is being made. -The three contexts currently supported are: IMS export, selection of +The four contexts currently supported are: IMS export, selection of 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, and +display or creation of shortened URLs for deep-linking, =head1 INTERNAL SUBROUTINES @@ -80,7 +82,8 @@ Inputs: 11. (encapsulates information about resources in the course). - $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 used to select course items was launched. @@ -106,10 +109,13 @@ Inputs: 11. - $uploadedfiles -- Reference to hash: keys are paths to files in /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. + - $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. + is for an exam block or for shortened URL creation. Output: $output is the HTML mark-up for display/selection of content @@ -127,7 +133,7 @@ Inputs: 7. - $numcount -- Total numer of folders and resources in course. - $context -- Context in which resources are being displayed - (imsexport, examblock or dumpdocs). + (imsexport, examblock, dumpdocs or shorturls). - $formname -- Name of form. @@ -148,7 +154,7 @@ no object instantiated. Inputs: 2. - $crstype -- Container type: Course or Community - - $context -- Context: imsexport, examblock or dumpdocs + - $context -- Context: imsexport, examblock, dumpdocs, or shorturls =item &clean() @@ -167,6 +173,7 @@ a Course Coordinator. Used to generate n (a) storage of lists of maps or resources to be blocked during an exam, (b) processing selected form element during dumping of selected course content to Authoring Space. +(c) Inputs: 7 @@ -180,7 +187,7 @@ Inputs: 7 $title_ref - reference to hash containing titles for items in course - $context - examblock or dumpdocs + $context - examblock, dumpdocs or shorturls $cdom - course's domain @@ -211,9 +218,14 @@ use LONCAPA qw(:DEFAULT :match); sub create_picker { my ($navmap,$context,$formname,$crstype,$blockedmaps,$blockedresources,$block,$preamble, - $numhome,$uploadedfiles,$readonly) = @_; + $numhome,$uploadedfiles,$tiny,$readonly) = @_; return unless (ref($navmap)); - my ($it,$output,$numdisc,%maps,%resources,%discussiontime,%currmaps,%currresources,%files); + my ($it,$output,$numdisc,%discussiontime,%currmaps,%currresources,%files, + %shorturls,$chkname); + $chkname = 'archive'; + if ($context eq 'shorturls') { + $chkname = 'addtiny'; + } $it = $navmap->getIterator(undef,undef,undef,1,undef,undef); if (ref($blockedmaps) eq 'HASH') { %currmaps = %{$blockedmaps}; @@ -222,6 +234,8 @@ sub create_picker { %currresources = %{$blockedresources}; } elsif (ref($uploadedfiles) eq 'HASH') { %files = %{$uploadedfiles}; + } elsif (ref($tiny) eq 'HASH') { + %shorturls = %{$tiny}; } my @checked_maps; my $curRes; @@ -256,7 +270,11 @@ sub create_picker { &mt('Choose the uploaded course items and templated pages/problems to be copied to Authoring Space.'). '

'; $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 = ''. + &mt('Choose the resource(s) and/or folder(s) from Main Content for which shortened URL(s) are needed.'). + '

'; } elsif ($context eq 'imsexport') { $info = &mt('Choose which items you wish to export from your '.$crstype.'.'); $startcount = 5; @@ -265,9 +283,9 @@ sub create_picker { $togglebuttons = '
'; } else { $togglebuttons = ''. + 'onclick="javascript:checkAll(document.'.$formname.'.'.$chkname.')" />'. '  '; + ' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />'; } $display = '
'."\n"; if ($context eq 'imsexport') { @@ -290,7 +308,7 @@ sub create_picker { ''; } $display .= ''; - } elsif ($context eq 'examblock') { + } elsif (($context eq 'examblock') || ($context eq 'shorturls')) { $display .= $info.$togglebuttons; } elsif ($context eq 'dumpdocs') { $display .= $preamble. @@ -311,9 +329,12 @@ sub create_picker { $display .= ''.&mt('Access blocked?').''; } elsif ($context eq 'dumpdocs') { $display .= ''.&mt('Copy?').''. - ''.&mt("Title in $crstype"). + ''.&mt("Title in $crstype").''. ''.&mt('Internal Identifier').''. ''.&mt('Save as ...').''; + } elsif ($context eq 'shorturls') { + $display .= ''.&mt('Tiny URL').''. + ''.&mt("Title in $crstype").''; } $display .= &Apache::loncommon::end_data_table_header_row(); while ($curRes = $it->next()) { @@ -339,35 +360,49 @@ sub create_picker { } } $count ++; - my $currelem; + my ($currelem,$mapurl,$is_map); if ($context eq 'imsexport') { $currelem = $count+$boards+$startcount; } else { $currelem = $count+$startcount; } - $display .= &Apache::loncommon::start_data_table_row(). - ''."\n". - 'is_sequence()) || ($curRes->is_page())) { $lastcontainer = $currelem; - $display .= 'onclick="javascript:checkFolder(document.'.$formname.','."'$currelem'".')" '; - my $mapurl = (&Apache::lonnet::decode_symb($symb))[2]; - if ($currmaps{$mapurl}) { - $display .= 'checked="checked"'; - push(@checked_maps,$currelem); + $mapurl = (&Apache::lonnet::decode_symb($symb))[2]; + $is_map = 1; + } + if ($context eq 'shorturls') { + if ($shorturls{$symb}) { + $display .= ' '."/tiny/$cdom/$shorturls{$symb}".''."\n"; + } else { + $display .= ''. + ' '."\n"; } } else { - if ($curRes->is_problem()) { - $numprobs ++; - } - $display .= 'onclick="javascript:checkResource(document.'.$formname.','."'$currelem'".')" '; - if ($currresources{$symb}) { - $display .= 'checked="checked"'; + $display .= 'is_problem()) { + $numprobs ++; + } + $display .= 'onclick="javascript:checkResource(document.'.$formname.','."'$currelem'".')" '; + if ($currresources{$symb}) { + $display .= 'checked="checked"'; + } } + $display .= $disabled.' />'."\n"; } - $display .= $disabled.' />'."\n"; if ($context eq 'dumpdocs') { $display .= ''; + } elsif ($context eq 'shorturls') { + $display .= ''; } for (my $i=0; $i<$depth; $i++) { $display .= "$whitespace\n"; @@ -476,12 +511,19 @@ sub create_picker { ''. ''; $numcount = $count + $startcount; + } elsif ($context eq 'shorturls') { + unless ($readonly) { + $display .= + '

'. + '

'; + } } $display .= '
'; - my $scripttag = + my $scripttag = &respicker_javascript($startcount,$numcount,$context,$formname,\%children, - \%hierarchy,\@checked_maps,$numhome); - if ($context eq 'dumpdocs') { + \%hierarchy,\@checked_maps,$numhome,$chkname); + if (($context eq 'dumpdocs') || ($context eq 'shorturls')) { return $scripttag.$display; } my ($title,$crumbs,$args); @@ -498,8 +540,8 @@ sub create_picker { $output .= &Apache::lonhtmlcommon::breadcrumbs('IMS Export'). &Apache::londocs::startContentScreen('tools'); } elsif ($context eq 'dumpdocs') { - $output .= &Apache::lonhtmlcommon::breadcrumbs('Copying to Authoring Space'). - &Apache::londocs::startContentScreen('tools'); + $output .= &Apache::lonhtmlcommon::breadcrumbs('Copying to Authoring Space'). + &Apache::londocs::startContentScreen('tools'); } $output .= $display; if ($context eq 'examblock') { @@ -512,21 +554,8 @@ sub create_picker { sub respicker_javascript { my ($startcount,$numitems,$context,$formname,$children,$hierarchy, - $checked_maps,$numhome) = @_; - 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"; - +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"; +