--- loncom/interface/courseprefs.pm 2022/07/08 16:00:22 1.49.2.28.2.11 +++ loncom/interface/courseprefs.pm 2022/08/29 16:02:09 1.49.2.28.2.12 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.49.2.28.2.11 2022/07/08 16:00:22 raeburn Exp $ +# $Id: courseprefs.pm,v 1.49.2.28.2.12 2022/08/29 16:02:09 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -489,7 +489,8 @@ sub handler { help => 'Course_Prefs_Display', ordered => ['default_xml_style','pageseparators', 'disable_receipt_display','texengine', - 'tthoptions','uselcmath','usejsme','inline_chem'], + 'tthoptions','uselcmath','usejsme', + 'inline_chem','extresource'], itemtext => { default_xml_style => 'Default XML style file', pageseparators => 'Visibly Separate Items on Pages', @@ -499,6 +500,7 @@ sub handler { uselcmath => 'Student formula entry uses inline preview, not DragMath pop-up', usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)', inline_chem => 'Chemical reaction response uses inline preview, not pop-up', + extresource => 'Display of external resources', }, }, 'grading' => @@ -1413,10 +1415,36 @@ sub process_changes { $settings =~ s/,$//; } $newvalues{$entry} = $settings; + } elsif ($entry eq 'extresource') { + if ($env{'form.'.$entry} =~ /^iframe|tab|window$/) { + $newvalues{$entry} = $env{'form.'.$entry}; + if ($env{'form.'.$entry} ne 'iframe') { + if ($env{'form.extwintabreuse'}) { + $newvalues{$entry} .= ':1'; + } else { + $newvalues{$entry} .= ':0'; + } + if ($env{'form.'.$entry} eq 'window') { + foreach my $dim ('width','height') { + $env{'form.extreswin'.$dim} =~ s/^\s+|\s+$//g; + if ($env{'form.extreswin'.$dim} =~ /^\d+$/) { + $newvalues{$entry} .= ':'.$env{'form.extreswin'.$dim}; + } else { + $newvalues{$entry} .= ':'; + } + } + } + } + } + unless (($newvalues{$entry} eq 'iframe') && ($values->{$entry} eq '')) { + if ($newvalues{$entry} ne $values->{$entry}) { + $changes->{$entry} = $newvalues{$entry}; + } + } } else { $newvalues{$entry} = $env{'form.'.$entry}; } - unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts')) { + unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts') || ($entry eq 'extresource')) { if ($newvalues{$entry} ne $values->{$entry}) { $changes->{$entry} = $newvalues{$entry}; } @@ -1852,7 +1880,7 @@ sub store_changes { my ($displayname,$text); $text = $prefs->{$item}->{'itemtext'}{$key}; my $displayval; - unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts')) { + unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts') || ($key eq 'extresource')) { $displayval = $changes->{$item}{$key}; } if ($item eq 'feedback') { @@ -1961,6 +1989,37 @@ sub store_changes { } elsif ($changes->{$item}{$key} eq '0') { $displayval = &mt('No'); } + } elsif ($key eq 'extresource') { + if ($changes->{$item}{$key} eq 'iframe') { + $displayval = &mt('In iframe'); + } else { + my ($selected,$reuse,$width,$height) = split(/:/,$changes->{$item}{$key}); + if ($selected eq 'tab') { + if ($reuse) { + $displayval = &mt('[_1]In tab[_2],[_3] and tab re-used for different external resources in course', + "'","'",'
'); + } else { + $displayval = &mt('[_1]In tab[_2],[_3] with new tab for each external resource in course', + "'","'",'
'); + } + } elsif ($selected eq 'window') { + if ($reuse) { + $displayval = &mt('[_1]In pop-up window[_2],[_3] and window re-used for different external resources in course', + "'","'",'
'); + } else { + $displayval = &mt('[_1]In pop-up window[_2],[_3] with new window for each external resource in course', + "'","'",'
'); + } + if (($width ne '') || ($height ne '')) { + if ($width ne '') { + $displayval .= '
'.&mt('Window width: [_1]px',$width); + } + if ($height ne '') { + $displayval .= '
'.&mt('Window height: [_1]px',$height); + } + } + } + } } if ($key eq 'co-owners') { if (ref($changes->{$item}{$key}) eq 'HASH') { @@ -2019,9 +2078,11 @@ sub store_changes { $output .= '
  • '.&Apache::lonhtmlcommon::confirm_success(&mt('Numbered menu collections:')).'
    '. $displayval.'
  • '; } else { + unless (($key eq 'extresource') && ($changes->{$item}{$key} ne 'iframe')) { + $displayval = "'$displayval'"; + } $output .= '
  • '.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', - ''.$displayname.'', - "'$displayval'")); + ''.$displayname.'',$displayval)); if ($key eq 'url') { my $bkuptime=time; $output .= (' 'x2).&mt('(Previous URL backed up)').': '. @@ -2406,7 +2467,7 @@ sub get_course { sub get_jscript { my ($cid,$cdom,$phase,$crstype,$settings,$noedit) = @_; my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype); - my ($jscript,$categorize_js,$loncaparev_js,$instcode_js); + my ($jscript,$categorize_js,$loncaparev_js,$instcode_js,$extresource_js); my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript(); my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset'); my $cloners_js = &cloners_javascript($phase); @@ -2613,11 +2674,38 @@ function toggleAddmenucoll() { } ENDSCRIPT } + $extresource_js = <<"ENDSCRIPT"; +function toggleExtRes() { + if (document.getElementById('LC_extresource')) { + var extressel = document.getElementById('LC_extresource').value; + if (document.getElementById('LC_extresreusediv')) { + var extresreuse = document.getElementById('LC_extresreusediv'); + if (document.getElementById('LC_extressize')) { + var extressize = document.getElementById('LC_extressize'); + var setvis; + if ((extressel == 'tab') || (extressel == 'window')) { + extresreuse.style.display = 'inline-block'; + setvis = 1; + if (extressel == 'window') { + extressize.style.display = 'inline-block'; + } else { + extressize.style.display = 'none'; + } + } + if (!setvis) { + extresreuse.style.display = 'none'; + extressize.style.display = 'none'; + } + } + } + } +} +ENDSCRIPT $jscript = ''."\n".$stubrowse_js."\n"; return $jscript; @@ -4828,6 +4916,16 @@ sub print_appearance { text => ''.&mt($itemtext->{'inline_chem'}).'', input => 'radio', }, + 'extresource' => { + text => ''.&mt($itemtext->{'extresource'}).'', + input => 'selectbox', + options => { + iframe => 'In iframe', + tab => 'In new tab', + window => 'In pop-up window', + }, + order => ['iframe','tab','window'], + }, ); return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'appearance',$noedit); } @@ -5614,6 +5712,45 @@ sub linkprot_options { return $output; } +sub print_extresource_row { + my ($item,$config,$curr,$noedit) = @_; + my $onchange; + unless ($noedit) { + $onchange = ' onchange="javascript:toggleExtRes();"'; + } + my $id = 'LC_'.$item; + my ($selected,$reuse,$width,$height) = split(/:/,$curr); + my $output = &select_from_options($item,$config->{'order'}, + $config->{'options'},$selected, + $config->{'nullval'}, + undef,undef,$onchange,$noedit,$id); + my ($checked,$reusesty,$sizesty); + if ($reuse) { + $checked = ' checked="checked"'; + } + $reusesty = 'none'; + $sizesty = 'none'; + if (($selected eq 'window') || ($selected eq 'tab')) { + $reusesty = 'inline-block'; + if ($selected eq 'window') { + $sizesty = 'inline-block'; + } + } + $output .= '
    '. + ''. + ''. + '
    '. + '
    '. + ''.&mt('Window size (optional)').''. + ''. + &mt('width').':px'. + (' ' x 3). + &mt('height').':px'. + '
    '; + return $output; +} + sub print_other { my ($cdom,$settings,$allitems,$rowtotal,$crstype,$noedit) = @_; unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) { @@ -5785,10 +5922,16 @@ sub make_item_rows { (($caller eq 'printouts') && ($item ne 'print_header_format'))) { $colspan = 2; } + my $rowdesc; + if ($caller eq 'appearance') { + $rowdesc = ''.$items->{$item}{text}.''; + } else { + $rowdesc = $items->{$item}{text}; + } if (exists $items->{$item}{advanced} && $items->{$item}{advanced} == 1) { - $datatable .= &item_table_row_start($items->{$item}{text},$count,"advanced",$colspan); + $datatable .= &item_table_row_start($rowdesc,$count,"advanced",$colspan); } else { - $datatable .= &item_table_row_start($items->{$item}{text},$count,undef,$colspan); + $datatable .= &item_table_row_start($rowdesc,$count,undef,$colspan); } if ($item eq 'defaultcredits') { my $defaultcredits = $env{'course.'.$env{'request.course.id'}.'.internal.defaultcredits'}; @@ -5805,6 +5948,8 @@ sub make_item_rows { $datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype,$noedit); } elsif ($item eq 'print_header_format') { $datatable .= &print_hdrfmt_row($item,$settings,$noedit); + } elsif ($item eq 'extresource') { + $datatable .= &print_extresource_row($item,$items->{$item},$settings->{$item},$noedit); } elsif ($items->{$item}{input} eq 'dates') { my $disabled; if ($noedit) {