--- loncom/interface/londocs.pm 2013/03/17 18:46:21 1.484.2.27 +++ loncom/interface/londocs.pm 2013/03/17 14:27:34 1.537 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.484.2.27 2013/03/17 18:46:21 raeburn Exp $ +# $Id: londocs.pm,v 1.537 2013/03/17 14:27:34 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -353,7 +353,7 @@ $initialtext END $env{'form.output'}=$newhtml; - my $result = + my $result = &Apache::lonnet::finishuserfileupload($coursenum,$coursedom, 'output', "$filepath/$residx/$fname.html"); @@ -377,7 +377,7 @@ END removefrommap => \%removefrommap, removeparam => \%removeparam, ); - my ($result,$msgsarray,$lockerror) = + my ($result,$msgsarray,$lockerror) = &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated); if (keys(%import_errors) > 0) { $fixuperrors = @@ -804,7 +804,7 @@ sub print_paste_buffer { $r->print('
'.$buffer); if ((!$areachange) && (!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) { - if (($is_uploaded_map) || + if (($is_uploaded_map) || ($env{'docs.markedcopy_url'} =~ /(bulletinboard|smppg)$/) || ($env{'docs.markedcopy_url'} =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) { my ($copytext,$movetext); @@ -1049,7 +1049,7 @@ sub do_paste_from_buffer { &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum, $srcdom,$srcnum,$allmaps,\%rewrites, \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves, - \%mapchanges,\%tomove,\%newsubdir,\%newurls); + \%mapchanges,\%tomove,\%newsubdir,\%newurls); } } elsif ($url=~m {^/res/}) { # published maps can only exists once, so remove it from paste buffer when done @@ -1085,9 +1085,9 @@ sub do_paste_from_buffer { $msg = &mt('Paste failed: An error occurred when copying the bulletin board.').' '.$errtext; } return ($result,undef,[$msg],$lockerr{$prefix}); - } + } if ($lockerr{$prefix}) { - $lockerrors = $lockerr{$prefix}; + $lockerrors = $lockerr{$prefix}; } } } @@ -1116,7 +1116,7 @@ sub do_paste_from_buffer { if ($newdocsdir eq '') { $newdocsdir = 'default'; } - if (($prefixchg) || + if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($env{'form.docs.markedcopy_options'} ne 'move')) { my $newpath = "$newprefix/$newdocsdir/$newidx/$rem"; @@ -1194,7 +1194,7 @@ sub do_paste_from_buffer { $save_err = $errtext; } } - + if ($env{'form.docs.markedcopy_options'} eq 'move') { &Apache::lonnet::delenv('docs.markedcopy'); &Apache::lonnet::delenv('docs.markedcopy_nested'); @@ -1270,7 +1270,7 @@ sub dbcopy { if (ref($dbref) eq 'HASH') { if ($url =~ m{/(smppg|bulletinboard)$}) { my $prefix = $1; - if (($dbref->{'cdom'} =~ /^$match_domain$/) && + if (($dbref->{'cdom'} =~ /^$match_domain$/) && ($dbref->{'cnum'} =~ /^$match_courseid$/)) { my $db_name; my $marker = (split(m{/},$url))[4]; @@ -1305,12 +1305,12 @@ sub dbcopy { my $photo = $contents{'uploaded.photourl'}; my ($subdir,$fname) = ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$}); - my $newphoto; + my $newphoto; if ($fname ne '') { my $content = &Apache::lonnet::getfile($photo); unless ($content eq '-1') { $env{'form.'.$suffix.'.photourl'} = $content; - $newphoto = + $newphoto = &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname"); delete($env{'form.'.$suffix.'.photourl'}); } @@ -1327,11 +1327,11 @@ sub dbcopy { } } if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) { - $lockerrorsref->{$prefix} = + $lockerrorsref->{$prefix} = '
'. &mt('There was a problem removing a lockfile.'); if ($prefix eq 'smppg') { - $lockerrorsref->{$prefix} .= + $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional simple pages in this course.'); } else { $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional bulletin boards in this course.'); @@ -1505,7 +1505,7 @@ sub url_paste_fixups { } } } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/.+$}) { - next if ($skip); + next if ($skip); my $srcdom = $1; my $srcnum = $2; if (($srcdom ne $cdom) || ($srcnum ne $cnum)) { @@ -1889,23 +1889,93 @@ my %parameter_type = ( 'randompick' my $valid_parameters_re = join('|',keys(%parameter_type)); # set parameters sub update_parameter { - - return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/); - - my $which = $env{'form.changeparms'}; - my $idx = $env{'form.setparms'}; - if ($env{'form.'.$which.'_'.$idx}) { - my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx} - : 'yes'; - &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value, - $parameter_type{$which}); - &remember_parms($idx,$which,'set',$value); + if ($env{'form.changeparms'} eq 'all') { + my (@allidx,@allmapidx,%allchecked,%currchecked); + %allchecked = ( + 'hiddenresource' => {}, + 'encrypturl' => {}, + 'randompick' => {}, + 'randomorder' => {}, + ); + foreach my $which (keys(%allchecked)) { + $env{'form.all'.$which} =~ s/,$//; + if ($which eq 'randompick') { + foreach my $item (split(/,/,$env{'form.all'.$which})) { + my ($res,$value) = split(/:/,$item); + if ($value =~ /^\d+$/) { + $allchecked{$which}{$res} = $value; + } + } + } else { + map { $allchecked{$which}{$_} = 1; } split(/,/,$env{'form.all'.$which}); + } + } + my $haschanges = 0; + foreach my $res (@LONCAPA::map::order) { + my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); + $name=&LONCAPA::map::qtescape($name); + $url=&LONCAPA::map::qtescape($url); + next unless ($name && $url); + my $is_map; + if ($url =~ m{/uploaded/.+\.(page|sequence)$}) { + $is_map = 1; + } + foreach my $which (keys(%allchecked)) { + if (($which eq 'randompick' || $which eq 'randomorder')) { + next if (!$is_map); + } + my $oldvalue = 0; + my $newvalue = 0; + if ($allchecked{$which}{$res}) { + $newvalue = $allchecked{$which}{$res}; + } + my $current = (&LONCAPA::map::getparameter($res,'parameter_'.$which))[0]; + if ($which eq 'randompick') { + if ($current =~ /^(\d+)$/) { + $oldvalue = $1; + } + } else { + if ($current =~ /^yes$/i) { + $oldvalue = 1; + } + } + if ($oldvalue ne $newvalue) { + $haschanges = 1; + if ($newvalue) { + my $storeval = 'yes'; + if ($which eq 'randompick') { + $storeval = $newvalue; + } + &LONCAPA::map::storeparameter($res,'parameter_'.$which, + $storeval, + $parameter_type{$which}); + &remember_parms($res,$which,'set',$storeval); + } elsif ($oldvalue) { + &LONCAPA::map::delparameter($res,'parameter_'.$which); + &remember_parms($res,$which,'del'); + } + } + } + } + return $haschanges; } else { - &LONCAPA::map::delparameter($idx,'parameter_'.$which); + return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/); + + my $which = $env{'form.changeparms'}; + my $idx = $env{'form.setparms'}; + if ($env{'form.'.$which.'_'.$idx}) { + my $value = ($which eq 'randompick') ? $env{'form.rpicknum_'.$idx} + : 'yes'; + &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value, + $parameter_type{$which}); + &remember_parms($idx,$which,'set',$value); + } else { + &LONCAPA::map::delparameter($idx,'parameter_'.$which); - &remember_parms($idx,$which,'del'); + &remember_parms($idx,$which,'del'); + } + return 1; } - return 1; } @@ -2017,7 +2087,7 @@ sub editor { \%paste_errors); if (ref($pastemsgarray) eq 'ARRAY') { if (@{$pastemsgarray} > 0) { - + $r->print('

'. join('
',@{$pastemsgarray}). '

'); @@ -2063,7 +2133,7 @@ sub editor { my ($name,$url,$residx)= map { &unescape($_); } split(/\=/,$item); if ($url =~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) { - my ($suffix,$errortxt,$locknotfreed) = + my ($suffix,$errortxt,$locknotfreed) = &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2); if ($locknotfreed) { $r->print($locknotfreed); @@ -2167,7 +2237,7 @@ sub editor { $r->print('
'); } - my ($to_show,$output); + my ($to_show,$output,@allidx,@allmapidx); &Apache::loncommon::start_data_table_count(); #setup a row counter foreach my $res (@LONCAPA::map::order) { @@ -2176,6 +2246,10 @@ sub editor { $url=&LONCAPA::map::qtescape($url); unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $idx++; next; } + push(@allidx,$res); + if ($url =~ m{/uploaded/.+\.(page|sequence)$}) { + push(@allmapidx,$res); + } $output .= &entryline($idx,$name,$url,$folder,$allowed,$res, $coursenum,$coursedom,$crstype, $pathitem,$supplementalflag,$container); @@ -2206,8 +2280,48 @@ sub editor { if ($folder !~ /^supplemental/) { $to_show .= ''.&mt('Settings').''; } - $to_show .= &Apache::loncommon::end_data_table_header_row() - .$output.' ' + $to_show .= &Apache::loncommon::end_data_table_header_row(); + if ($folder !~ /^supplemental/) { + my $idxlist = join(',',@allidx); + my $mapidxlist = join(',',@allmapidx); + if (@allidx > 0) { + my $path; + if ($env{'form.folderpath'}) { + $path = + &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + } + $to_show .= + &Apache::loncommon::continue_data_table_row(). + ' '. + ''. + ''. + ''.&mt('Select:').' '. + ''.(' 'x2).'
'. + ''. + + ''. + &Apache::loncommon::end_data_table_row(); + } + } + $to_show .= $output.' ' .&Apache::loncommon::end_data_table() .'
' .&Apache::loncommon::end_scrollbox(); @@ -2432,12 +2546,7 @@ sub entryline { my $line=&Apache::loncommon::start_data_table_row(); my ($form_start,$form_end,$form_common); # Edit commands - my ($type, $esc_path, $path, $symb); - if ($container eq 'page') { - $type = 'page'; - } else { - $type = 'folder'; - } + my ($esc_path, $path, $symb); if ($env{'form.folderpath'}) { $esc_path=&escape($env{'form.folderpath'}); $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); @@ -2605,8 +2714,8 @@ ENDREN
'; $form_common=(< - + + END @@ -2614,12 +2723,12 @@ END $line.=(<
- + $lt{'up'}
- + $lt{'dw'}
@@ -2723,21 +2832,24 @@ END if ($rpicknum) { $rpckchk = ' checked="checked"'; } - my $formname = 'edit_rpick_'.$orderidx; + my $formname = 'edit_randompick_'.$orderidx; $rand_pick_text = ''."\n". $form_common."\n". -''; +''; if ($rpicknum ne '') { $rand_pick_text .= ': '.$rpicknum.''; } - $rand_pick_text .= ''; + $rand_pick_text .= ''. + $form_end; my $ro_set= ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':''); + my $formname = 'edit_rorder_'.$orderidx; $rand_order_text = -$form_start. -$form_common.' -'; +'
'."\n". +$form_common."\n". +''. +$form_end; } } elsif ($supplementalflag && !$allowed) { $url .= ($url =~ /\?/) ? '&':'?'; @@ -2811,16 +2923,18 @@ $form_common.' ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':''); my $hidtext= ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':''); + my $formhidden = 'edit_hiddenresource_'.$orderidx; + my $formurlhidden = 'edit_encrypturl_'.$orderidx; $line.=(< - $form_start + $form_common - + $form_end
- $form_start + $form_common - + $form_end $rand_pick_text
@@ -2862,7 +2976,7 @@ sub new_timebased_suffix { } } if ($freedlock ne 'ok') { - $locknotfreed = + $locknotfreed = '
'. &mt('There was a problem removing a lockfile.').' '; if ($type eq 'map') { @@ -3417,6 +3531,7 @@ sub startContentScreen { if (($mode eq 'navmaps') || ($mode eq 'supplemental')) { $output .= '    '.&mt('Content Overview').'    '."\n"; $output .= '     '.&mt('Content Search').'     '."\n"; + $output .= '      '.&mt('Content Index').'      '."\n"; $output .= '
  • '.&mt('Supplemental Content').'
  • '; } else { $output .= '
  •       '.&mt('Content Editor').'      
  • '."\n"; @@ -3483,7 +3598,7 @@ sub handler { $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching'); $help{'Course Roster'} = &Apache::loncommon::help_open_topic('Docs_Course_Roster'); $help{'Web Page'} = &Apache::loncommon::help_open_topic('Docs_Web_Page'); - + my $allowed; # URI is /adm/supplemental when viewing supplemental docs in non-edit mode. unless ($r->uri eq '/adm/supplemental') { @@ -3817,7 +3932,7 @@ sub handler { 'navc' => 'Table of Contents', 'sipa' => 'Simple Course Page', 'sipr' => 'Simple Problem', - 'webp' => 'Blank Web Page (editable)', + 'webp' => 'Blank Web Page (editable)', 'drbx' => 'Drop Box', 'scuf' => 'External Scores (handgrade, upload, clicker)', 'bull' => 'Discussion Board', @@ -4100,7 +4215,7 @@ NROSTFORM $help{'Web Page'} NWEBFORM - + my $specialdocumentsform; my @specialdocumentsforma; @@ -4690,7 +4805,7 @@ sub editing_js { p_msb => 'Title for the Problem', p_mdb => 'Title for the Drop Box', p_mbb => 'Title for the Discussion Board', - p_mwp => 'Title for Web Page', + p_mwp => 'Title for Web Page', p_mab => "Enter user:domain for User's Personal Information Page", p_mab2 => 'Personal Information Page of ', p_mab_alrt1 => 'Not a valid user:domain', @@ -4792,7 +4907,7 @@ function makewebpage(type) { formname = this.document.forms.newwebpage; } if (title) { - var webpage = formname.importdetail.value; + var webpage = formname.importdetail.value; formname.importdetail.value = escape(title)+'='+webpage; formname.submit(); } @@ -4926,36 +5041,156 @@ this.document.forms.renameform.submit(); } function updatePick(targetform,index,caller) { - var pickitem = document.getElementById('rpick_'+index); - var picknumitem = document.getElementById('rpicknum_'+index); + var pickitem; + var picknumitem; + var picknumtext; + if (index == 'all') { + pickitem = document.getElementById('randompickall'); + picknumitem = document.getElementById('rpicknumall'); + picknumtext = document.getElementById('rpicktextall'); + } else { + pickitem = document.getElementById('randompick_'+index); + picknumitem = document.getElementById('rpicknum_'+index); + picknumtext = document.getElementById('randompicknum_'+index); + } if (pickitem.checked) { var picknum=prompt('$lt{"rpck"}',picknumitem.value); if (picknum == '' || picknum == null) { if (caller == 'check') { pickitem.checked=false; - return; + if (index == 'all') { + picknumtext.innerHTML = ''; + if (caller == 'link') { + propagateState(targetform,'rpicknum'); + } + } else { + checkForSubmit(targetform,'randompick'); + } } } else { picknum.toString(); var regexdigit=/^\\d+\$/; if (regexdigit.test(picknum)) { picknumitem.value = picknum; - targetform.changeparms.value='randompick'; - targetform.submit(); + if (index == 'all') { + picknumtext.innerHTML = ' '+picknum+''; + if (caller == 'link') { + propagateState(targetform,'rpicknum'); + } + } else { + picknumtext.innerHTML = ' '+picknum+''; + checkForSubmit(targetform,'randompick'); + } } else { if (caller == 'check') { - pickitem.checked=false; + if (index == 'all') { + picknumtext.innerHTML = ''; + if (caller == 'link') { + propagateState(targetform,'rpicknum'); + } + } else { + pickitem.checked=false; + checkForSubmit(targetform,'randompick'); + } } return; } } } else { - picknumitem.value = 0; - targetform.changeparms.value='randompick'; - targetform.submit(); + picknumitem.value = ''; + picknumtext.innerHTML = ''; + if (index == 'all') { + if (caller == 'link') { + propagateState(targetform,'rpicknum'); + } + } else { + checkForSubmit(targetform,'randompick'); + } } } +function propagateState(form,param) { + if (document.getElementById(param+'all')) { + var setcheck = 0; + var rpick = 0; + if (param == 'rpicknum') { + if (document.getElementById('randompickall')) { + if (document.getElementById('randompickall').checked) { + if (document.getElementById('rpicknumall')) { + rpick = document.getElementById('rpicknumall').value; + } + } + } + } else { + if (document.getElementById(param+'all').checked) { + setcheck = 1; + } + } + if ((param == 'encrypturl') || (param == 'hiddenresource')) { + var allidxlist = form.allidx.value; + if (allidxlist != '') { + var allidxs = allidxlist.split(','); + if (allidxs.length > 1) { + for (var i=0; i 1) { + for (var i=0; i 0) { + document.getElementById('randompicknum_'+allmapidxs[i]).innerHTML = ': '+rpick+''; + } else { + document.getElementById('randompicknum_'+allmapidxs[i]).innerHTML = ''; + } + } + } + } else { + if (setcheck == 1) { + document.getElementById(param+'_'+allmapidxs[i]).checked = true; + } else { + document.getElementById(param+'_'+allmapidxs[i]).checked = false; + } + } + } + } + } + } + } + } + return; +} + +function checkForSubmit(targetform,param) { + if (document.togglemultchecks.showmultpick.length) { + for (var i=0; i 1) { + for (var i=0; i