version 1.77, 2016/03/23 02:19:09
|
version 1.121, 2023/06/01 20:04:36
|
Line 52 This module is used for configuration of
|
Line 52 This module is used for configuration of
|
|
|
=item process_changes() |
=item process_changes() |
|
|
|
=item process_linkprot() |
|
|
=item get_sec_str() |
=item get_sec_str() |
|
|
=item check_clone() |
=item check_clone() |
|
|
=item store_changes() |
=item store_changes() |
|
|
|
=item store_linkprot() |
|
|
=item update_env() |
=item update_env() |
|
|
=item display_disallowed() |
=item display_disallowed() |
Line 112 This module is used for configuration of
|
Line 116 This module is used for configuration of
|
|
|
=item item_table_row_end() |
=item item_table_row_end() |
|
|
=item yes_no_radio() |
=item yesno_radio() |
|
|
=item select_from_options() |
=item select_from_options() |
|
|
Line 137 whether Domain coordinators who are curr
|
Line 141 whether Domain coordinators who are curr
|
advanced course user .db file for a course are to be hidden (e.g., |
advanced course user .db file for a course are to be hidden (e.g., |
in syllabus, or from course user lists). |
in syllabus, or from course user lists). |
|
|
Inputs: $cdom,$item,$settings,$crstype |
Inputs: $cdom,$item,$settings,$crstype,$noedit |
where $cdom is course domain, item is nothideprivileged, $settings is |
where $cdom is course domain, item is nothideprivileged, $settings is |
HASH ref of the current values for nothideprivileged, $crstype is |
HASH ref of the current values for nothideprivileged, $crstype is |
course type (Course or Community). |
course type (Course or Community). |
Line 220 use Apache::lonparmset;
|
Line 224 use Apache::lonparmset;
|
use Apache::courseclassifier; |
use Apache::courseclassifier; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
use Crypt::CBC; |
|
use Time::HiRes qw( sleep ); |
|
|
my $registered_cleanup; |
my $registered_cleanup; |
my $modified_courses; |
my $modified_courses; |
Line 235 sub handler {
|
Line 241 sub handler {
|
my $cid = $env{'request.course.id'}; |
my $cid = $env{'request.course.id'}; |
my ($cnum,$cdom,$chome) = &get_course($cid); |
my ($cnum,$cdom,$chome) = &get_course($cid); |
my $crstype = &Apache::loncommon::course_type(); |
my $crstype = &Apache::loncommon::course_type(); |
my $parm_permission = &Apache::lonnet::allowed('opa',$cid); |
my ($parm_permission,$allowed) = &get_permission($cid); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
if ($parm_permission && $navmap) { |
if ($allowed && $navmap) { |
&Apache::loncommon::content_type($r,'text/html'); |
&Apache::loncommon::content_type($r,'text/html'); |
$r->send_http_header; |
$r->send_http_header; |
} else { |
} else { |
Line 288 sub handler {
|
Line 294 sub handler {
|
excc => 'Exclude from community catalog', |
excc => 'Exclude from community catalog', |
clon => 'Users allowed to clone community', |
clon => 'Users allowed to clone community', |
rept => 'Replacement titles for standard community roles', |
rept => 'Replacement titles for standard community roles', |
time => 'Timezone where the community is located', |
time => 'Time Zone where the community is located', |
date => 'Locale used for community calendar', |
date => 'Locale used for community calendar', |
coco => 'Community Content', |
coco => 'Community Content', |
copo => 'Community Policy', |
copo => 'Community Policy', |
Line 317 sub handler {
|
Line 323 sub handler {
|
excc => 'Exclude from course catalog', |
excc => 'Exclude from course catalog', |
clon => 'Users allowed to clone course', |
clon => 'Users allowed to clone course', |
rept => 'Replacement titles for standard course roles', |
rept => 'Replacement titles for standard course roles', |
time => 'Timezone in which the course takes place', |
time => 'Time Zone in which the course takes place', |
date => 'Locale used for course calendar', |
date => 'Locale used for course calendar', |
coco => 'Course Content', |
coco => 'Course Content', |
copo => 'Course Policy', |
copo => 'Course Policy', |
Line 344 sub handler {
|
Line 350 sub handler {
|
$phase = $env{'form.phase'}; |
$phase = $env{'form.phase'}; |
} |
} |
|
|
if ($phase eq 'categorizecourse') { |
if (($phase eq 'categorizecourse') && ($parm_permission->{'categorizecourse'})) { |
&assign_course_categories($r,$crstype); |
&assign_course_categories($r,$crstype); |
return OK; |
return OK; |
} |
} |
|
|
if ($phase eq 'releaseinfo') { |
if (($phase eq 'releaseinfo') && ($parm_permission->{'releaseinfo'})) { |
my $loncaparev = $env{'course.'.$cid.'.internal.releaserequired'}; |
my $loncaparev = $env{'course.'.$cid.'.internal.releaserequired'}; |
if ($loncaparev) { |
if ($loncaparev) { |
if (&display_loncaparev_constraints($r,$navmap,$loncaparev,$crstype)) { |
if (&display_loncaparev_constraints($r,$navmap,$loncaparev,$crstype)) { |
Line 365 sub handler {
|
Line 371 sub handler {
|
} |
} |
|
|
my %values=&Apache::lonnet::dump('environment',$cdom,$cnum); |
my %values=&Apache::lonnet::dump('environment',$cdom,$cnum); |
|
my %linkprot=&Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1); |
|
my %ltienc = &Apache::lonnet::dump('nohist_ltienc',$cdom,$cnum,undef,undef,undef,1); |
|
my %ltitools = &Apache::lonnet::dump('ltitools',$cdom,$cnum,undef,undef,undef,1); |
|
my %ltitoolsenc = &Apache::lonnet::dump('nohist_toolsenc',$cdom,$cnum,undef,undef,undef,1); |
|
foreach my $id (keys(%linkprot)) { |
|
if (ref($linkprot{$id}) eq 'HASH') { |
|
if (ref($ltienc{$id}) eq 'HASH') { |
|
$values{'linkprot'}{$id} = { %{$linkprot{$id}}, %{$ltienc{$id}} }; |
|
} else { |
|
$values{'linkprot'}{$id} = $linkprot{$id}; |
|
} |
|
} |
|
unless ($phase eq 'process') { |
|
if (ref($values{'linkprot'}{$id}) eq 'HASH') { |
|
delete($values{'linkprot'}{$id}{'secret'}); |
|
} |
|
} |
|
} |
|
if ($linkprot{'lock'}) { |
|
delete($linkprot{'lock'}); |
|
} |
|
foreach my $id (keys(%ltitools)) { |
|
if (ref($ltitools{$id}) eq 'HASH') { |
|
if (ref($ltitoolsenc{$id}) eq 'HASH') { |
|
$values{'ltitools'}{$id} = { %{$ltitools{$id}}, %{$ltitoolsenc{$id}} }; |
|
} else { |
|
$values{'ltitools'}{$id} = $ltitools{$id}; |
|
} |
|
} |
|
unless ($phase eq 'process') { |
|
if (ref($values{'ltitools'}{$id}) eq 'HASH') { |
|
delete($values{'ltitools'}{$id}{'secret'}); |
|
} |
|
} |
|
} |
|
if ($ltitools{'lock'}) { |
|
delete($ltitools{'lock'}); |
|
} |
my @prefs_order = ('courseinfo','localization','feedback','discussion', |
my @prefs_order = ('courseinfo','localization','feedback','discussion', |
'classlists','appearance','grading','printouts', |
'classlists','appearance','grading','printouts', |
'spreadsheet','bridgetasks','other'); |
'menuitems','ltitools','linkprot','spreadsheet', |
|
'bridgetasks','lti','other'); |
my %prefs = ( |
my %prefs = ( |
'courseinfo' => |
'courseinfo' => |
{ text => $lt{'gens'}, |
{ text => $lt{'gens'}, |
help => 'Course_Prefs_General', |
help => 'Course_Prefs_General', |
ordered => ['owner','co-owners','loncaparev','description', |
ordered => ['owner','co-owners','loncaparev','description', |
'clonedfrom','courseid','uniquecode','categories', |
'clonedfrom','courseid','uniquecode','categories', |
'hidefromcat','externalsyllabus','cloners','url', |
'hidefromcat','syllabus','cloners','url', |
'rolenames'], |
'rolenames'], |
itemtext => { |
itemtext => { |
'owner' => $lt{'ownr'}, |
'owner' => $lt{'ownr'}, |
Line 386 sub handler {
|
Line 430 sub handler {
|
'categories' => $lt{'catg'}, |
'categories' => $lt{'catg'}, |
'hidefromcat' => $lt{'excc'}, |
'hidefromcat' => $lt{'excc'}, |
'cloners' => $lt{'clon'}, |
'cloners' => $lt{'clon'}, |
'externalsyllabus' => 'Syllabus status', |
'syllabus' => 'Syllabus status', |
'url' => 'Top Level Map', |
'url' => 'Top Level Map', |
'rolenames' => $lt{'rept'}, |
'rolenames' => $lt{'rept'}, |
'loncaparev' => $lt{'lcrv'}, |
'loncaparev' => $lt{'lcrv'}, |
Line 467 sub handler {
|
Line 511 sub handler {
|
help => 'Course_Prefs_Display', |
help => 'Course_Prefs_Display', |
ordered => ['default_xml_style','pageseparators', |
ordered => ['default_xml_style','pageseparators', |
'disable_receipt_display','texengine', |
'disable_receipt_display','texengine', |
'tthoptions','uselcmath','usejsme'], |
'tthoptions','uselcmath','usejsme', |
|
'inline_chem','extresource'], |
itemtext => { |
itemtext => { |
default_xml_style => 'Default XML style file', |
default_xml_style => 'Default XML style file', |
pageseparators => 'Visibly Separate Items on Pages', |
pageseparators => 'Visibly Separate Items on Pages', |
Line 476 sub handler {
|
Line 521 sub handler {
|
tthoptions => 'Default set of options to pass to tth/m when converting TeX', |
tthoptions => 'Default set of options to pass to tth/m when converting TeX', |
uselcmath => 'Student formula entry uses inline preview, not DragMath pop-up', |
uselcmath => 'Student formula entry uses inline preview, not DragMath pop-up', |
usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)', |
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' => |
'grading' => |
Line 530 sub handler {
|
Line 577 sub handler {
|
suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio', |
suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio', |
}, |
}, |
}, |
}, |
|
'lti' => |
|
{ |
|
text => 'LTI provider settings', |
|
help => 'Course_Prefs_LTIProvider', |
|
ordered => ['lti.override','lti.topmenu','lti.inlinemenu','lti.lcmenu'], |
|
itemtext => { |
|
'lti.override' => 'Override domain defaults', |
|
'lti.topmenu' => 'Display LON-CAPA page header', |
|
'lti.inlinemenu' => 'Display LON-CAPA inline menu', |
|
'lti.lcmenu' => 'Menu items', |
|
}, |
|
}, |
|
'menuitems' => |
|
{ |
|
text => 'Menu display', |
|
help => 'Course_Prefs_Menus', |
|
header => [{col1 => 'Default Menu', |
|
col2 => 'Value',}, |
|
{col1 => 'Menu collections', |
|
col2 => 'Settings', |
|
}], |
|
ordered => ['menudefault','menucollections'], |
|
itemtext => { |
|
menudefault => 'Choose default collection of menu items for course', |
|
menucollections => 'Menu collections', |
|
}, |
|
}, |
|
'linkprot' => |
|
{ |
|
text => 'Link protection', |
|
help => 'Course_Prefs_Linkprotection', |
|
header => [{col1 => 'Item', |
|
col2 => 'Settings', |
|
}], |
|
}, |
|
'ltitools' => |
|
{ |
|
text => 'External tools', |
|
help => 'Course_Prefs_ExternalTools', |
|
header => [{col1 => 'Item', |
|
col2 => 'Settings', |
|
}], |
|
}, |
'other' => |
'other' => |
{ text => 'Other settings', |
{ text => 'Other settings', |
help => 'Course_Prefs_Other', |
help => 'Course_Prefs_Other', |
Line 538 sub handler {
|
Line 628 sub handler {
|
}], |
}], |
}, |
}, |
); |
); |
if ($phase eq 'process') { |
if (($phase eq 'process') && ($parm_permission->{'process'})) { |
my @allitems = &get_allitems(%prefs); |
my @allitems = &get_allitems(%prefs); |
&Apache::lonconfigsettings::make_changes($r,$cdom,$phase,$context, |
my $result = &Apache::lonconfigsettings::make_changes($r,$cdom,$phase,$context, |
\@prefs_order,\%prefs,\%values, |
\@prefs_order,\%prefs,\%values, |
$cnum,undef,\@allitems,'coursepref'); |
$cnum,undef,\@allitems, |
} elsif ($phase eq 'display') { |
'coursepref',$parm_permission); |
my $jscript = &get_jscript($cid,$cdom,$phase,$crstype,\%values); |
if ((ref($result) eq 'HASH') && (keys(%{$result}))) { |
|
$r->rflush(); |
|
&devalidate_remote_courseprefs($cdom,$cnum,$result); |
|
} |
|
} elsif (($phase eq 'display') && ($parm_permission->{'display'})) { |
|
my $noedit; |
|
if (ref($parm_permission) eq 'HASH') { |
|
unless ($parm_permission->{'process'}) { |
|
$noedit = 1; |
|
} |
|
} |
|
my $jscript = &get_jscript($cid,$cdom,$phase,$crstype,\%values,$noedit); |
my @allitems = &get_allitems(%prefs); |
my @allitems = &get_allitems(%prefs); |
&Apache::lonconfigsettings::display_settings($r,$cdom,$phase,$context, |
&Apache::lonconfigsettings::display_settings($r,$cdom,$phase,$context, |
\@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype,'coursepref'); |
\@prefs_order,\%prefs,\%values,$cnum,$jscript,\@allitems,$crstype, |
|
'coursepref',$parm_permission); |
} else { |
} else { |
&Apache::lonconfigsettings::display_choices($r,$phase,$context, |
&Apache::lonconfigsettings::display_choices($r,$phase,$context, |
\@prefs_order,\%prefs,'coursepref'); |
\@prefs_order,\%prefs, |
|
'coursepref',$parm_permission); |
} |
} |
return OK; |
return OK; |
} |
} |
|
|
|
sub get_permission { |
|
my ($cid) = @_; |
|
my %permission; |
|
my $allowed = 0; |
|
return (\%permission,$allowed) unless ($cid); |
|
if (&Apache::lonnet::allowed('opa',$cid)) { |
|
%permission= ( |
|
'pickactions' => 1, |
|
'categorizecourse' => 1, |
|
'releaseinfo' => 1, |
|
'process' => 1, |
|
'display' => 1, |
|
); |
|
} elsif (&Apache::lonnet::allowed('vpa',$env{'request.course.id'})) { |
|
%permission = ( |
|
'pickactions' => 1, |
|
'releaseinfo' => 1, |
|
'display' => 1, |
|
); |
|
} |
|
foreach my $perm (values(%permission)) { |
|
if ($perm) { $allowed=1; last; } |
|
} |
|
return (\%permission,$allowed); |
|
} |
|
|
sub get_allitems { |
sub get_allitems { |
my (%prefs) = @_; |
my (%prefs) = @_; |
my @allitems; |
my @allitems; |
Line 572 sub get_allitems {
|
Line 701 sub get_allitems {
|
} |
} |
|
|
sub print_config_box { |
sub print_config_box { |
my ($r,$cdom,$phase,$action,$item,$settings,$allitems,$crstype) = @_; |
my ($r,$cdom,$cnum,$phase,$action,$item,$settings,$allitems,$crstype,$parm_permission) = @_; |
my $ordered = $item->{'ordered'}; |
my $ordered = $item->{'ordered'}; |
my $itemtext = $item->{'itemtext'}; |
my $itemtext = $item->{'itemtext'}; |
|
my $noedit; |
|
if (ref($parm_permission) eq 'HASH') { |
|
unless ($parm_permission->{'process'}) { |
|
$noedit = 1; |
|
} |
|
} |
my $rowtotal = 0; |
my $rowtotal = 0; |
my $output = |
my $output = |
'<table class="LC_nested_outer"> |
'<table class="LC_nested_outer"> |
Line 587 sub print_config_box {
|
Line 722 sub print_config_box {
|
} |
} |
$output .= '</span></th>'."\n". |
$output .= '</span></th>'."\n". |
'</tr>'; |
'</tr>'; |
if (($action eq 'feedback') || ($action eq 'classlists')) { |
if (($action eq 'feedback') || ($action eq 'classlists') || ($action eq 'menuitems')) { |
$output .= ' |
$output .= ' |
<tr> |
<tr> |
<td> |
<td> |
Line 609 sub print_config_box {
|
Line 744 sub print_config_box {
|
} |
} |
$rowtotal ++; |
$rowtotal ++; |
if ($action eq 'feedback') { |
if ($action eq 'feedback') { |
$output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal); |
$output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit); |
} elsif ($action eq 'classlists') { |
} elsif ($action eq 'classlists') { |
$output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype); |
$output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit); |
|
} elsif ($action eq 'menuitems') { |
|
$output .= &print_menuitems('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit); |
} |
} |
$output .= ' |
$output .= ' |
</table> |
</table> |
Line 632 sub print_config_box {
|
Line 769 sub print_config_box {
|
$output .= &mt($item->{'header'}->[1]->{'col2'}).'</td> |
$output .= &mt($item->{'header'}->[1]->{'col2'}).'</td> |
</tr>'; |
</tr>'; |
if ($action eq 'classlists') { |
if ($action eq 'classlists') { |
$output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype). |
$output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit). |
' |
' |
</table> |
</table> |
</td> |
</td> |
Line 671 sub print_config_box {
|
Line 808 sub print_config_box {
|
} |
} |
$rowtotal ++; |
$rowtotal ++; |
if ($action eq 'courseinfo') { |
if ($action eq 'courseinfo') { |
$output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); |
$output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); |
} elsif ($action eq 'localization') { |
} elsif ($action eq 'localization') { |
$output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal); |
$output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit); |
} elsif ($action eq 'feedback') { |
} elsif ($action eq 'feedback') { |
$output .= &print_feedback('bottom',$cdom,$settings,$ordered,$itemtext,\$rowtotal); |
$output .= &print_feedback('bottom',$cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit); |
} elsif ($action eq 'discussion') { |
} elsif ($action eq 'discussion') { |
$output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal); |
$output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit); |
} elsif (($action eq 'classlists') || ($action eq 'viewableroster')) { |
} elsif (($action eq 'classlists') || ($action eq 'viewableroster')) { |
$output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype); |
$output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit); |
} elsif ($action eq 'appearance') { |
} elsif ($action eq 'appearance') { |
$output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); |
$output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); |
} elsif ($action eq 'grading') { |
} elsif ($action eq 'grading') { |
$output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); |
$output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); |
} elsif ($action eq 'printouts') { |
} elsif ($action eq 'printouts') { |
$output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); |
$output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); |
} elsif ($action eq 'spreadsheet') { |
} elsif ($action eq 'spreadsheet') { |
$output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); |
$output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); |
} elsif ($action eq 'bridgetasks') { |
} elsif ($action eq 'bridgetasks') { |
$output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); |
$output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); |
|
} elsif ($action eq 'ltitools') { |
|
my $currtools = {}; |
|
if ((ref($settings) eq 'HASH') && (ref($settings->{'ltitools'}))) { |
|
$currtools = $settings->{'ltitools'}; |
|
} |
|
$output .= &print_ltitools($cdom,$cnum,$currtools,\$rowtotal,$crstype,$noedit,'course'); |
|
} elsif ($action eq 'lti') { |
|
$output .= &print_lti($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); |
|
} elsif ($action eq 'menuitems') { |
|
$output .= &print_menuitems('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit); |
|
} elsif ($action eq 'linkprot') { |
|
$output .= &print_linkprotection($cdom,$cnum,$settings,\$rowtotal,$crstype,$noedit,'course'); |
} elsif ($action eq 'other') { |
} elsif ($action eq 'other') { |
$output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype); |
$output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype,$noedit); |
} |
} |
$output .= ' |
$output .= ' |
</table> |
</table> |
Line 702 sub print_config_box {
|
Line 851 sub print_config_box {
|
} |
} |
|
|
sub process_changes { |
sub process_changes { |
my ($cdom,$action,$values,$item,$changes,$allitems,$disallowed,$crstype) = @_; |
my ($cdom,$cnum,$action,$values,$item,$changes,$allitems,$disallowed,$crstype,$lastactref) = @_; |
my %newvalues; |
my (%newvalues,$errors); |
if (ref($item) eq 'HASH') { |
if (ref($item) eq 'HASH') { |
if (ref($changes) eq 'HASH') { |
if (ref($changes) eq 'HASH') { |
my @ordered; |
my @ordered; |
Line 720 sub process_changes {
|
Line 869 sub process_changes {
|
} |
} |
} |
} |
} |
} |
|
} elsif (($action eq 'linkprot') || ($action eq 'ltitools')) { |
|
if (ref($values->{$action}) eq 'HASH') { |
|
foreach my $id (keys(%{$values->{$action}})) { |
|
if ($id =~ /^\d+$/) { |
|
push(@ordered,$id); |
|
} |
|
} |
|
} |
|
@ordered = sort { $a <=> $b } @ordered; |
|
if (($env{'form.'.$action.'_add'}) && ($env{'form.'.$action.'_maxnum'} =~ /^\d+$/)) { |
|
push(@ordered,$env{'form.'.$action.'_maxnum'}); |
|
} |
} elsif (ref($item->{'ordered'}) eq 'ARRAY') { |
} elsif (ref($item->{'ordered'}) eq 'ARRAY') { |
if ($action eq 'courseinfo') { |
if ($action eq 'courseinfo') { |
my ($can_toggle_cat,$can_categorize) = |
my ($can_toggle_cat,$can_categorize) = |
Line 731 sub process_changes {
|
Line 892 sub process_changes {
|
(!$can_categorize)); |
(!$can_categorize)); |
next if (($entry eq 'loncaparev') || |
next if (($entry eq 'loncaparev') || |
($entry eq 'owner') || |
($entry eq 'owner') || |
($entry eq 'clonedfrom')); |
($entry eq 'clonedfrom') || |
|
($entry eq 'syllabus')); |
push(@ordered,$entry); |
push(@ordered,$entry); |
} |
} |
} elsif ($action eq 'classlists') { |
} elsif ($action eq 'classlists') { |
Line 781 sub process_changes {
|
Line 943 sub process_changes {
|
$changes->{$ext_entry} = $newvalues{$ext_entry}; |
$changes->{$ext_entry} = $newvalues{$ext_entry}; |
} |
} |
} |
} |
|
} elsif ($action eq 'menuitems') { |
|
my (%current,@colls); |
|
my $next = 1; |
|
if ($values->{'menucollections'}) { |
|
foreach my $item (split(/;/,$values->{'menucollections'})) { |
|
my ($num,$value) = split(/\%/,$item); |
|
if ($num =~ /^\d+$/) { |
|
unless (grep(/^$num$/,@colls)) { |
|
push(@colls,$num); |
|
} |
|
my @entries = split(/\&/,$value); |
|
foreach my $entry (@entries) { |
|
my ($name,$fields) = split(/=/,$entry); |
|
$current{$num}{$name} = $fields; |
|
} |
|
} |
|
} |
|
} |
|
if (@colls) { |
|
@colls = sort { $a <=> $b } @colls; |
|
$next += $colls[-1]; |
|
} |
|
if ($env{'form.menucollections_add'} eq $next) { |
|
push(@colls,$next); |
|
} |
|
my $currdef = $values->{'menudefault'}; |
|
my $possdef = $env{'form.menudefault'}; |
|
if (($possdef =~ /^\d+$/) && (grep(/^$possdef$/,@colls))) { |
|
if ($currdef ne $possdef) { |
|
$changes->{'menudefault'} = $possdef; |
|
} |
|
} elsif ($currdef) { |
|
$changes->{'menudefault'} = ''; |
|
} |
|
my $menucoll; |
|
if (@colls) { |
|
my ($ordered,$cats) = &menuitems_categories(); |
|
my %shortcats = &menuitems_abbreviations(); |
|
foreach my $num (@colls) { |
|
my ($entry,%include); |
|
map { $include{$_}= 1; } &Apache::loncommon::get_env_multiple('form.menucollections_'.$num); |
|
foreach my $item (@{$ordered}) { |
|
if ($item eq 'shown') { |
|
foreach my $type (@{$cats->{$item}}) { |
|
$entry .= $type.'='; |
|
if ($include{$type}) { |
|
$entry .= 'y'; |
|
} else { |
|
$entry .= 'n'; |
|
} |
|
$entry .= '&'; |
|
} |
|
} else { |
|
$entry .= $shortcats{$item}.'='; |
|
foreach my $type (@{$cats->{$item}}) { |
|
if ($include{$type}) { |
|
$entry .= $type.','; |
|
} |
|
} |
|
$entry =~ s/,$//; |
|
$entry .= '&'; |
|
} |
|
} |
|
$entry =~ s/\&$//; |
|
if ($menucoll) { |
|
$menucoll .= ';'; |
|
} |
|
$menucoll .= $num.'%'.$entry; |
|
} |
|
if ($menucoll ne $values->{'menucollections'}) { |
|
$changes->{'menucollections'} = $menucoll; |
|
} |
|
} elsif ($values->{'menucollections'}) { |
|
$changes->{'menucollections'} = ''; |
|
} |
|
} elsif ($action eq 'linkprot') { |
|
if (ref($values) eq 'HASH') { |
|
$errors = &process_linkprot($cdom,$cnum,$values->{$action},$changes,'course',$lastactref); |
|
} |
|
} elsif ($action eq 'ltitools') { |
|
if (ref($values) eq 'HASH') { |
|
my $switchserver = &check_switchserver($cdom,$cnum,'course','/adm/courseprefs'); |
|
$errors = &process_ltitools('',$cdom,$cnum,$values->{$action},$changes,'course',$lastactref, |
|
'ok','','ok'); |
|
} |
} else { |
} else { |
foreach my $entry (@ordered) { |
foreach my $entry (@ordered) { |
if ($entry eq 'cloners') { |
if ($entry eq 'cloners') { |
Line 821 sub process_changes {
|
Line 1068 sub process_changes {
|
my $clonedom = $env{'form.cloners_newdom'}; |
my $clonedom = $env{'form.cloners_newdom'}; |
if (&check_clone($clonedom,$disallowed) eq 'ok') { |
if (&check_clone($clonedom,$disallowed) eq 'ok') { |
my $newdom = '*:'.$env{'form.cloners_newdom'}; |
my $newdom = '*:'.$env{'form.cloners_newdom'}; |
if (@clonedoms) { |
if (@clonedoms) { |
if (!grep(/^\Q$newdom\E$/,@clonedoms)) { |
if (!grep(/^\Q$newdom\E$/,@clonedoms)) { |
$newvalues{$entry} .= ','.$newdom; |
$newvalues{$entry} .= ','.$newdom; |
} |
} |
Line 910 sub process_changes {
|
Line 1157 sub process_changes {
|
$autocoowner = $domconf{'autoenroll'}{'co-owners'}; |
$autocoowner = $domconf{'autoenroll'}{'co-owners'}; |
} |
} |
} |
} |
unless ($autocoowner) { |
if ($autocoowner) { |
|
$newvalues{'co-owners'} = $values->{'internal.co-owners'}; |
|
} else { |
my @keepcoowners = &Apache::loncommon::get_env_multiple('form.coowners'); |
my @keepcoowners = &Apache::loncommon::get_env_multiple('form.coowners'); |
my @pendingcoowners = &Apache::loncommon::get_env_multiple('form.pendingcoowners'); |
my @pendingcoowners = &Apache::loncommon::get_env_multiple('form.pendingcoowners'); |
my @invitecoowners = &Apache::loncommon::get_env_multiple('form.invitecoowners'); |
my @invitecoowners = &Apache::loncommon::get_env_multiple('form.invitecoowners'); |
Line 934 sub process_changes {
|
Line 1183 sub process_changes {
|
my $udom = $env{'user.domain'}; |
my $udom = $env{'user.domain'}; |
my $pendingcoowners = $values->{'internal.pendingco-owners'}; |
my $pendingcoowners = $values->{'internal.pendingco-owners'}; |
my @pendingcoown = split(',',$pendingcoowners); |
my @pendingcoown = split(',',$pendingcoowners); |
if ($env{'form.pending_coowoner'}) { |
if ($env{'form.pending_coowner'}) { |
foreach my $item (@pendingcoown) { |
foreach my $item (@pendingcoown) { |
unless ($item eq $uname.':'.$udom) { |
unless ($item eq $uname.':'.$udom) { |
push(@newpending,$item); |
push(@newpending,$item); |
} |
} |
} |
} |
@newcoown = @currcoown; |
@newcoown = @currcoown; |
if ($env{'form.pending_coowoner'} eq 'accept') { |
if ($env{'form.pending_coowner'} eq 'accept') { |
unless (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) { |
unless (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) { |
push(@newcoown,$uname.':'.$udom); |
push(@newcoown,$uname.':'.$udom); |
} |
} |
} |
} |
} elsif ($env{'form.remove_coowoner'}) { |
} elsif ($env{'form.remove_coowner'}) { |
foreach my $item (@currcoown) { |
foreach my $item (@currcoown) { |
unless ($item eq $uname.':'.$udom) { |
unless ($item eq $uname.':'.$udom) { |
push(@newcoown,$item); |
push(@newcoown,$item); |
Line 955 sub process_changes {
|
Line 1204 sub process_changes {
|
if ($pendingcoowners ne '') { |
if ($pendingcoowners ne '') { |
@newpending = @pendingcoown; |
@newpending = @pendingcoown; |
} |
} |
|
} else { |
|
@newcoown = @currcoown; |
} |
} |
$newvalues{'pendingco-owners'} = join(',',sort(@newpending)); |
$newvalues{'pendingco-owners'} = join(',',sort(@newpending)); |
$newvalues{'co-owners'} = join(',',sort(@newcoown)); |
$newvalues{'co-owners'} = join(',',sort(@newcoown)); |
Line 1222 sub process_changes {
|
Line 1473 sub process_changes {
|
$settings =~ s/,$//; |
$settings =~ s/,$//; |
} |
} |
$newvalues{$entry} = $settings; |
$newvalues{$entry} = $settings; |
|
} elsif ($action eq 'lti') { |
|
if ($entry eq 'lti.override') { |
|
$newvalues{$entry} = $env{'form.'.$entry}; |
|
} elsif (($entry eq 'lti.topmenu') || ($entry eq 'lti.inlinemenu')) { |
|
if ($env{'form.lti.override'}) { |
|
$newvalues{$entry} = $env{'form.'.$entry}; |
|
} else { |
|
$newvalues{$entry} = ''; |
|
} |
|
} elsif ($entry eq 'lti.lcmenu') { |
|
if (($env{'form.lti.override'}) && |
|
(($env{'form.lti.topmenu'}) || ($env{'form.lti.inlinemenu'}))) { |
|
my @lcmenu = &Apache::loncommon::get_env_multiple('form.lti.lcmenu'); |
|
my @newlcmenu; |
|
if (@lcmenu) { |
|
my @menuitems = ('fullname','coursetitle','role','logout','grades'); |
|
foreach my $item (@menuitems) { |
|
next if (($item eq 'grades') && (!$newvalues{'lti.inlinemenu'})); |
|
if (grep(/^\Q$item\E$/,@lcmenu)) { |
|
push(@newlcmenu,$item); |
|
} |
|
} |
|
} |
|
if (@newlcmenu) { |
|
$newvalues{$entry} = join(',',@newlcmenu); |
|
} else { |
|
$newvalues{$entry} = 'none'; |
|
} |
|
} else { |
|
$newvalues{$entry} = ''; |
|
} |
|
} |
|
} 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}; |
|
} |
|
} |
|
} elsif ($entry eq 'timezone') { |
|
if ($env{'form.'.$entry}) { |
|
$newvalues{$entry} = $env{'form.'.$entry}; |
|
if ($newvalues{$entry} ne $values->{$entry}) { |
|
$changes->{$entry} = $newvalues{$entry}; |
|
} |
|
if ($env{'form.tzover'}) { |
|
$newvalues{'tzover'} = $env{'form.tzover'}; |
|
if ($newvalues{'tzover'} ne $values->{'tzover'}) { |
|
$changes->{'tzover'} = $newvalues{'tzover'}; |
|
} |
|
} elsif ($values->{'tzover'}) { |
|
$changes->{'tzover'} = ''; |
|
} |
|
} elsif ($values->{$entry}) { |
|
$changes->{$entry} = ''; |
|
} |
} else { |
} else { |
$newvalues{$entry} = $env{'form.'.$entry}; |
$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') || ($entry eq 'timezone')) { |
if ($newvalues{$entry} ne $values->{$entry}) { |
if ($newvalues{$entry} ne $values->{$entry}) { |
$changes->{$entry} = $newvalues{$entry}; |
$changes->{$entry} = $newvalues{$entry}; |
} |
} |
Line 1235 sub process_changes {
|
Line 1562 sub process_changes {
|
} |
} |
} |
} |
} |
} |
return; |
return $errors; |
|
} |
|
|
|
sub process_linkprot { |
|
my ($cdom,$cnum,$values,$changes,$context,$lastactref) = @_; |
|
my ($dest,$ltiauth,$privnum,$cipher,$errors,%linkprot); |
|
if (ref($values) eq 'HASH') { |
|
foreach my $id (keys(%{$values})) { |
|
if ($id =~ /^\d+$/) { |
|
unless (ref($values->{$id}) eq 'HASH') { |
|
$linkprot{$id} = ''; |
|
} |
|
} |
|
} |
|
} |
|
($cipher,$privnum) = &get_credentials($cdom,$cnum,'lti',$context); |
|
if ($context eq 'domain') { |
|
$dest = '/adm/domainprefs'; |
|
$ltiauth = 1; |
|
} else { |
|
$dest = '/adm/courseprefs'; |
|
if (exists($env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'})) { |
|
$ltiauth = $env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'}; |
|
} else { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); |
|
$ltiauth = $domdefs{'crsltiauth'}; |
|
} |
|
} |
|
my $switchserver = &check_switchserver($cdom,$cnum,$context,$dest); |
|
my (@items,%deletions,%itemids,%haschanges); |
|
if ($env{'form.linkprot_add'}) { |
|
my $name = $env{'form.linkprot_name_add'}; |
|
$name =~ s/(`)/'/g; |
|
my ($newid,$error) = &get_linkprot_id($cdom,$cnum,$name,$context); |
|
if ($newid) { |
|
$itemids{'add'} = $newid; |
|
push(@items,'add'); |
|
$haschanges{$newid} = 1; |
|
} else { |
|
$errors .= '<span class="LC_error">'. |
|
&mt('Failed to acquire unique ID for link protection'). |
|
'</span>'; |
|
} |
|
} |
|
if (ref($values) eq 'HASH') { |
|
my @todelete = &Apache::loncommon::get_env_multiple('form.linkprot_del'); |
|
my $maxnum = $env{'form.linkprot_maxnum'}; |
|
for (my $i=0; $i<$maxnum; $i++) { |
|
my $itemid = $env{'form.linkprot_id_'.$i}; |
|
$itemid =~ s/\D+//g; |
|
if ($itemid) { |
|
if (ref($values->{$itemid}) eq 'HASH') { |
|
push(@items,$i); |
|
$itemids{$i} = $itemid; |
|
if ((@todelete > 0) && (grep(/^$i$/,@todelete))) { |
|
$deletions{$itemid} = $values->{$itemid}->{'name'}; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
foreach my $idx (@items) { |
|
my $itemid = $itemids{$idx}; |
|
next unless ($itemid); |
|
if (exists($deletions{$itemid})) { |
|
$linkprot{$itemid} = $deletions{$itemid}; |
|
$haschanges{$itemid} = 1; |
|
next; |
|
} |
|
my %current; |
|
if (ref($values) eq 'HASH') { |
|
if (ref($values->{$itemid}) eq 'HASH') { |
|
foreach my $key (keys(%{$values->{$itemid}})) { |
|
$current{$key} = $values->{$itemid}->{$key}; |
|
} |
|
} |
|
} |
|
foreach my $inner ('name','lifetime','version') { |
|
my $formitem = 'form.linkprot_'.$inner.'_'.$idx; |
|
$env{$formitem} =~ s/(`)/'/g; |
|
if ($inner eq 'lifetime') { |
|
$env{$formitem} =~ s/[^\d.]//g; |
|
} |
|
unless ($idx eq 'add') { |
|
if ($current{$inner} ne $env{$formitem}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
if ($env{$formitem} ne '') { |
|
$linkprot{$itemid}{$inner} = $env{$formitem}; |
|
} |
|
} |
|
my $urlitem = 'form.linkprot_returnurl_'.$idx; |
|
my $urlparamname = 'form.linkprot_urlparam_'.$idx; |
|
if ($env{$urlitem} == 1) { |
|
$env{$urlparamname} =~ s/(`)/'/g; |
|
} elsif (exists($env{$urlparamname})) { |
|
$env{$urlparamname} = ''; |
|
} |
|
unless ($idx eq 'add') { |
|
if ((!$current{'returnurl'} && ($env{$urlparamname} ne '')) || |
|
($current{'returnurl'} && ($env{$urlparamname} eq ''))) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
if ($env{$urlparamname} ne '') { |
|
$linkprot{$itemid}{'returnurl'} = $env{$urlparamname}; |
|
} |
|
if ($ltiauth) { |
|
my $reqitem = 'form.linkprot_requser_'.$idx; |
|
$env{$reqitem} =~ s/(`)/'/g; |
|
unless ($idx eq 'add') { |
|
if ((!$current{'requser'} && $env{$reqitem}) || |
|
($current{'requser'} && !$env{$reqitem})) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
if ($env{$reqitem} == 1) { |
|
$linkprot{$itemid}{'requser'} = $env{$reqitem}; |
|
foreach my $inner ('mapuser','notstudent') { |
|
my $formitem = 'form.linkprot_'.$inner.'_'.$idx; |
|
$env{$formitem} =~ s/(`)/'/g; |
|
if ($inner eq 'mapuser') { |
|
if ($env{$formitem} eq 'other') { |
|
my $mapuser = $env{'form.linkprot_customuser_'.$idx}; |
|
$mapuser =~ s/(`)/'/g; |
|
$mapuser =~ s/^\s+|\s+$//g; |
|
if ($mapuser ne '') { |
|
$linkprot{$itemid}{$inner} = $mapuser; |
|
} else { |
|
delete($linkprot{$itemid}{'requser'}); |
|
last; |
|
} |
|
} elsif ($env{$formitem} eq 'sourcedid') { |
|
$linkprot{$itemid}{$inner} = 'lis_person_sourcedid'; |
|
} elsif ($env{$formitem} eq 'email') { |
|
$linkprot{$itemid}{$inner} = 'lis_person_contact_email_primary'; |
|
} |
|
} else { |
|
$linkprot{$itemid}{$inner} = $env{$formitem}; |
|
} |
|
unless ($idx eq 'add') { |
|
if ($current{$inner} ne $linkprot{$itemid}{$inner}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
unless ($switchserver) { |
|
my $keyitem = 'form.linkprot_key_'.$idx; |
|
$env{$keyitem} =~ s/(`)/'/g; |
|
unless ($idx eq 'add') { |
|
if ($current{'key'} ne $env{$keyitem}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
if ($env{$keyitem} ne '') { |
|
$linkprot{$itemid}{'key'} = $env{$keyitem}; |
|
} |
|
my $secretitem = 'form.linkprot_secret_'.$idx; |
|
$env{$secretitem} =~ s/(`)/'/g; |
|
if ($current{'usable'}) { |
|
if ($env{'form.linkprot_changesecret_'.$idx}) { |
|
if ($env{$secretitem} ne '') { |
|
if ($privnum && $cipher) { |
|
$linkprot{$itemid}{'secret'} = $cipher->encrypt_hex($env{$secretitem}); |
|
$linkprot{$itemid}{'cipher'} = $privnum; |
|
} else { |
|
$linkprot{$itemid}{'secret'} = $env{$secretitem}; |
|
} |
|
$haschanges{$itemid} = 1; |
|
} |
|
} else { |
|
$linkprot{$itemid}{'secret'} = $current{'secret'}; |
|
$linkprot{$itemid}{'cipher'} = $current{'cipher'}; |
|
} |
|
} elsif ($env{$secretitem} ne '') { |
|
if ($privnum && $cipher) { |
|
$linkprot{$itemid}{'secret'} = $cipher->encrypt_hex($env{$secretitem}); |
|
$linkprot{$itemid}{'cipher'} = $privnum; |
|
} else { |
|
$linkprot{$itemid}{'secret'} = $env{$secretitem}; |
|
} |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
if (keys(%haschanges)) { |
|
foreach my $entry (keys(%haschanges)) { |
|
$changes->{$entry} = $linkprot{$entry}; |
|
} |
|
if (ref($lastactref) eq 'HASH') { |
|
$lastactref->{'courselti'} = 1; |
|
} |
|
} |
|
return $errors; |
|
} |
|
|
|
sub get_linkprot_id { |
|
my ($cdom,$cnum,$name,$context) = @_; |
|
# get lock on lti db in course or linkprot db in domain |
|
my $lockhash = { |
|
lock => $env{'user.name'}. |
|
':'.$env{'user.domain'}, |
|
}; |
|
my $tries = 0; |
|
my $gotlock; |
|
if ($context eq 'domain') { |
|
$gotlock = &Apache::lonnet::newput_dom('linkprot',$lockhash,$cdom); |
|
} else { |
|
$gotlock = &Apache::lonnet::newput('lti',$lockhash,$cdom,$cnum); |
|
} |
|
my ($id,$error); |
|
while (($gotlock ne 'ok') && ($tries<10)) { |
|
$tries ++; |
|
sleep (0.1); |
|
if ($context eq 'domain') { |
|
$gotlock = &Apache::lonnet::newput_dom('linkprot',$lockhash,$cdom); |
|
} else { |
|
$gotlock = &Apache::lonnet::newput('lti',$lockhash,$cdom,$cnum); |
|
} |
|
} |
|
if ($gotlock eq 'ok') { |
|
my %currids; |
|
if ($context eq 'domain') { |
|
%currids = &Apache::lonnet::dump_dom('linkprot',$cdom); |
|
} else { |
|
%currids = &Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1); |
|
} |
|
if ($currids{'lock'}) { |
|
delete($currids{'lock'}); |
|
if (keys(%currids)) { |
|
my @curr = sort { $a <=> $b } keys(%currids); |
|
if ($curr[-1] =~ /^\d+$/) { |
|
$id = 1 + $curr[-1]; |
|
} else { |
|
$id = 1; |
|
} |
|
} else { |
|
$id = 1; |
|
} |
|
if ($id) { |
|
if ($context eq 'domain') { |
|
unless (&Apache::lonnet::newput_dom('linkprot',{ $id => $name },$cdom) eq 'ok') { |
|
$error = 'nostore'; |
|
} |
|
} else { |
|
unless (&Apache::lonnet::newput('lti',{ $id => $name },$cdom,$cnum) eq 'ok') { |
|
$error = 'nostore'; |
|
} |
|
} |
|
} else { |
|
$error = 'nonumber'; |
|
} |
|
} |
|
my $dellockoutcome; |
|
if ($context eq 'domain') { |
|
$dellockoutcome = &Apache::lonnet::del_dom('linkprot',['lock'],$cdom); |
|
} else { |
|
$dellockoutcome = &Apache::lonnet::del('lti',['lock'],$cdom,$cnum); |
|
} |
|
} else { |
|
$error = 'nolock'; |
|
} |
|
return ($id,$error); |
|
} |
|
|
|
sub get_credentials { |
|
my ($cdom,$cnum,$type,$context) = @_; |
|
my ($cipher,$privnum,$home); |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
if ($context eq 'domain') { |
|
$home = &Apache::lonnet::domain($cdom,'primary'); |
|
} else { |
|
$home = &Apache::lonnet::homeserver($cnum,$cdom); |
|
} |
|
my ($hostskey,$domkey,$crskey); |
|
if ($type eq 'ltitools') { |
|
$hostskey = 'toolprivhosts'; |
|
$domkey = 'toolenc_dom'; |
|
$crskey = 'toolenc_crs'; |
|
} else { |
|
$hostskey = 'ltiprivhosts'; |
|
$domkey = 'linkprotenc_dom'; |
|
$crskey = 'linkprotenc_crs'; |
|
} |
|
if ((($context eq 'domain') && ($domdefs{$domkey})) || |
|
(($context eq 'course') && ($domdefs{$crskey}))) { |
|
unless (($home eq 'no_host') || ($home eq '')) { |
|
if (grep(/^\Q$home\E$/,@ids)) { |
|
if (ref($domdefs{$hostskey}) eq 'ARRAY') { |
|
if (grep(/^\Q$home\E$/,@{$domdefs{$hostskey}})) { |
|
my %privhash = &Apache::lonnet::restore_dom($type,'private',$cdom,$home,1); |
|
my $privkey = $privhash{'key'}; |
|
$privnum = $privhash{'version'}; |
|
if (($privnum) && ($privkey ne '')) { |
|
$cipher = Crypt::CBC->new({'key' => $privkey, |
|
'cipher' => 'DES'}); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($cipher,$privnum); |
|
} |
|
|
|
sub process_ltitools { |
|
my ($r,$cdom,$cnum,$values,$changes,$context,$lastactref,$configuserok,$lonhost, |
|
$author_ok,$confname) = @_; |
|
my (%currconfig,$newid,@allpos,%changes,%ltitools,$errors); |
|
|
|
my (%posslti,%possfield); |
|
my @courseroles = ('cc','in','ta','ep','st'); |
|
my @ltiroles = qw(Instructor ContentDeveloper TeachingAssistant Learner); |
|
map { $posslti{$_} = 1; } @ltiroles; |
|
my @allfields = ('fullname','firstname','lastname','email','user','roles'); |
|
map { $possfield{$_} = 1; } @allfields; |
|
|
|
my ($dest,$privnum,$cipher); |
|
|
|
($cipher,$privnum) = &get_credentials($cdom,$cnum,'ltitools',$context); |
|
if ($context eq 'domain') { |
|
$dest = '/adm/domainprefs'; |
|
} else { |
|
$dest = '/adm/courseprefs'; |
|
} |
|
my $switchserver = &check_switchserver($cdom,$cnum,$context,$dest); |
|
|
|
my (@allpos,@items,%deletions,%itemids,%haschanges); |
|
if ($env{'form.ltitools_add'}) { |
|
my $title = $env{'form.ltitools_add_title'}; |
|
$title =~ s/(`)/'/g; |
|
my ($newid,$error) = &get_ltitools_id($context,$cdom,$cnum,$title); |
|
if ($newid) { |
|
my $position = $env{'form.ltitools_add_pos'}; |
|
$position =~ s/\D+//g; |
|
if ($position ne '') { |
|
$allpos[$position] = $newid; |
|
} |
|
$haschanges{$newid} = 1; |
|
foreach my $item ('title','url','lifetime') { |
|
$env{'form.ltitools_add_'.$item} =~ s/(`)/'/g; |
|
if ($item eq 'lifetime') { |
|
$env{'form.ltitools_add_'.$item} =~ s/[^\d.]//g; |
|
} |
|
if ($env{'form.ltitools_add_'.$item}) { |
|
$ltitools{$newid}{$item} = $env{'form.ltitools_add_'.$item}; |
|
} |
|
} |
|
if ($env{'form.ltitools_add_version'} eq 'LTI-1p0') { |
|
$ltitools{$newid}{'version'} = $env{'form.ltitools_add_version'}; |
|
} |
|
if ($env{'form.ltitools_add_msgtype'} eq 'basic-lti-launch-request') { |
|
$ltitools{$newid}{'msgtype'} = $env{'form.ltitools_add_msgtype'}; |
|
} |
|
if ($env{'form.ltitools_add_sigmethod'} eq 'HMAC-SHA256') { |
|
$ltitools{$newid}{'sigmethod'} = $env{'form.ltitools_add_sigmethod'}; |
|
} else { |
|
$ltitools{$newid}{'sigmethod'} = 'HMAC-SHA1'; |
|
} |
|
foreach my $item ('width','height','linktext','explanation') { |
|
$env{'form.ltitools_add_'.$item} =~ s/^\s+//; |
|
$env{'form.ltitools_add_'.$item} =~ s/\s+$//; |
|
if (($item eq 'width') || ($item eq 'height')) { |
|
if ($env{'form.ltitools_add_'.$item} =~ /^\d+$/) { |
|
$ltitools{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item}; |
|
} |
|
} else { |
|
if ($env{'form.ltitools_add_'.$item} ne '') { |
|
$ltitools{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item}; |
|
} |
|
} |
|
} |
|
if ($env{'form.ltitools_add_target'} eq 'window') { |
|
$ltitools{$newid}{'display'}{'target'} = $env{'form.ltitools_add_target'}; |
|
} elsif ($env{'form.ltitools_add_target'} eq 'tab') { |
|
$ltitools{$newid}{'display'}{'target'} = $env{'form.ltitools_add_target'}; |
|
} else { |
|
$ltitools{$newid}{'display'}{'target'} = 'iframe'; |
|
} |
|
foreach my $item ('passback','roster') { |
|
if ($env{'form.ltitools_'.$item.'_add'}) { |
|
$ltitools{$newid}{$item} = 1; |
|
if ($env{'form.ltitools_'.$item.'valid_add'} ne '') { |
|
my $lifetime = $env{'form.ltitools_'.$item.'valid_add'}; |
|
$lifetime =~ s/^\s+|\s+$//g; |
|
if ($lifetime =~ /^\d+\.?\d*$/) { |
|
$ltitools{$newid}{$item.'valid'} = $lifetime; |
|
} |
|
} |
|
} |
|
} |
|
if ($env{'form.ltitools_add_image.filename'} ne '') { |
|
my ($imageurl,$error) = |
|
&process_ltitools_image($r,$context,$cdom,$cnum,$confname,'ltitools_add_image', |
|
$newid,$configuserok,$lonhost,$author_ok); |
|
if ($imageurl) { |
|
$ltitools{$newid}{'image'} = $imageurl; |
|
} |
|
if ($error) { |
|
&Apache::lonnet::logthis($error); |
|
$errors .= '<li><span class="LC_error">'.$error.'</span></li>'; |
|
} |
|
} |
|
my @fields = &Apache::loncommon::get_env_multiple('form.ltitools_add_fields'); |
|
foreach my $field (@fields) { |
|
if ($possfield{$field}) { |
|
if ($field eq 'roles') { |
|
foreach my $role (@courseroles) { |
|
my $choice = $env{'form.ltitools_add_roles_'.$role}; |
|
if (($choice ne '') && ($posslti{$choice})) { |
|
$ltitools{$newid}{'roles'}{$role} = $choice; |
|
if ($role eq 'cc') { |
|
$ltitools{$newid}{'roles'}{'co'} = $choice; |
|
} |
|
} |
|
} |
|
} else { |
|
$ltitools{$newid}{'fields'}{$field} = 1; |
|
} |
|
} |
|
} |
|
if (ref($ltitools{$newid}{'fields'}) eq 'HASH') { |
|
if ($ltitools{$newid}{'fields'}{'user'}) { |
|
if ($env{'form.ltitools_add_userincdom'}) { |
|
$ltitools{$newid}{'incdom'} = 1; |
|
} |
|
} |
|
} |
|
my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_add_courseconfig'); |
|
foreach my $item (@courseconfig) { |
|
$ltitools{$newid}{'crsconf'}{$item} = 1; |
|
} |
|
if ($env{'form.ltitools_add_custom'}) { |
|
my $name = $env{'form.ltitools_add_custom_name'}; |
|
my $value = $env{'form.ltitools_add_custom_value'}; |
|
$value =~ s/(`)/'/g; |
|
$name =~ s/(`)/'/g; |
|
$ltitools{$newid}{'custom'}{$name} = $value; |
|
} |
|
unless ($switchserver) { |
|
my $keyitem = 'form.ltitools_add_key'; |
|
$env{$keyitem} =~ s/(`)/'/g; |
|
if ($env{$keyitem} ne '') { |
|
$ltitools{$newid}{'key'} = $env{$keyitem}; |
|
} |
|
my $secretitem = 'form.ltitools_secret_add'; |
|
$env{$secretitem} =~ s/(`)/'/g; |
|
if ($env{$secretitem} ne '') { |
|
if ($privnum && $cipher) { |
|
$ltitools{$newid}{'secret'} = $cipher->encrypt_hex($env{$secretitem}); |
|
$ltitools{$newid}{'cipher'} = $privnum; |
|
} else { |
|
$ltitools{$newid}{'secret'} = $env{$secretitem}; |
|
} |
|
} |
|
} |
|
} else { |
|
$errors .= '<li><span class="LC_error">'. |
|
&mt('Failed to acquire unique ID for new external tool'). |
|
'</span></li>'; |
|
} |
|
} |
|
if (ref($values) eq 'HASH') { |
|
my %deletions; |
|
my @todelete = &Apache::loncommon::get_env_multiple('form.ltitools_del'); |
|
if (@todelete) { |
|
map { $deletions{$_} = 1; } @todelete; |
|
} |
|
my %customadds; |
|
my @newcustom = &Apache::loncommon::get_env_multiple('form.ltitools_customadd'); |
|
if (@newcustom) { |
|
map { $customadds{$_} = 1; } @newcustom; |
|
} |
|
my %imgdeletions; |
|
my @todeleteimages = &Apache::loncommon::get_env_multiple('form.ltitools_image_del'); |
|
if (@todeleteimages) { |
|
map { $imgdeletions{$_} = 1; } @todeleteimages; |
|
} |
|
my $maxnum = $env{'form.ltitools_maxnum'}; |
|
for (my $i=0; $i<=$maxnum; $i++) { |
|
my $itemid = $env{'form.ltitools_id_'.$i}; |
|
$itemid =~ s/\D+//g; |
|
if (ref($values->{$itemid}) eq 'HASH') { |
|
if ($deletions{$itemid}) { |
|
if ($values->{$itemid}{'image'}) { |
|
#FIXME need to obsolete item in RES space |
|
} |
|
$haschanges{$itemid} = $values->{$itemid}{'title'}; |
|
next; |
|
} else { |
|
my $newpos = $env{'form.ltitools_'.$itemid}; |
|
$newpos =~ s/\D+//g; |
|
foreach my $item ('title','url','lifetime') { |
|
$ltitools{$itemid}{$item} = $env{'form.ltitools_'.$item.'_'.$i}; |
|
if ($values->{$itemid}{$item} ne $ltitools{$itemid}{$item}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
if ($env{'form.ltitools_version_'.$i} eq 'LTI-1p0') { |
|
$ltitools{$itemid}{'version'} = $env{'form.ltitools_version_'.$i}; |
|
} |
|
if ($env{'form.ltitools_msgtype_'.$i} eq 'basic-lti-launch-request') { |
|
$ltitools{$itemid}{'msgtype'} = $env{'form.ltitools_msgtype_'.$i}; |
|
} |
|
if ($env{'form.ltitools_sigmethod_'.$i} eq 'HMAC-SHA256') { |
|
$ltitools{$itemid}{'sigmethod'} = $env{'form.ltitools_sigmethod_'.$i}; |
|
} else { |
|
$ltitools{$itemid}{'sigmethod'} = 'HMAC-SHA1'; |
|
} |
|
if ($values->{$itemid}{'sigmethod'} eq '') { |
|
if ($ltitools{$itemid}{'sigmethod'} ne 'HMAC-SHA1') { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} elsif ($values->{$itemid}{'sigmethod'} ne $ltitools{$itemid}{'sigmethod'}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
foreach my $size ('width','height') { |
|
$env{'form.ltitools_'.$size.'_'.$i} =~ s/^\s+//; |
|
$env{'form.ltitools_'.$size.'_'.$i} =~ s/\s+$//; |
|
if ($env{'form.ltitools_'.$size.'_'.$i} =~ /^\d+$/) { |
|
$ltitools{$itemid}{'display'}{$size} = $env{'form.ltitools_'.$size.'_'.$i}; |
|
if (ref($values->{$itemid}{'display'}) eq 'HASH') { |
|
if ($values->{$itemid}{'display'}{$size} ne $ltitools{$itemid}{'display'}{$size}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} else { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} elsif (ref($values->{$itemid}{'display'}) eq 'HASH') { |
|
if ($values->{$itemid}{'display'}{$size} ne '') { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
foreach my $item ('linktext','explanation') { |
|
$env{'form.ltitools_'.$item.'_'.$i} =~ s/^\s+//; |
|
$env{'form.ltitools_'.$item.'_'.$i} =~ s/\s+$//; |
|
if ($env{'form.ltitools_'.$item.'_'.$i} ne '') { |
|
$ltitools{$itemid}{'display'}{$item} = $env{'form.ltitools_'.$item.'_'.$i}; |
|
if (ref($values->{$itemid}{'display'}) eq 'HASH') { |
|
if ($values->{$itemid}{'display'}{$item} ne $ltitools{$itemid}{'display'}{$item}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} else { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} elsif (ref($values->{$itemid}{'display'}) eq 'HASH') { |
|
if ($values->{$itemid}{'display'}{$item} ne '') { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
if ($env{'form.ltitools_target_'.$i} eq 'window') { |
|
$ltitools{$itemid}{'display'}{'target'} = $env{'form.ltitools_target_'.$i}; |
|
} elsif ($env{'form.ltitools_target_'.$i} eq 'tab') { |
|
$ltitools{$itemid}{'display'}{'target'} = $env{'form.ltitools_target_'.$i}; |
|
} else { |
|
$ltitools{$itemid}{'display'}{'target'} = 'iframe'; |
|
} |
|
if (ref($values->{$itemid}{'display'}) eq 'HASH') { |
|
if ($values->{$itemid}{'display'}{'target'} ne $ltitools{$itemid}{'display'}{'target'}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} else { |
|
$haschanges{$itemid} = 1; |
|
} |
|
foreach my $extra ('passback','roster') { |
|
if ($env{'form.ltitools_'.$extra.'_'.$i}) { |
|
$ltitools{$itemid}{$extra} = 1; |
|
if ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') { |
|
my $lifetime = $env{'form.ltitools_'.$extra.'valid_'.$i}; |
|
$lifetime =~ s/^\s+|\s+$//g; |
|
if ($lifetime =~ /^\d+\.?\d*$/) { |
|
$ltitools{$itemid}{$extra.'valid'} = $lifetime; |
|
} |
|
} |
|
} |
|
if ($values->{$itemid}{$extra} ne $ltitools{$itemid}{$extra}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
if ($values->{$itemid}{$extra.'valid'} ne $ltitools{$itemid}{$extra.'valid'}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig_'.$i); |
|
foreach my $item ('label','title','target','linktext','explanation','append') { |
|
if (grep(/^\Q$item\E$/,@courseconfig)) { |
|
$ltitools{$itemid}{'crsconf'}{$item} = 1; |
|
if (ref($values->{$itemid}{'crsconf'}) eq 'HASH') { |
|
if ($values->{$itemid}{'crsconf'}{$item} ne $ltitools{$itemid}{'crsconf'}{$item}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} else { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
my @fields = &Apache::loncommon::get_env_multiple('form.ltitools_fields_'.$i); |
|
foreach my $field (@fields) { |
|
if ($possfield{$field}) { |
|
if ($field eq 'roles') { |
|
foreach my $role (@courseroles) { |
|
my $choice = $env{'form.ltitools_roles_'.$role.'_'.$i}; |
|
if (($choice ne '') && ($posslti{$choice})) { |
|
$ltitools{$itemid}{'roles'}{$role} = $choice; |
|
if ($role eq 'cc') { |
|
$ltitools{$itemid}{'roles'}{'co'} = $choice; |
|
} |
|
} |
|
if (ref($values->{$itemid}{'roles'}) eq 'HASH') { |
|
if ($values->{$itemid}{'roles'}{$role} ne $ltitools{$itemid}{'roles'}{$role}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} elsif ($ltitools{$itemid}{'roles'}{$role}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} else { |
|
$ltitools{$itemid}{'fields'}{$field} = 1; |
|
if (ref($values->{$itemid}{'fields'}) eq 'HASH') { |
|
if ($values->{$itemid}{'fields'}{$field} ne $ltitools{$itemid}{'fields'}{$field}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} else { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
} |
|
if (ref($ltitools{$itemid}{'fields'}) eq 'HASH') { |
|
if ($ltitools{$itemid}{'fields'}{'user'}) { |
|
if ($env{'form.ltitools_userincdom_'.$i}) { |
|
$ltitools{$itemid}{'incdom'} = 1; |
|
} |
|
if ($values->{$itemid}{'incdom'} ne $ltitools{$itemid}{'incdom'}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
$allpos[$newpos] = $itemid; |
|
} |
|
if ($imgdeletions{$itemid}) { |
|
$haschanges{$itemid} = 1; |
|
if ($context eq 'course') { |
|
my $currimgurl = $values->{$itemid}{'image'}; |
|
if ($currimgurl =~ m{^(\Q/uploaded/$cdom/$cnum/toollogo/$itemid\E)/([^/]+)$}) { |
|
my ($path,$imagefile) = ($1,$2); |
|
if ($imagefile =~ /^tn\-(.+)$/) { |
|
my $origimg = $1; |
|
&Apache::lonnet::removeuploadedurl("$path/$origimg"); |
|
} |
|
&Apache::lonnet::removeuploadedurl($currimgurl); |
|
} |
|
} |
|
#FIXME need to obsolete item in RES space |
|
} elsif ($env{'form.ltitools_image_'.$i.'.filename'}) { |
|
my $currimgurl = $values->{$itemid}{'image'}; |
|
my ($imgurl,$error) = &process_ltitools_image($r,$context,$cdom,$cnum,$confname,'ltitools_image_'.$i, |
|
$itemid,$configuserok,$lonhost,$author_ok,$currimgurl); |
|
if ($imgurl) { |
|
$ltitools{$itemid}{'image'} = $imgurl; |
|
$haschanges{$itemid} = 1; |
|
} |
|
if ($error) { |
|
&Apache::lonnet::logthis($error); |
|
$errors .= '<li><span class="LC_error">'.$error.'</span></li>'; |
|
} |
|
} elsif ($values->{$itemid}{'image'}) { |
|
$ltitools{$itemid}{'image'} = $values->{$itemid}{'image'}; |
|
} |
|
if ($customadds{$i}) { |
|
my $name = $env{'form.ltitools_custom_name_'.$i}; |
|
$name =~ s/(`)/'/g; |
|
$name =~ s/^\s+//; |
|
$name =~ s/\s+$//; |
|
my $value = $env{'form.ltitools_custom_value_'.$i}; |
|
$value =~ s/(`)/'/g; |
|
$value =~ s/^\s+//; |
|
$value =~ s/\s+$//; |
|
if ($name ne '') { |
|
$ltitools{$itemid}{'custom'}{$name} = $value; |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
my %customdels; |
|
my @customdeletions = &Apache::loncommon::get_env_multiple('form.ltitools_customdel_'.$i); |
|
if (@customdeletions) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
map { $customdels{$_} = 1; } @customdeletions; |
|
if (ref($values->{$itemid}{'custom'}) eq 'HASH') { |
|
foreach my $key (keys(%{$values->{$itemid}{'custom'}})) { |
|
unless ($customdels{$key}) { |
|
if ($env{'form.ltitools_customval_'.$key.'_'.$i} ne '') { |
|
$ltitools{$itemid}{'custom'}{$key} = $env{'form.ltitools_customval_'.$key.'_'.$i}; |
|
} |
|
if ($values->{$itemid}{'custom'}{$key} ne $env{'form.ltitools_customval_'.$key.'_'.$i}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
} |
|
unless ($switchserver) { |
|
my $keyitem = 'form.ltitools_key_'.$i; |
|
$env{$keyitem} =~ s/(`)/'/g; |
|
if ($values->{$itemid}{'key'} ne $env{$keyitem}) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
if ($env{$keyitem} ne '') { |
|
$ltitools{$itemid}{'key'} = $env{$keyitem}; |
|
} |
|
my $secretitem = 'form.ltitools_secret_'.$i; |
|
$env{$secretitem} =~ s/(`)/'/g; |
|
if ($values->{$itemid}{'usable'}) { |
|
if ($env{'form.ltitools_changesecret_'.$i}) { |
|
if ($env{$secretitem} ne '') { |
|
if ($privnum && $cipher) { |
|
$ltitools{$itemid}{'secret'} = $cipher->encrypt_hex($env{$secretitem}); |
|
$ltitools{$itemid}{'cipher'} = $privnum; |
|
} else { |
|
$ltitools{$itemid}{'secret'} = $env{$secretitem}; |
|
} |
|
$haschanges{$itemid} = 1; |
|
} |
|
} else { |
|
$ltitools{$itemid}{'secret'} = $values->{$itemid}{'secret'}; |
|
$ltitools{$itemid}{'cipher'} = $values->{$itemid}{'cipher'}; |
|
} |
|
} elsif ($env{$secretitem} ne '') { |
|
if ($privnum && $cipher) { |
|
$ltitools{$itemid}{'secret'} = $cipher->encrypt_hex($env{$secretitem}); |
|
$ltitools{$itemid}{'cipher'} = $privnum; |
|
} else { |
|
$ltitools{$itemid}{'secret'} = $env{$secretitem}; |
|
} |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
unless ($haschanges{$itemid}) { |
|
foreach my $key (keys(%{$values->{$itemid}})) { |
|
if (ref($values->{$itemid}{$key}) eq 'HASH') { |
|
if (ref($ltitools{$itemid}{$key}) eq 'HASH') { |
|
foreach my $innerkey (keys(%{$values->{$itemid}{$key}})) { |
|
unless (exists($ltitools{$itemid}{$key}{$innerkey})) { |
|
$haschanges{$itemid} = 1; |
|
last; |
|
} |
|
} |
|
} elsif (keys(%{$values->{$itemid}{$key}}) > 0) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
last if ($haschanges{$itemid}); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if (@allpos > 0) { |
|
my $idx = 0; |
|
foreach my $itemid (@allpos) { |
|
if ($itemid ne '') { |
|
$ltitools{$itemid}{'order'} = $idx; |
|
if (ref($values) eq 'HASH') { |
|
if (ref($values->{$itemid}) eq 'HASH') { |
|
if ($values->{$itemid}{'order'} ne $idx) { |
|
$haschanges{$itemid} = 1; |
|
} |
|
} |
|
} |
|
$idx ++; |
|
} |
|
} |
|
} |
|
if (keys(%haschanges)) { |
|
foreach my $entry (keys(%haschanges)) { |
|
$changes->{$entry} = $ltitools{$entry}; |
|
} |
|
if (ref($lastactref) eq 'HASH') { |
|
$lastactref->{'courseltitools'} = 1; |
|
} |
|
} |
|
return $errors; |
|
} |
|
|
|
sub get_ltitools_id { |
|
my ($context,$cdom,$cnum,$title) = @_; |
|
my ($lockhash,$tries,$gotlock,$id,$error); |
|
|
|
# get lock on ltitools db |
|
$lockhash = { |
|
lock => $env{'user.name'}. |
|
':'.$env{'user.domain'}, |
|
}; |
|
$tries = 0; |
|
if ($context eq 'domain') { |
|
$gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom); |
|
} else { |
|
$gotlock = &Apache::lonnet::newput('ltitools',$lockhash,$cdom,$cnum); |
|
} |
|
while (($gotlock ne 'ok') && ($tries<10)) { |
|
$tries ++; |
|
sleep (0.1); |
|
if ($context eq 'domain') { |
|
$gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom); |
|
} else { |
|
$gotlock = &Apache::lonnet::newput('ltitools',$lockhash,$cdom,$cnum); |
|
} |
|
} |
|
if ($gotlock eq 'ok') { |
|
my %currids; |
|
if ($context eq 'domain') { |
|
%currids = &Apache::lonnet::dump_dom('ltitools',$cdom); |
|
} else { |
|
%currids = &Apache::lonnet::dump('ltitools',$cdom,$cnum); |
|
} |
|
if ($currids{'lock'}) { |
|
delete($currids{'lock'}); |
|
if (keys(%currids)) { |
|
my @curr = sort { $a <=> $b } keys(%currids); |
|
if ($curr[-1] =~ /^\d+$/) { |
|
$id = 1 + $curr[-1]; |
|
} |
|
} else { |
|
$id = 1; |
|
} |
|
if ($id) { |
|
if ($context eq 'domain') { |
|
unless (&Apache::lonnet::newput_dom('ltitools',{ $id => $title },$cdom) eq 'ok') { |
|
$error = 'nostore'; |
|
} |
|
} else { |
|
unless (&Apache::lonnet::newput('ltitools',{ $id => $title },$cdom,$cnum) eq 'ok') { |
|
$error = 'nostore'; |
|
} |
|
} |
|
} else { |
|
$error = 'nonumber'; |
|
} |
|
} |
|
my $dellockoutcome; |
|
if ($context eq 'domain') { |
|
$dellockoutcome = &Apache::lonnet::del_dom('ltitools',['lock'],$cdom); |
|
} else { |
|
$dellockoutcome = &Apache::lonnet::del('ltitools',['lock'],$cdom,$cnum); |
|
} |
|
} else { |
|
$error = 'nolock'; |
|
} |
|
return ($id,$error); |
|
} |
|
|
|
sub process_ltitools_image { |
|
my ($r,$context,$dom,$cnum,$confname,$caller,$itemid,$configuserok,$switch,$author_ok,$currimg) = @_; |
|
my $filename = $env{'form.'.$caller.'.filename'}; |
|
my ($error,$url); |
|
my ($width,$height) = (21,21); |
|
if ($configuserok eq 'ok') { |
|
if ($switch) { |
|
$error = &mt('Upload of Tool Provider (LTI) icon is not permitted to this server: [_1]', |
|
$switch); |
|
} elsif ($author_ok eq 'ok') { |
|
my ($result,$imageurl,$madethumb); |
|
if ($context eq 'domain') { |
|
($result,$imageurl,$madethumb) = |
|
&Apache::lonconfigsettings::publishlogo($r,'upload',$caller,$dom,$confname, |
|
"ltitools/$itemid/icon",$width,$height); |
|
} else { |
|
($result,$imageurl,$madethumb) = &processlogo($dom,$cnum,$caller,$currimg,$itemid,$width,$height); |
|
} |
|
if ($result eq 'ok') { |
|
if ($madethumb) { |
|
my ($path,$imagefile) = ($imageurl =~ m{^(.+)/([^/]+)$}); |
|
my $imagethumb = "$path/tn-".$imagefile; |
|
$url = $imagethumb; |
|
} else { |
|
$url = $imageurl; |
|
} |
|
} else { |
|
if ($context eq 'domain') { |
|
$error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$filename,$result); |
|
} else { |
|
$error = &mt("Upload of [_1] failed because an error occurred. Error was: [_2].",$filename,$result); |
|
} |
|
} |
|
} else { |
|
$error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$author_ok); |
|
} |
|
} else { |
|
$error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$configuserok); |
|
} |
|
return ($url,$error); |
|
} |
|
|
|
sub processlogo { |
|
my ($dom,$cnum,$caller,$currimg,$itemid,$width,$height) = @_; |
|
my ($result,$imageurl,$madethumb); |
|
if ($env{"form.$caller.filename"} ne '') { |
|
unless ($caller eq 'ltitools_add_image') { |
|
if ($currimg =~ m{^(\Q/uploaded/$dom/$cnum/toollogo/$itemid\E)/([^/]+)$}) { |
|
my ($path,$imagefile) = ($1,$2); |
|
if ($imagefile =~ /^tn\-(.+)$/) { |
|
my $origimg = $1; |
|
&Apache::lonnet::removeuploadedurl("$path/$origimg"); |
|
} |
|
&Apache::lonnet::removeuploadedurl($currimg); |
|
} |
|
} |
|
$imageurl = &Apache::lonnet::userfileupload($caller,'toollogo',"toollogo/$itemid", |
|
'','','',$cnum,$dom,$width,$height); |
|
if ($imageurl =~ m{^(\Q/uploaded/$dom/$cnum/toollogo/$itemid\E)/([^/]+)$}) { |
|
my ($path,$imagefile) = ($1,$2); |
|
$result = 'ok'; |
|
my $thumburl = "$path/tn-".$imagefile; |
|
my ($rtncode,$info); |
|
my $res = &Apache::lonnet::getuploaded('HEAD',$thumburl,$dom,$cnum,\$info,\$rtncode); |
|
if ($res eq 'ok') { |
|
$madethumb = 1; |
|
} |
|
} elsif ($imageurl eq '/adm/notfound.html') { |
|
undef($imageurl); |
|
$result = 'store failed'; |
|
} elsif ($imageurl =~ /^error: (.+)$/) { |
|
$result = $1; |
|
} |
|
} |
|
return ($result,$imageurl,$madethumb); |
} |
} |
|
|
sub get_sec_str { |
sub get_sec_str { |
Line 1280 sub check_clone {
|
Line 2537 sub check_clone {
|
sub store_changes { |
sub store_changes { |
my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_; |
my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_; |
my ($chome,$output); |
my ($chome,$output); |
my (%storehash,@delkeys,@need_env_update,@oldcloner); |
my (%storehash,@delkeys,@need_env_update,@oldcloner,%oldlinkprot,%oldltitools); |
if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) { |
if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) { |
|
if (ref($values->{'linkprot'}) eq 'HASH') { |
|
%oldlinkprot = %{$values->{'linkprot'}}; |
|
} |
|
delete($values->{'linkprot'}); |
|
if (ref($values->{'ltitools'}) eq 'HASH') { |
|
%oldltitools = %{$values->{'ltitools'}}; |
|
} |
%storehash = %{$values}; |
%storehash = %{$values}; |
} else { |
} else { |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
Line 1291 sub store_changes {
|
Line 2555 sub store_changes {
|
} |
} |
return $output; |
return $output; |
} |
} |
|
my ($numchanges,$skipstore); |
|
if (ref($changes) eq 'HASH') { |
|
$numchanges = scalar(keys(%{$changes})); |
|
if (($numchanges == 1) && (exists($changes->{'linkprot'}))) { |
|
$skipstore = 1; |
|
} elsif (($numchanges == 1) && (exists($changes->{'ltitools'}))) { |
|
$skipstore = 1; |
|
} elsif (!$numchanges) { |
|
if ($crstype eq 'Community') { |
|
$output = &mt('No changes made to community settings.'); |
|
} else { |
|
$output = &mt('No changes made to course settings.'); |
|
} |
|
return $output; |
|
} |
|
} |
my %yesno = ( |
my %yesno = ( |
hidefromcat => '1', |
hidefromcat => '1', |
problem_stream_switch => '1', |
problem_stream_switch => '1', |
Line 1316 sub store_changes {
|
Line 2596 sub store_changes {
|
"'$storehash{$key}'")).'</li>'; |
"'$storehash{$key}'")).'</li>'; |
} |
} |
} |
} |
|
} elsif ($item eq 'linkprot') { |
|
$output .= &store_linkprot($cdom,$cnum,'course',$changes->{$item},\%oldlinkprot); |
|
} elsif ($item eq 'ltitools') { |
|
$output .= &store_ltitools($cdom,$cnum,'course',$changes->{$item},\%oldltitools); |
} else { |
} else { |
if (ref($prefs->{$item}->{'ordered'}) eq 'ARRAY') { |
if (ref($prefs->{$item}->{'ordered'}) eq 'ARRAY') { |
my @settings = @{$prefs->{$item}->{'ordered'}}; |
my @settings = @{$prefs->{$item}->{'ordered'}}; |
Line 1347 sub store_changes {
|
Line 2631 sub store_changes {
|
if ($msg ne '') { |
if ($msg ne '') { |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt($displayname)).'<ul class="LC_success">'.$msg.'</ul></li>'; |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt($displayname)).'<ul class="LC_success">'.$msg.'</ul></li>'; |
} |
} |
|
} elsif ($key eq 'timezone') { |
|
next unless ((exists($changes->{$item}{$key})) || (exists($changes->{$item}{'tzover'}))); |
|
my ($displayname,$text); |
|
$text = $prefs->{$item}->{'itemtext'}{$key}; |
|
my $displayval; |
|
if (exists($changes->{$item}{$key})) { |
|
$displayname = &mt($text); |
|
$storehash{$key} = $changes->{$item}{$key}; |
|
if ($changes->{$item}{$key} ne '') { |
|
$displayval = '<b>'.$changes->{$item}{$key}.'</b>'; |
|
} else { |
|
push(@delkeys,$key); |
|
if (exists($values->{'tzover'})) { |
|
push(@delkeys,'tzover'); |
|
} |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]', |
|
'<i>'.$displayname.'</i>')).'</li>'; |
|
} |
|
} |
|
unless (grep(/^\Q$key\E$/,@delkeys)) { |
|
if (exists($changes->{$item}{'tzover'})) { |
|
$storehash{'tzover'} = $changes->{$item}{'tzover'}; |
|
my $tzovertext; |
|
if ($changes->{$item}{'tzover'} ne '') { |
|
$tzovertext = &mt('Course Time Zone overrides individual user preference'); |
|
} else { |
|
push(@delkeys,'tzover'); |
|
$tzovertext = &mt('Course Time Zone does not override individual user preference'); |
|
} |
|
if ($displayval eq '') { |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success($tzovertext).'</li>'; |
|
} else { |
|
$displayval .= '<br />'.(' 'x5).$tzovertext; |
|
} |
|
} |
|
if ($displayval ne '') { |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', |
|
'<i>'.$displayname.'</i>',$displayval)).'</li>'; |
|
} |
|
} |
} else { |
} else { |
next if (!exists($changes->{$item}{$key})); |
next if (!exists($changes->{$item}{$key})); |
my ($displayname,$text); |
my ($displayname,$text); |
$text = $prefs->{$item}->{'itemtext'}{$key}; |
$text = $prefs->{$item}->{'itemtext'}{$key}; |
my $displayval; |
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}; |
$displayval = $changes->{$item}{$key}; |
} |
} |
if ($item eq 'feedback') { |
if ($item eq 'feedback') { |
Line 1432 sub store_changes {
|
Line 2756 sub store_changes {
|
} |
} |
} |
} |
$displayname = &mt($text); |
$displayname = &mt($text); |
|
} elsif ($item eq 'lti') { |
|
if ($key eq 'lti.lcmenu') { |
|
if ($changes->{$item}{$key} eq 'none') { |
|
$displayval = &mt('None of the configurable menu items displayed'); |
|
} else { |
|
my %ltititles = <imenu_titles(); |
|
$displayval = join(', ', map { $ltititles{$_}; } split(/,/,$changes->{$item}{$key})); |
|
} |
|
} else { |
|
if ($changes->{$item}{$key} eq '1') { |
|
$displayval = &mt('Yes'); |
|
} elsif ($changes->{$item}{$key} eq '') { |
|
$displayval = &mt('No'); |
|
} |
|
} |
|
$displayname = &mt($text); |
|
} elsif ($item eq 'menuitems') { |
|
unless ($changes->{$item}{$key} eq '') { |
|
if ($key eq 'menudefault') { |
|
$displayname = &mt('Default collection of menu items'); |
|
$displayval = &mt('Collection: [_1]', |
|
$changes->{$item}{$key}); |
|
} elsif ($key eq 'menucollections') { |
|
$displayval = &menucollections_display($changes->{$item}{$key}); |
|
} |
|
} |
} else { |
} else { |
$displayname = &mt($text); |
$displayname = &mt($text); |
} |
} |
Line 1444 sub store_changes {
|
Line 2794 sub store_changes {
|
$displayval = &Apache::lonlocal::locallocaltime($displayval); |
$displayval = &Apache::lonlocal::locallocaltime($displayval); |
} elsif ($key eq 'categories') { |
} elsif ($key eq 'categories') { |
$displayval = $env{'form.categories_display'}; |
$displayval = $env{'form.categories_display'}; |
} elsif (($key eq 'canuse_pdfforms') || ($key eq 'usejsme') || ($key eq 'uselcmath')) { |
} elsif (($key eq 'canuse_pdfforms') || ($key eq 'usejsme') || |
|
($key eq 'uselcmath') || ($key eq 'inline_chem')) { |
if ($changes->{$item}{$key} eq '1') { |
if ($changes->{$item}{$key} eq '1') { |
$displayval = &mt('Yes'); |
$displayval = &mt('Yes'); |
} elsif ($changes->{$item}{$key} eq '0') { |
} elsif ($changes->{$item}{$key} eq '0') { |
$displayval = &mt('No'); |
$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', |
|
"'<b>","</b>'",'<br />'); |
|
} else { |
|
$displayval = &mt('[_1]In tab[_2],[_3] with new tab for each external resource in course', |
|
"'<b>","</b>'",'<br />'); |
|
} |
|
} 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', |
|
"'<b>","</b>'",'<br />'); |
|
} else { |
|
$displayval = &mt('[_1]In pop-up window[_2],[_3] with new window for each external resource in course', |
|
"'<b>","</b>'",'<br />'); |
|
} |
|
if (($width ne '') || ($height ne '')) { |
|
if ($width ne '') { |
|
$displayval .= '<br />'.&mt('Window width: [_1]px',$width); |
|
} |
|
if ($height ne '') { |
|
$displayval .= '<br />'.&mt('Window height: [_1]px',$height); |
|
} |
|
} |
|
} |
|
} |
} |
} |
if ($key eq 'co-owners') { |
if ($key eq 'co-owners') { |
if (ref($changes->{$item}{$key}) eq 'HASH') { |
if (ref($changes->{$item}{$key}) eq 'HASH') { |
Line 1476 sub store_changes {
|
Line 2858 sub store_changes {
|
} |
} |
} |
} |
unless (&Apache::lonnet::is_course_owner($cdom,$cnum)) { |
unless (&Apache::lonnet::is_course_owner($cdom,$cnum)) { |
if ($env{'form.pending_coowoner'} eq 'accept') { |
if ($env{'form.pending_coowner'} eq 'accept') { |
$displayval = &mt('on'); |
$displayval = &mt('on'); |
} elsif ($env{'form.pending_coowoner'} eq 'decline') { |
} elsif ($env{'form.pending_coowner'} eq 'decline') { |
$displayval = ''; |
$displayval = ''; |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Invitation to be co-owner declined')).'</li>'; |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Invitation to be co-owner declined')).'</li>'; |
} elsif ($env{'form.remove_coowoner'}) { |
} elsif ($env{'form.remove_coowner'}) { |
$displayval = &mt('off'); |
$displayval = &mt('off'); |
} |
} |
if ($displayval) { |
if ($displayval) { |
Line 1494 sub store_changes {
|
Line 2876 sub store_changes {
|
} |
} |
} elsif ($changes->{$item}{$key} eq '') { |
} elsif ($changes->{$item}{$key} eq '') { |
push(@delkeys,$key); |
push(@delkeys,$key); |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]', |
if ($item eq 'lti') { |
'<i>'.$displayname.'</i>')).'</li>'; |
if (($key eq 'lti.override') || (($key ne 'lti.override') && ($env{'form.lti.override'} ne ''))) { |
|
if (($key eq 'lti.lcmenu') && |
|
((!$env{'form.lti.topmenu'}) && (!$env{'form.lti.inlinemenu'}))) { |
|
$output .= '<li>'.&mt('LTI settings for menu items only saved if page header and/or inline menu is set to be displayed').'</li>'; |
|
} else { |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', |
|
'<i>'.$displayname.'</i>', |
|
"'<b>$displayval</b>'")).'</li>'; |
|
} |
|
} elsif (!exists($changes->{$item}{'lti.override'})) { |
|
$output .= '<li>'.&mt('LTI settings only saved if Override is set to "Yes"').'</li>'; |
|
} |
|
} elsif ($item eq 'menuitems') { |
|
if ($key eq 'menudefault') { |
|
$output .= '<li>'.&mt("Default collection of menu items set to: 'Standard' (all menus shown)").'</li>'; |
|
} elsif ($key eq 'menucollections') { |
|
$output .= '<li>'.&mt('Specific collections of menus no longer available').'</li>'; |
|
} |
|
} else { |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]', |
|
'<i>'.$displayname.'</i>')).'</li>'; |
|
} |
|
} elsif ($key eq 'menucollections') { |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Numbered menu collections:')).'<br />'. |
|
$displayval.'</li>'; |
} else { |
} else { |
|
unless (($key eq 'extresource') && ($changes->{$item}{$key} ne 'iframe')) { |
|
$displayval = "'<b>$displayval</b>'"; |
|
} |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', |
'<i>'.$displayname.'</i>', |
'<i>'.$displayname.'</i>',$displayval)); |
"'<b>$displayval</b>'")); |
|
if ($key eq 'url') { |
if ($key eq 'url') { |
my $bkuptime=time; |
my $bkuptime=time; |
$output .= (' 'x2).&mt('(Previous URL backed up)').': '. |
$output .= (' 'x2).&mt('(Previous URL backed up)').': '. |
Line 1534 sub store_changes {
|
Line 2942 sub store_changes {
|
} |
} |
if (($key eq 'description') || ($key eq 'cloners') || |
if (($key eq 'description') || ($key eq 'cloners') || |
($key eq 'hidefromcat') || ($key eq 'categories') || |
($key eq 'hidefromcat') || ($key eq 'categories') || |
($key eq 'co-owners')) { |
($key eq 'co-owners') || ($key eq 'lti.override') || |
|
($key eq 'lti.topmenu') || ($key eq 'lti.inlinemenu') || |
|
($key eq 'lti.lcmenu')) { |
push(@need_env_update,$key); |
push(@need_env_update,$key); |
} |
} |
} |
} |
Line 1551 sub store_changes {
|
Line 2961 sub store_changes {
|
} |
} |
} |
} |
} |
} |
|
if ($skipstore) { |
|
return $output; |
|
} |
if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') { |
if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') { |
if (ref($changes) eq 'HASH') { |
if (ref($changes) eq 'HASH') { |
if (ref($changes->{'courseinfo'}) eq 'HASH') { |
if (ref($changes->{'courseinfo'}) eq 'HASH') { |
Line 1593 sub store_changes {
|
Line 3006 sub store_changes {
|
return $output; |
return $output; |
} |
} |
|
|
|
sub store_linkprot { |
|
my ($cdom,$cnum,$context,$changes,$oldlinkprot) = @_; |
|
my ($ltiauth,$home,$lti_save_error,$output,$error,%ltienc,@deletions); |
|
if ($context eq 'domain') { |
|
$ltiauth = 1; |
|
$home = &Apache::lonnet::domain($cdom,'primary'); |
|
} else { |
|
$home = &Apache::lonnet::homeserver($cnum,$cdom); |
|
if (exists($env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'})) { |
|
$ltiauth = $env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'}; |
|
} else { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); |
|
$ltiauth = $domdefs{'crsltiauth'}; |
|
} |
|
} |
|
if (ref($changes) eq 'HASH') { |
|
foreach my $id (sort { $a <=> $b } keys(%{$changes})) { |
|
if (ref($changes->{$id}) eq 'HASH') { |
|
if (exists($changes->{$id}->{'key'})) { |
|
$ltienc{$id}{'key'} = $changes->{$id}->{'key'}; |
|
delete($changes->{$id}->{'key'}); |
|
} |
|
if (exists($changes->{$id}->{'secret'})) { |
|
$ltienc{$id}{'secret'} = $changes->{$id}->{'secret'}; |
|
delete($changes->{$id}->{'secret'}); |
|
} elsif (ref($oldlinkprot->{$id}) eq 'HASH') { |
|
if (exists($oldlinkprot->{$id}{'usable'})) { |
|
$changes->{$id}->{'usable'} = 1; |
|
} |
|
if (exists($oldlinkprot->{$id}{'cipher'})) { |
|
$changes->{$id}->{'cipher'} = $oldlinkprot->{$id}{'cipher'}; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
if (keys(%ltienc) > 0) { |
|
if ($context eq 'domain') { |
|
foreach my $id (keys(%ltienc)) { |
|
if (exists($ltienc{$id}{'secret'})) { |
|
$changes->{$id}->{'usable'} = 1; |
|
} |
|
} |
|
} else { |
|
unless (($home eq 'no_host') || ($home eq '')) { |
|
my $allowed; |
|
foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } |
|
if ($allowed) { |
|
if (&Apache::lonnet::put('nohist_ltienc',\%ltienc,$cdom,$cnum,1) eq 'ok') { |
|
foreach my $id (keys(%ltienc)) { |
|
if (exists($ltienc{$id}{'secret'})) { |
|
$changes->{$id}->{'usable'} = 1; |
|
} |
|
} |
|
} else { |
|
$lti_save_error = 1; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
unless ($lti_save_error) { |
|
if ($context eq 'course') { |
|
if (&Apache::lonnet::put('lti',$changes,$cdom,$cnum,1) eq 'ok') { |
|
my $hashid=$cdom.'_'.$cnum; |
|
&Apache::lonnet::devalidate_cache_new('courselti',$hashid); |
|
unless (($home eq 'no_host') || ($home eq '')) { |
|
if (grep(/^\Q$home\E$/,@ids)) { |
|
&Apache::lonnet::devalidate_cache_new('courseltienc',$hashid); |
|
} |
|
} |
|
} else { |
|
$lti_save_error = 1; |
|
} |
|
} |
|
unless ($lti_save_error) { |
|
foreach my $id (sort { $a <=> $b } %{$changes}) { |
|
if (ref($changes->{$id}) eq 'HASH') { |
|
my %values = %{$changes->{$id}}; |
|
my %desc = &linkprot_names(); |
|
my $display; |
|
foreach my $title ('name','lifetime','version','key','secret','returnurl') { |
|
if (($title eq 'key') || ($title eq 'secret')) { |
|
if (ref($ltienc{$id}) eq 'HASH') { |
|
if (exists($ltienc{$id}{$title})) { |
|
if ($title eq 'secret') { |
|
my $length = length($ltienc{$id}{$title}); |
|
$display .= $desc{$title}.': ['.&mt('not shown').'], '; |
|
} else { |
|
$display .= $desc{$title}.': '.$ltienc{$id}{$title}.', '; |
|
} |
|
} |
|
} |
|
} elsif ($title eq 'version') { |
|
if ($values{$title} eq 'LTI-1p0') { |
|
$display .= $desc{$title}.': 1.1, '; |
|
} |
|
} elsif ($title eq 'returnurl') { |
|
if ($values{$title}) { |
|
$display .= &mt('Return URL parameter').': '.$values{$title}.', '; |
|
} |
|
} else { |
|
$display .= $desc{$title}.': '.$values{$title}.', '; |
|
} |
|
} |
|
if ($ltiauth) { |
|
if (($values{'requser'}) && ($values{'mapuser'} ne '')) { |
|
if ($values{'mapuser'} eq 'lis_person_contact_email_primary') { |
|
$display .= &mt('Source of username: Email address [_1]', |
|
'(lis_person_contact_email_primary)').', '; |
|
} elsif ($values{'mapuser'} eq 'lis_person_sourcedid') { |
|
$display .= &mt('Source of username: User ID [_1]', |
|
'(lis_person_sourcedid)').', '; |
|
} else { |
|
$display .= &mt('Source of username: [_1]',$values{'mapuser'}).', '; |
|
} |
|
if ($values{'notstudent'} eq 'auth') { |
|
$display .= &mt('Display LON-CAPA login page if no match').', '; |
|
} elsif ($values{'notstudent'} eq 'reject') { |
|
$display .= &mt('Discontinue launch if no match').', '; |
|
} |
|
} |
|
} |
|
$display =~ s/, $//; |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]','<i>'.$id.'</i>', |
|
"'$display'")).'</li>'; |
|
} elsif (ref($oldlinkprot->{$id}) eq 'HASH') { |
|
my $oldname = $oldlinkprot->{$id}{'name'}; |
|
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]','<i>'."$id ($oldname)".'</i>')).'</li>'; |
|
} |
|
} |
|
} else { |
|
$lti_save_error = 1; |
|
} |
|
} |
|
unless ($lti_save_error) { |
|
foreach my $id (sort { $a <=> $b } keys(%{$changes})) { |
|
unless (ref($changes->{$id}) eq 'HASH') { |
|
push(@deletions,$id); |
|
} |
|
} |
|
if (@deletions) { |
|
if ($context eq 'course') { |
|
&Apache::lonnet::del('nohist_ltienc',\@deletions,$cdom,$cnum); |
|
} |
|
} |
|
} |
|
if ($lti_save_error) { |
|
$output .= '<li>'. |
|
'<span class="LC_error">'. |
|
&mt('An error occurred when saving changes to link protection settings, which remain unchanged.'). |
|
'</span>'. |
|
'</li>'; |
|
} |
|
return $output; |
|
} |
|
|
|
sub store_ltitools { |
|
my ($cdom,$cnum,$context,$changes,$oldltitools) = @_; |
|
my ($home,$ltitools_save_error,$output,$error,%toolsenc,@deletions); |
|
my %lt = <itools_names(); |
|
my @courseroles = ('cc','in','ta','ep','st'); |
|
my @allfields = ('fullname','firstname','lastname','email','user','roles'); |
|
if ($context eq 'domain') { |
|
$home = &Apache::lonnet::domain($cdom,'primary'); |
|
} else { |
|
$home = &Apache::lonnet::homeserver($cnum,$cdom); |
|
} |
|
if (ref($changes) eq 'HASH') { |
|
foreach my $id (sort { $a <=> $b } keys(%{$changes})) { |
|
if (ref($changes->{$id}) eq 'HASH') { |
|
if (exists($changes->{$id}->{'key'})) { |
|
$toolsenc{$id}{'key'} = $changes->{$id}->{'key'}; |
|
delete($changes->{$id}->{'key'}); |
|
} |
|
if (exists($changes->{$id}->{'secret'})) { |
|
$toolsenc{$id}{'secret'} = $changes->{$id}->{'secret'}; |
|
delete($changes->{$id}->{'secret'}); |
|
} elsif (ref($oldltitools->{$id}) eq 'HASH') { |
|
if (exists($oldltitools->{$id}{'usable'})) { |
|
$changes->{$id}->{'usable'} = 1; |
|
} |
|
if (exists($oldltitools->{$id}{'cipher'})) { |
|
$changes->{$id}->{'cipher'} = $oldltitools->{$id}{'cipher'}; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
if (keys(%toolsenc) > 0) { |
|
unless (($home eq 'no_host') || ($home eq '')) { |
|
my $allowed; |
|
foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } |
|
if ($allowed) { |
|
if (($context eq 'domain') || |
|
(($context eq 'course') && |
|
(&Apache::lonnet::put('nohist_toolsenc',\%toolsenc,$cdom,$cnum,1) eq 'ok'))) { |
|
foreach my $id (keys(%toolsenc)) { |
|
if (exists($toolsenc{$id}{'secret'})) { |
|
$changes->{$id}->{'usable'} = 1; |
|
} |
|
} |
|
} else { |
|
$ltitools_save_error = 1; |
|
} |
|
} |
|
} |
|
} |
|
unless ($ltitools_save_error) { |
|
if ($context eq 'course') { |
|
if (&Apache::lonnet::put('ltitools',$changes,$cdom,$cnum,1) eq 'ok') { |
|
my $hashid=$cdom.'_'.$cnum; |
|
&Apache::lonnet::devalidate_cache_new('courseltitools',$hashid); |
|
unless (($home eq 'no_host') || ($home eq '')) { |
|
if (grep(/^\Q$home\E$/,@ids)) { |
|
&Apache::lonnet::devalidate_cache_new('crsltitoolsenc',$hashid); |
|
} |
|
} |
|
} else { |
|
$ltitools_save_error = 1; |
|
} |
|
} |
|
unless ($ltitools_save_error) { |
|
my %bynum; |
|
foreach my $itemid (sort(keys(%{$changes}))) { |
|
my $position = $changes->{$itemid}{'order'}; |
|
$bynum{$position} = $itemid; |
|
} |
|
foreach my $pos (sort { $a <=> $b } keys(%bynum)) { |
|
my $itemid = $bynum{$pos}; |
|
if (ref($changes->{$itemid}) ne 'HASH') { |
|
$output .= '<li>'.&mt('Deleted: [_1]',$changes->{$itemid}).'</li>'; |
|
} else { |
|
$output .= '<li><b>'.$changes->{$itemid}{'title'}.'</b>'; |
|
if ($changes->{$itemid}{'image'}) { |
|
$output .= ' '. |
|
'<img src="'.$changes->{$itemid}{'image'}.'"'. |
|
' alt="'.&mt('Tool Provider icon').'" />'; |
|
} |
|
$output .= '</li><ul>'; |
|
my $position = $pos + 1; |
|
$output .= '<li>'.&mt('Order: [_1]',$position).'</li>'; |
|
foreach my $item ('version','msgtype','sigmethod','url','lifetime') { |
|
if ($changes->{$itemid}{$item} ne '') { |
|
$output .= '<li>'.$lt{$item}.': '.$changes->{$itemid}{$item}.'</li>'; |
|
} |
|
} |
|
if (ref($toolsenc{$itemid}) eq 'HASH') { |
|
foreach my $item ('key','secret') { |
|
if (exists($toolsenc{$itemid}{$item})) { |
|
if ($item eq 'secret') { |
|
$output .= '<li>'.$lt{$item}.': ['.&mt('not shown').']</li>'; |
|
} else { |
|
$output .= '<li>'.$lt{$item}.': '.$toolsenc{$itemid}{$item}.'</li>'; |
|
} |
|
} |
|
} |
|
} |
|
$output .= '<li>'.&mt('Configurable in course:'); |
|
my @possconfig = ('label','title','target','linktext','explanation','append'); |
|
my $numconfig = 0; |
|
if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') { |
|
foreach my $item (@possconfig) { |
|
if ($changes->{$itemid}{'crsconf'}{$item}) { |
|
$numconfig ++; |
|
$output .= ' "'.$lt{'crs'.$item}.'"'; |
|
} |
|
} |
|
} |
|
if (!$numconfig) { |
|
$output .= ' '.&mt('None'); |
|
} |
|
$output .= '</li>'; |
|
foreach my $item ('passback','roster') { |
|
$output .= '<li>'.$lt{$item}.' '; |
|
if ($changes->{$itemid}{$item}) { |
|
$output .= &mt('Yes'); |
|
if ($changes->{$itemid}{$item.'valid'}) { |
|
if ($item eq 'passback') { |
|
$output .= ' '.&mt('valid for at least [quant,_1,day] after launch', |
|
$changes->{$itemid}{$item.'valid'}); |
|
} else { |
|
$output .= ' '.&mt('valid for at least [quant,_1,second] after launch', |
|
$changes->{$itemid}{$item.'valid'}); |
|
} |
|
} |
|
} else { |
|
$output .= &mt('No'); |
|
} |
|
$output .= '</li>'; |
|
} |
|
if (ref($changes->{$itemid}{'display'}) eq 'HASH') { |
|
my $displaylist; |
|
if ($changes->{$itemid}{'display'}{'target'}) { |
|
$displaylist = &mt('Display target').': '. |
|
$changes->{$itemid}{'display'}{'target'}.','; |
|
} |
|
foreach my $size ('width','height') { |
|
if ($changes->{$itemid}{'display'}{$size}) { |
|
$displaylist .= (' 'x2).$lt{$size}.': '. |
|
$changes->{$itemid}{'display'}{$size}.','; |
|
} |
|
} |
|
if ($displaylist) { |
|
$displaylist =~ s/,$//; |
|
$output .= '<li>'.$displaylist.'</li>'; |
|
} |
|
foreach my $item ('linktext','explanation') { |
|
if ($changes->{$itemid}{'display'}{$item}) { |
|
$output .= '<li>'.$lt{$item}.': '.$changes->{$itemid}{'display'}{$item}.'</li>'; |
|
} |
|
} |
|
} |
|
if (ref($changes->{$itemid}{'fields'}) eq 'HASH') { |
|
my $fieldlist; |
|
foreach my $field (@allfields) { |
|
if ($changes->{$itemid}{'fields'}{$field}) { |
|
$fieldlist .= (' 'x2).$lt{$field}.','; |
|
} |
|
} |
|
if ($fieldlist) { |
|
$fieldlist =~ s/,$//; |
|
if ($changes->{$itemid}{'fields'}{'user'}) { |
|
if ($changes->{$itemid}{'incdom'}) { |
|
$fieldlist .= ' ('.&mt('username:domain').')'; |
|
} else { |
|
$fieldlist .= ' ('.&mt('username').')'; |
|
} |
|
} |
|
$output .= '<li>'.&mt('Data sent').':'.$fieldlist.'</li>'; |
|
} |
|
} |
|
if (ref($changes->{$itemid}{'roles'}) eq 'HASH') { |
|
my $rolemaps; |
|
foreach my $role (@courseroles) { |
|
if ($changes->{$itemid}{'roles'}{$role}) { |
|
$rolemaps .= (' 'x2).&Apache::lonnet::plaintext($role,'Course').'='. |
|
$changes->{$itemid}{'roles'}{$role}.','; |
|
} |
|
} |
|
if ($rolemaps) { |
|
$rolemaps =~ s/,$//; |
|
$output .= '<li>'.&mt('Role mapping:').$rolemaps.'</li>'; |
|
} |
|
} |
|
if (ref($changes->{$itemid}{'custom'}) eq 'HASH') { |
|
my $customlist; |
|
if (keys(%{$changes->{$itemid}{'custom'}})) { |
|
foreach my $key (sort(keys(%{$changes->{$itemid}{'custom'}}))) { |
|
$customlist .= $key.':'.$changes->{$itemid}{'custom'}{$key}.(' 'x2); |
|
} |
|
} |
|
if ($customlist) { |
|
$output .= '<li>'.&mt('Custom items').': '.$customlist.'</li>'; |
|
} |
|
} |
|
$output .= '</ul></li>'; |
|
} |
|
} |
|
} |
|
} |
|
return $output; |
|
} |
|
|
sub update_env { |
sub update_env { |
my ($cnum,$cdom,$chome,$need_env_update,$storehash) = @_; |
my ($cnum,$cdom,$chome,$need_env_update,$storehash) = @_; |
my $count = 0; |
my $count = 0; |
Line 1618 sub update_env {
|
Line 3397 sub update_env {
|
my @coowners = split(',',$storehash->{'internal.'.$key}); |
my @coowners = split(',',$storehash->{'internal.'.$key}); |
$crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners; |
$crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners; |
$count ++; |
$count ++; |
|
} elsif ($key =~ /^lti\./) { |
|
&Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash->{$key}}); |
} |
} |
} |
} |
if ($count) { |
if ($count) { |
Line 1721 sub get_course {
|
Line 3502 sub get_course {
|
} |
} |
|
|
sub get_jscript { |
sub get_jscript { |
my ($cid,$cdom,$phase,$crstype,$settings) = @_; |
my ($cid,$cdom,$phase,$crstype,$settings,$noedit) = @_; |
my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype); |
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,$localization_js); |
my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript(); |
my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript(); |
my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset'); |
my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset'); |
my $cloners_js = &cloners_javascript($phase); |
my $cloners_js = &cloners_javascript($phase); |
|
my $currltitools; |
|
if (ref($settings) eq 'HASH') { |
|
$currltitools = $settings->{'ltitools'}; |
|
} |
|
my $ltitools_js = &Apache::lonconfigsettings::ltitools_javascript($currltitools); |
my @code_order; |
my @code_order; |
if ($crstype ne 'Community') { |
if ($crstype ne 'Community') { |
if (ref($settings) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
Line 1847 function syllabusinfo() {
|
Line 3633 function syllabusinfo() {
|
} |
} |
} |
} |
ENDSCRIPT |
ENDSCRIPT |
|
my $menuitems_js; |
|
unless ($noedit) { |
|
my $collections; |
|
my $next = 1; |
|
if (ref($settings) eq 'HASH') { |
|
if ($settings->{'menucollections'} ne '') { |
|
my @current; |
|
foreach my $item (split(/;/,$settings->{'menucollections'})) { |
|
my ($num) = split(/\%/,$item); |
|
if ($num =~ /^\d+$/) { |
|
push(@current,$num); |
|
} |
|
} |
|
$collections = join("','",sort { $a <=> $b } @current); |
|
if ($collections) { |
|
$collections = "'$collections'"; |
|
} |
|
$next += $current[-1]; |
|
} |
|
} |
|
my $deftext = &mt('Standard (all menus shown)'); |
|
$menuitems_js = <<ENDSCRIPT; |
|
function toggleAddmenucoll() { |
|
if (document.getElementById('menucollections_add')) { |
|
var state = 'none'; |
|
var add = document.getElementById('menucollections_add').checked; |
|
if (add) { |
|
state = 'inline-block'; |
|
} |
|
var fieldsets = new Array('shown','text','links','list','inline'); |
|
for (var i=0; i<fieldsets.length; i++) { |
|
if (document.getElementById('addmenucoll_'+fieldsets[i])) { |
|
document.getElementById('addmenucoll_'+fieldsets[i]).style.display = state; |
|
} |
|
} |
|
var box = document.getElementsByClassName('LC_menucoll_add'); |
|
if (box.length) { |
|
for (var i=0; i<box.length; i++) { |
|
if (add) { |
|
box[i].checked = true; |
|
} else { |
|
box[i].checked = false; |
|
} |
|
} |
|
} |
|
if (document.getElementById('menudefault')) { |
|
var menudef = document.getElementById('menudefault'); |
|
var currsel = menudef.selectedIndex; |
|
var colls = new Array($collections); |
|
menudef.options.length = 0; |
|
if (!add) { |
|
if (currsel == 1 + colls.length) { |
|
currsel = 0; |
|
} |
|
} |
|
if (currsel == 0) { |
|
menudef.options[0] = new Option('$deftext','',true,true); |
|
} else { |
|
menudef.options[0] = new Option('$deftext','',false,false); |
|
} |
|
if (colls.length) { |
|
for (var i=0; i<colls.length; i++) { |
|
var idx = i+1; |
|
if (currsel == colls[i]) { |
|
menudef.options[idx] = new Option(colls[i],colls[i],true,true); |
|
} else { |
|
menudef.options[idx] = new Option(colls[i],colls[i],false,false); |
|
} |
|
} |
|
} |
|
if (add) { |
|
var addidx = 1 + colls.length; |
|
if (currsel == addidx) { |
|
menudef.options[addidx] = new Option('$next','$next',true,true); |
|
} else { |
|
menudef.options[addidx] = new Option('$next','$next',false,false); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
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 |
|
$localization_js = <<"ENDSCRIPT"; |
|
function toggleTimeZone() { |
|
if (document.getElementById('LC_set_timezone')) { |
|
var timezonesel = document.getElementById('LC_set_timezone').value; |
|
if (document.getElementById('LC_tzoverdiv')) { |
|
var tzoverdiv = document.getElementById('LC_tzoverdiv'); |
|
if (timezonesel == '') { |
|
tzoverdiv.style.display = 'none'; |
|
} else { |
|
tzoverdiv.style.display = 'block'; |
|
} |
|
} |
|
} |
|
} |
|
ENDSCRIPT |
$jscript = '<script type="text/javascript" language="Javascript">'."\n". |
$jscript = '<script type="text/javascript" language="Javascript">'."\n". |
'// <![CDATA['."\n". |
'// <![CDATA['."\n". |
$browse_js."\n".$categorize_js."\n".$loncaparev_js."\n". |
$browse_js."\n".$categorize_js."\n".$loncaparev_js."\n". |
$cloners_js."\n".$instcode_js. |
$cloners_js."\n".$instcode_js."\n".$localization_js."\n". |
$syllabus_js."\n".'//]]>'."\n". |
$syllabus_js."\n".$menuitems_js."\n".$extresource_js."\n". |
'</script>'."\n".$stubrowse_js."\n"; |
&linkprot_javascript()."\n".'//]]>'."\n". |
|
'</script>'."\n".$stubrowse_js."\n".$ltitools_js."\n"; |
return $jscript; |
return $jscript; |
} |
} |
|
|
Line 1937 function getIndexByName(item) {
|
Line 3849 function getIndexByName(item) {
|
ENDSCRIPT |
ENDSCRIPT |
} |
} |
|
|
|
sub linkprot_javascript { |
|
return <<"ENDSCRIPT"; |
|
function toggleLinkProtExtra(form,item,extra,valon,styleon,num) { |
|
if (document.getElementById('linkprot_'+extra+'_'+num)) { |
|
var extraid = document.getElementById('linkprot_'+extra+'_'+num); |
|
var itemname = form.elements['linkprot_'+item+'_'+num]; |
|
if (itemname) { |
|
if (itemname.length > 0) { |
|
var setvis; |
|
for (var i=0; i<itemname.length; i++) { |
|
if (itemname[i].checked == true) { |
|
if (itemname[i].value == valon) { |
|
extraid.style.display = styleon; |
|
setvis = 1; |
|
} |
|
break; |
|
} |
|
} |
|
if (!setvis) { |
|
extraid.style.display = 'none'; |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
ENDSCRIPT |
|
|
|
} |
|
|
sub print_courseinfo { |
sub print_courseinfo { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
my ($cathash,$categoriesform,$autocoowner,$clonedefaults); |
my ($cathash,$categoriesform,$autocoowner,$clonedefaults,$disabled); |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
my %domconf = |
my %domconf = |
&Apache::lonnet::get_dom('configuration', |
&Apache::lonnet::get_dom('configuration', |
['coursecategories','autoenroll','coursedefaults'],$cdom); |
['coursecategories','autoenroll','coursedefaults'],$cdom); |
Line 1952 sub print_courseinfo {
|
Line 3897 sub print_courseinfo {
|
if (ref($cathash) eq 'HASH') { |
if (ref($cathash) eq 'HASH') { |
$categoriesform = |
$categoriesform = |
&Apache::loncommon::assign_categories_table($cathash, |
&Apache::loncommon::assign_categories_table($cathash, |
$settings->{'categories'},$crstype)."\n"; |
$settings->{'categories'},$crstype,$disabled)."\n"; |
} |
} |
} |
} |
if (ref($domconf{'autoenroll'}) eq 'HASH') { |
if (ref($domconf{'autoenroll'}) eq 'HASH') { |
Line 2019 sub print_courseinfo {
|
Line 3964 sub print_courseinfo {
|
} else { |
} else { |
$replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank'); |
$replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank'); |
} |
} |
|
my ($editmap,$editsyllabus); |
|
unless ($noedit) { |
|
$editmap = (' 'x2). |
|
'<a href="javascript:openbrowser'. |
|
"('display','url','sequence')\">". |
|
&mt('Select Map').'</a><br /><span class="LC_warning"> '. |
|
&mt('Modification may make assessment data inaccessible!'). |
|
'</span>'; |
|
$editsyllabus = &mt('[_1]Edit[_2]','<a href="/public/'.$cdom.'/'.$cnum.'/syllabus?forceedit=1">', |
|
'</a>'); |
|
} |
my %items = ( |
my %items = ( |
'url' => { |
'url' => { |
text => '<b>'.&mt($itemtext->{'url'}).'</b>'.(' 'x2). |
text => '<b>'.&mt($itemtext->{'url'}).'</b>'.$editmap, |
'<a href="javascript:openbrowser'. |
|
"('display','url','sequence')\">". |
|
&mt('Select Map').'</a><br /><span class="LC_warning"> '. |
|
&mt('Modification may make assessment data inaccessible!'). |
|
'</span>', |
|
input => 'textbox', |
input => 'textbox', |
size => '55', |
size => '55', |
advanced => 1 |
advanced => 1 |
Line 2068 sub print_courseinfo {
|
Line 4019 sub print_courseinfo {
|
size => '20', |
size => '20', |
advanced => 1 |
advanced => 1 |
}, |
}, |
'externalsyllabus' => { |
'syllabus' => { |
text => '<b>'.&mt($itemtext->{'externalsyllabus'}).'</b><br />'. |
text => '<b>'.&mt($itemtext->{'syllabus'}).'</b><br />'. |
&mt('(Syllabus type in use)').(' ' x2). |
&mt('(Syllabus type in use)').(' ' x2). |
&mt('[_1]Edit[_2]','<a href="/public/'.$cdom.'/'.$cnum.'/syllabus?forceedit=1">', |
$editsyllabus, |
'</a>'), |
|
}, |
}, |
'hidefromcat' => { |
'hidefromcat' => { |
text => '<b>'.&mt($itemtext->{'hidefromcat'}).'</b><br />'. |
text => '<b>'.&mt($itemtext->{'hidefromcat'}).'</b><br />'. |
Line 2113 sub print_courseinfo {
|
Line 4063 sub print_courseinfo {
|
$datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); |
$datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); |
} |
} |
if ($items{$item}{input} eq 'radio') { |
if ($items{$item}{input} eq 'radio') { |
$datatable .= &yesno_radio($item,$settings); |
$datatable .= &yesno_radio($item,$settings,undef,undef,undef,$noedit); |
} elsif ($item eq 'cloners') { |
} elsif ($item eq 'cloners') { |
my $includeempty = 1; |
my $includeempty = 1; |
my $num = 0; |
my $num = 0; |
Line 2127 sub print_courseinfo {
|
Line 4077 sub print_courseinfo {
|
$datatable .= ' checked="checked" '; |
$datatable .= ' checked="checked" '; |
} |
} |
$datatable .= 'onchange="javascript:update_cloners('. |
$datatable .= 'onchange="javascript:update_cloners('. |
"'cloners_all'".');" />'.&mt('Yes').'</label>'. |
"'cloners_all'".');"'.$disabled.' />'.&mt('Yes').'</label>'. |
(' 'x2).'<label>'. |
(' 'x2).'<label>'. |
'<input type="radio" name="cloners_all" value="0" '; |
'<input type="radio" name="cloners_all" value="0" '; |
if ($settings->{$item} ne '*') { |
if ($settings->{$item} ne '*') { |
$datatable .= ' checked="checked" '; |
$datatable .= ' checked="checked" '; |
} |
} |
$datatable .= ' onchange="javascript:update_cloners('. |
$datatable .= ' onchange="javascript:update_cloners('. |
"'cloners_all'".');" />'.&mt('No').'</label></td>'. |
"'cloners_all'".');"'.$disabled.' />'.&mt('No').'</label></td>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table(). |
&Apache::loncommon::end_data_table(). |
'<table><tr><td align="left"><b>'.&mt('Or'). |
'<table><tr><td align="left"><b>'.&mt('Or'). |
Line 2142 sub print_courseinfo {
|
Line 4092 sub print_courseinfo {
|
&Apache::loncommon::start_data_table(); |
&Apache::loncommon::start_data_table(); |
my @cloners; |
my @cloners; |
if ($settings->{$item} eq '') { |
if ($settings->{$item} eq '') { |
my $default; |
unless ($noedit) { |
if ($currcanclone eq 'domain') { |
my $default; |
$default = '0'; |
if ($currcanclone eq 'domain') { |
|
$default = '0'; |
|
} |
|
$datatable .= &new_cloners_dom_row($cdom,'0',$default); |
} |
} |
$datatable .= &new_cloners_dom_row($cdom,'0',$default); |
|
} elsif ($settings->{$item} ne '*') { |
} elsif ($settings->{$item} ne '*') { |
my @entries = split(/,/,$settings->{$item}); |
my @entries = split(/,/,$settings->{$item}); |
if (@entries > 0) { |
if (@entries > 0) { |
Line 2167 sub print_courseinfo {
|
Line 4119 sub print_courseinfo {
|
'</b><input type="hidden" name="cloners_dom_'.$num. |
'</b><input type="hidden" name="cloners_dom_'.$num. |
'" value="'.$udom.'" /></span><br />'. |
'" value="'.$udom.'" /></span><br />'. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
'name="cloners_delete" value="'.$num.'" onchange="javascript:update_cloners('."'cloners_delete','$num'".');" />'. |
'name="cloners_delete" value="'.$num.'" onchange="javascript:update_cloners('."'cloners_delete','$num'".');"'.$disabled.' />'. |
&mt('Delete').'</label></span></td>'. |
&mt('Delete').'</label></span></td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
$num ++; |
$num ++; |
Line 2190 sub print_courseinfo {
|
Line 4142 sub print_courseinfo {
|
'<td align="left"><span class="LC_nobreak">'. |
'<td align="left"><span class="LC_nobreak">'. |
$add_domtitle.'</span><br />'. |
$add_domtitle.'</span><br />'. |
&Apache::loncommon::select_dom_form('','cloners_newdom', |
&Apache::loncommon::select_dom_form('','cloners_newdom', |
$includeempty). |
$includeempty,undef,undef, |
|
undef,undef,$noedit). |
'<input type="hidden" name="cloners_total" value="'.$num.'" />'. |
'<input type="hidden" name="cloners_total" value="'.$num.'" />'. |
'</td>'.&Apache::loncommon::end_data_table_row(). |
'</td>'.&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table(). |
&Apache::loncommon::end_data_table(). |
Line 2202 sub print_courseinfo {
|
Line 4155 sub print_courseinfo {
|
&mt('Specific users').' (<tt>'. |
&mt('Specific users').' (<tt>'. |
&mt('user:domain,user:domain').'</tt>)<br />'. |
&mt('user:domain,user:domain').'</tt>)<br />'. |
&Apache::lonhtmlcommon::textbox($item,$cloners_str, |
&Apache::lonhtmlcommon::textbox($item,$cloners_str, |
$items{$item}{'size'}). |
$items{$item}{'size'},$disabled). |
'</td>'.&Apache::loncommon::end_data_table_row(). |
'</td>'.&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table(); |
&Apache::loncommon::end_data_table(); |
if (@code_order > 0) { |
if (@code_order > 0) { |
Line 2226 sub print_courseinfo {
|
Line 4179 sub print_courseinfo {
|
'<td align="left"><span class="LC_nobreak">'. |
'<td align="left"><span class="LC_nobreak">'. |
&mt('Cloning by official course(s) based on course category').(' 'x2). |
&mt('Cloning by official course(s) based on course category').(' 'x2). |
'<label>'. |
'<label>'. |
'<input type="radio" name="cloners_instcode" value="1" onclick="toggleCloners(this);"'.$checkedon.' />'.&mt('Yes').'</label>'. |
'<input type="radio" name="cloners_instcode" value="1" onclick="toggleCloners(this);"'.$checkedon.$disabled.' />'.&mt('Yes').'</label>'. |
(' '). |
(' '). |
'<label>'. |
'<label>'. |
'<input type="radio" name="cloners_instcode" value="0" onclick="toggleCloners(this);"'.$checkedoff.' />'.&mt('No').'</label>'. |
'<input type="radio" name="cloners_instcode" value="0" onclick="toggleCloners(this);"'.$checkedoff.$disabled.' />'.&mt('No').'</label>'. |
&Apache::courseclassifier::build_instcode_selectors($numtitles, |
&Apache::courseclassifier::build_instcode_selectors($numtitles, |
$lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order, |
$lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order, |
$showncodes,'LC_cloners_instcodes','LC_cloners_instcode'). |
$showncodes,'LC_cloners_instcodes','LC_cloners_instcode',$noedit). |
'</td>'.&Apache::loncommon::end_data_table_row(). |
'</td>'.&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table(); |
&Apache::loncommon::end_data_table(); |
} |
} |
Line 2253 sub print_courseinfo {
|
Line 4206 sub print_courseinfo {
|
'</span></td><td align="left">'. |
'</span></td><td align="left">'. |
&Apache::lonhtmlcommon::textbox('rolenames_'.$role, |
&Apache::lonhtmlcommon::textbox('rolenames_'.$role, |
$settings->{$role.'.plaintext'}, |
$settings->{$role.'.plaintext'}, |
$items{$item}{size}).'</td>'. |
$items{$item}{size},$disabled).'</td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
} |
} |
$datatable .= &Apache::loncommon::end_data_table().'</td>'; |
$datatable .= &Apache::loncommon::end_data_table().'</td>'; |
} elsif ($item eq 'categories') { |
} elsif ($item eq 'categories') { |
my $launcher = 'onfocus="this.blur();javascript:catsbrowser();"'; |
my $launcher; |
|
if ($noedit) { |
|
$launcher = $disabled; |
|
} else { |
|
$launcher = 'onfocus="this.blur();javascript:catsbrowser();"'; |
|
} |
$datatable .= '<input type="hidden" name="categories" value="'.$settings->{$item}.'" />'. |
$datatable .= '<input type="hidden" name="categories" value="'.$settings->{$item}.'" />'. |
&Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item}, |
&Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item}, |
$items{$item}{size},$launcher); |
$items{$item}{size},$launcher); |
Line 2298 sub print_courseinfo {
|
Line 4256 sub print_courseinfo {
|
if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) { |
if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) { |
$datatable .= &show_autocoowners(@currcoown); |
$datatable .= &show_autocoowners(@currcoown); |
} else { |
} else { |
$datatable .= &coowner_invitations($cnum,$cdom,@currcoown); |
$datatable .= &coowner_invitations($cnum,$cdom,\@currcoown,$noedit); |
} |
} |
} else { |
} else { |
if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) { |
if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) { |
$datatable .= &show_autocoowners(@currcoown); |
$datatable .= &show_autocoowners(@currcoown); |
} else { |
} else { |
$datatable .= &manage_coownership($cnum,$cdom,@currcoown); |
$datatable .= &manage_coownership($cnum,$cdom,\@currcoown,$noedit); |
} |
} |
} |
} |
} elsif ($item eq 'externalsyllabus') { |
} elsif ($item eq 'syllabus') { |
my $external = $env{'course.'.$env{'request.course.id'}.'.externalsyllabus'}; |
my $external = $env{'course.'.$env{'request.course.id'}.'.externalsyllabus'}; |
my $uploaded = $env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'}; |
my $uploaded = $env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'}; |
my $minimal = $env{'course.'.$env{'request.course.id'}.'.minimalsyllabus'}; |
my $minimal = $env{'course.'.$env{'request.course.id'}.'.minimalsyllabus'}; |
Line 2348 sub print_courseinfo {
|
Line 4306 sub print_courseinfo {
|
} |
} |
$datatable .= $showreqd; |
$datatable .= $showreqd; |
} else { |
} else { |
$datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size}); |
$datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size},$disabled); |
} |
} |
$datatable .= &item_table_row_end(); |
$datatable .= &item_table_row_end(); |
} |
} |
Line 2529 sub display_loncaparev_constraints {
|
Line 4487 sub display_loncaparev_constraints {
|
$Apache::lonrelrequtils::checkcrstypes{$crstype}).'</h4>'; |
$Apache::lonrelrequtils::checkcrstypes{$crstype}).'</h4>'; |
} |
} |
my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps, |
my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps, |
%byresponsetype,%bysubmission,%fromblocks); |
%byresponsetype,%bysubmission,%fromblocks,%bycrsrestype); |
@scopeorder = ('all','section/group','user'); |
@scopeorder = ('all','section/group','user'); |
my $now = time; |
my $now = time; |
my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom); |
my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom); |
Line 2567 sub display_loncaparev_constraints {
|
Line 4525 sub display_loncaparev_constraints {
|
} |
} |
} |
} |
} |
} |
foreach my $item (keys(%Apache::lonrelrequtils::checkparmsmatch)) { |
foreach my $item (keys(%Apache::lonrelrequtils::checkparmvalsmatch)) { |
if (ref($Apache::lonrelrequtils::checkparmsmatch{$item}) eq 'ARRAY') { |
if (ref($Apache::lonrelrequtils::checkparmvalsmatch{$item}) eq 'ARRAY') { |
my $value = $resourcedata->{$key}; |
my $value = $resourcedata->{$key}; |
foreach my $valuematch (@{$Apache::lonrelrequtils::checkparmsmatch{$item}}) { |
foreach my $valuematch (@{$Apache::lonrelrequtils::checkparmvalsmatch{$item}}) { |
if ($value =~ /$valuematch/) { |
if ($value =~ /$valuematch/) { |
my $stdtype = &Apache::lonparmset::standard_parameter_types($item); |
my $stdtype = &Apache::lonparmset::standard_parameter_types($item); |
$found{$item}{'valname'} = &get_param_description($stdtype,$value,1); |
$found{$item}{'valname'} = &get_param_description($stdtype,$value,1); |
Line 2734 sub display_loncaparev_constraints {
|
Line 4692 sub display_loncaparev_constraints {
|
if (keys(%comm_blocks) > 0) { |
if (keys(%comm_blocks) > 0) { |
foreach my $block (keys(%comm_blocks)) { |
foreach my $block (keys(%comm_blocks)) { |
if ($block =~ /^firstaccess____(.+)$/) { |
if ($block =~ /^firstaccess____(.+)$/) { |
my $rev = $Apache::lonnet::needsrelease{'course:commblock:timer:'}; |
my $rev = $Apache::lonnet::needsrelease{'course:commblock:timer'}; |
if (ref($comm_blocks{$block}) eq 'HASH') { |
if (ref($comm_blocks{$block}) eq 'HASH') { |
push(@{$fromblocks{'timer'}{$rev}},&unescape($comm_blocks{$block}{'event'}). |
push(@{$fromblocks{'timer'}{$rev}},&unescape($comm_blocks{$block}{'event'}). |
' '.&mt('set by [_1]', |
' '.&mt('set by [_1]', |
Line 2749 sub display_loncaparev_constraints {
|
Line 4707 sub display_loncaparev_constraints {
|
if (ref($comm_blocks{$block}{'blocks'}) eq 'HASH') { |
if (ref($comm_blocks{$block}{'blocks'}) eq 'HASH') { |
if (ref($comm_blocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
if (ref($comm_blocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
if (keys(%{$comm_blocks{$block}{'blocks'}{'docs'}}) > 0) { |
if (keys(%{$comm_blocks{$block}{'blocks'}{'docs'}}) > 0) { |
my $rev = $Apache::lonnet::needsrelease{'course:commblock:docs:'}; |
my $rev = $Apache::lonnet::needsrelease{'course:commblock:docs'}; |
push(@{$fromblocks{'docs'}{$rev}},&unescape($comm_blocks{$block}{'event'}). |
push(@{$fromblocks{'docs'}{$rev}},&unescape($comm_blocks{$block}{'event'}). |
' '. |
' '. |
&mt('set by [_1]', |
&mt('set by [_1]', |
&Apache::loncommon::plainname(split(/:/,$comm_blocks{$block}{'setter'})))); |
&Apache::loncommon::plainname(split(/:/,$comm_blocks{$block}{'setter'})))); |
} |
} |
} elsif ($comm_blocks{$block}{'blocks'}{'printout'} eq 'on') { |
} elsif ($comm_blocks{$block}{'blocks'}{'printout'} eq 'on') { |
my $rev = $Apache::lonnet::needsrelease{'course:commblock:printout:'}; |
my $rev = $Apache::lonnet::needsrelease{'course:commblock:printout'}; |
push(@{$fromblocks{'printout'}{$rev}},&unescape($comm_blocks{$block}{'event'}). |
push(@{$fromblocks{'printout'}{$rev}},&unescape($comm_blocks{$block}{'event'}). |
' '. |
' '. |
&mt('set by [_1]', |
&mt('set by [_1]', |
Line 2803 sub display_loncaparev_constraints {
|
Line 4761 sub display_loncaparev_constraints {
|
my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey::'}; |
my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey::'}; |
my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum); |
my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum); |
my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry::'}; |
my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry::'}; |
|
my $rev_exttool=$Apache::lonnet::needsrelease{'course:courserestype:exttool'}; |
my $stdtype=&Apache::lonparmset::standard_parameter_types('type'); |
my $stdtype=&Apache::lonparmset::standard_parameter_types('type'); |
my $stdname=&Apache::lonparmset::standard_parameter_names('type'); |
my $stdname=&Apache::lonparmset::standard_parameter_names('type'); |
my $valanon=&get_param_description($stdtype,'anonsurvey'); |
my $valanon=&get_param_description($stdtype,'anonsurvey'); |
my $valrandtry=&get_param_description($stdtype,'randomizetry'); |
my $valrandtry=&get_param_description($stdtype,'randomizetry'); |
my %checkedrev; |
my %checkedrev; |
foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) { |
foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0)) { |
my @parts = @{$res->parts()}; |
my @parts = @{$res->parts()}; |
my $symb = $res->symb(); |
my $symb = $res->symb(); |
my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src()); |
my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src()); |
|
if ($res->is_tool()) { |
|
my $rev = $rev_exttool; |
|
$bycrsrestype{$symb}{$rev} = &mt('External Tool'); |
|
$allmaps{$enclosing_map} = 1; |
|
next; |
|
} |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
if (exists($anonsubms{$symb."\0".$part})) { |
if (exists($anonsubms{$symb."\0".$part})) { |
my $rev = $rev_anonsurv; |
my $rev = $rev_anonsurv; |
Line 2899 sub display_loncaparev_constraints {
|
Line 4864 sub display_loncaparev_constraints {
|
} |
} |
} |
} |
} |
} |
|
my $supptools = &Apache::lonnet::count_supptools($cnum,$cdom,1,1); |
my $mapres_header = '<h4>'. |
my $mapres_header = '<h4>'. |
&mt('Requirements for specific folders or resources'). |
&mt('Requirements for specific folders or resources'). |
'</h4>'; |
'</h4>'; |
Line 2913 sub display_loncaparev_constraints {
|
Line 4879 sub display_loncaparev_constraints {
|
$r->print($start_page.$top_header); |
$r->print($start_page.$top_header); |
if ($output) { |
if ($output) { |
$r->print($output); |
$r->print($output); |
if (defined($navmap)) { |
if (defined($navmap) || $supptools) { |
&show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission, |
&show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission, |
\%byresponsetype,\@scopeorder,\%lt); |
\%byresponsetype,\%bycrsrestype,\@scopeorder,\%lt,$supptools); |
} |
} |
$r->print('<br /><br />'); |
$r->print('<br /><br />'); |
} else { |
} else { |
Line 2933 sub display_loncaparev_constraints {
|
Line 4899 sub display_loncaparev_constraints {
|
|
|
sub show_contents_view { |
sub show_contents_view { |
my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype, |
my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype, |
$scopeorder,$lt) = @_; |
$bycrsrestype,$scopeorder,$lt,$supptools) = @_; |
if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) || |
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons"); |
(keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0)) { |
my $whitespace = '<img src="'.$location.'/whitespace_21.gif" alt="" />'; |
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons"); |
my $showmaincontent; |
my $whitespace = '<img src="'.$location.'/whitespace_21.gif" alt="" />'; |
if ((ref($navmap)) && |
my $icon = '<img src="'.$location.'/navmap.folder.open.gif" alt="" />'; |
((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) || |
|
(keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0) || |
|
(keys(%{$bycrsrestype}) > 0))) { |
|
$showmaincontent = 1; |
|
} |
|
if ($showmaincontent || $supptools) { |
|
$r->print(&Apache::loncommon::start_data_table()); |
|
} |
|
if ($showmaincontent) { |
|
my $icon = '<img src="'.$location.'/navmap.folder.open.gif" alt="" />'; |
my $topmap = $env{'course.'.$cid.'.url'}; |
my $topmap = $env{'course.'.$cid.'.url'}; |
$r->print(&Apache::loncommon::start_data_table(). |
$r->print(&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.&mt('Location').'</th><th>'.&mt('Release').'</th>'. |
'<th>'.&mt('Location').'</th><th>'.&mt('Release').'</th>'. |
'<th>'.&mt('Attribute/Setting').'</th>'. |
'<th>'.&mt('Attribute/Setting').'</th>'. |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td> '.$icon.' '.&mt('Main Content').'</td>'); |
'<td> '.$icon.' '.&mt('Main Content').'</td>'); |
&releases_by_map($r,$bymap,$topmap,$scopeorder,$lt); |
&releases_by_map($r,$bymap,$topmap,$scopeorder,$lt); |
$r->print(&Apache::loncommon::end_data_table_row()); |
$r->print(&Apache::loncommon::end_data_table_row()); |
my $it=$navmap->getIterator(undef,undef,undef,1,1,undef); |
my $it=$navmap->getIterator(undef,undef,undef,1,1,undef); |
my $curRes; |
my $curRes; |
my $depth = 0; |
my $depth = 0; |
Line 2999 sub show_contents_view {
|
Line 4973 sub show_contents_view {
|
if (ref($byresponsetype->{$symb}) eq 'HASH') { |
if (ref($byresponsetype->{$symb}) eq 'HASH') { |
$rowspan += scalar(keys(%{$byresponsetype->{$symb}})); |
$rowspan += scalar(keys(%{$byresponsetype->{$symb}})); |
} |
} |
|
if (ref($bycrsrestype->{$symb}) eq 'HASH') { |
|
$rowspan += scalar(keys(%{$bycrsrestype->{$symb}})); |
|
} |
next if (!$rowspan); |
next if (!$rowspan); |
$icon = '<img class="LC_contentImage" src="'.$location.'/problem.gif" alt="'. |
$icon = '<img class="LC_contentImage" src="'.$location.'/problem.gif" alt="'. |
&mt('Problem').'" />'; |
&mt('Problem').'" />'; |
Line 3063 sub show_contents_view {
|
Line 5040 sub show_contents_view {
|
$r->print('</td>'); |
$r->print('</td>'); |
} |
} |
$r->print(&Apache::loncommon::end_data_table_row()); |
$r->print(&Apache::loncommon::end_data_table_row()); |
|
$newrow = 1; |
|
} |
|
if (ref($bycrsrestype->{$symb}) eq 'HASH') { |
|
foreach my $rev (sort(keys(%{$bycrsrestype->{$symb}}))) { |
|
if ($newrow) { |
|
$r->print(&Apache::loncommon::continue_data_table_row()); |
|
} |
|
$r->print('<td>'.$rev.'</td><td>'.$bycrsrestype->{$symb}{$rev}.'</td>'); |
|
} |
|
$r->print(&Apache::loncommon::end_data_table_row()); |
} |
} |
} |
} |
} |
} |
} |
} |
|
} |
|
if ($supptools) { |
|
my $icon = '<img src="'.$location.'/navmap.folder.open.gif" alt="" />'; |
|
$r->print(&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.&mt('Location').'</th><th>'.&mt('Release').'</th>'. |
|
'<th>'.&mt('Resource Type').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row(). |
|
&Apache::loncommon::start_data_table_row(). |
|
'<td> '.$icon.' '.&mt('Supplemental Content').'</td>'. |
|
'<td valign="middle">'. |
|
$Apache::lonrelrequtils::exttool{'major'}.'.'. |
|
$Apache::lonrelrequtils::exttool{'minor'}. |
|
'</td><td>'.&mt('[quant,_1,External Tool,External Tools]', |
|
$supptools).'</td>'. |
|
&Apache::loncommon::end_data_table_row()); |
|
} |
|
if ($showmaincontent || $supptools) { |
$r->print(&Apache::loncommon::end_data_table()); |
$r->print(&Apache::loncommon::end_data_table()); |
} |
} |
return; |
return; |
Line 3209 sub show_autocoowners {
|
Line 5213 sub show_autocoowners {
|
} |
} |
|
|
sub coowner_invitations { |
sub coowner_invitations { |
my ($cnum,$cdom,@currcoown) = @_; |
my ($cnum,$cdom,$currcoownref,$noedit) = @_; |
my ($output,@pendingcoown,@othercoords); |
my ($output,@pendingcoown,@othercoords,@currcoown); |
my $pendingcoowners = |
my $pendingcoowners = |
$env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'}; |
$env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'}; |
if ($pendingcoowners) { |
if ($pendingcoowners) { |
@pendingcoown = split(',',$pendingcoowners); |
@pendingcoown = split(',',$pendingcoowners); |
} |
} |
|
if (ref($currcoownref) eq 'ARRAY') { |
|
@currcoown = @{$currcoownref}; |
|
} |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
my $ccrole = 'cc'; |
my $ccrole = 'cc'; |
my %ccroles = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,[$ccrole]); |
my %ccroles = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,[$ccrole]); |
foreach my $key (sort(keys(%ccroles))) { |
foreach my $key (sort(keys(%ccroles))) { |
Line 3233 sub coowner_invitations {
|
Line 5244 sub coowner_invitations {
|
'<td><i>'.&mt('Current co-owners').'</i></td><td>'; |
'<td><i>'.&mt('Current co-owners').'</i></td><td>'; |
foreach my $person (@currcoown) { |
foreach my $person (@currcoown) { |
my ($co_uname,$co_dom) = split(':',$person); |
my ($co_uname,$co_dom) = split(':',$person); |
$output .= '<span class="LC_nobreak"><label><input type="checkbox" name="coowners" checked="checked" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.(' 'x2).' '; |
$output .= '<span class="LC_nobreak"><label><input type="checkbox" name="coowners" checked="checked" value="'.$person.'"'.$disabled.' />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.(' 'x2).' '; |
} |
} |
$output .= '</td>'. |
$output .= '</td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
Line 3243 sub coowner_invitations {
|
Line 5254 sub coowner_invitations {
|
'<td><i>'.&mt('Invited as co-owners [_1](agreement pending)','<br />').'</i></td><td>'; |
'<td><i>'.&mt('Invited as co-owners [_1](agreement pending)','<br />').'</i></td><td>'; |
foreach my $person (@pendingcoown) { |
foreach my $person (@pendingcoown) { |
my ($co_uname,$co_dom) = split(':',$person); |
my ($co_uname,$co_dom) = split(':',$person); |
$output .= '<span class="LC_nobreak"><label><input type="checkbox" name="pendingcoowners" checked="checked" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.(' 'x2).' '; |
$output .= '<span class="LC_nobreak"><label><input type="checkbox" name="pendingcoowners" checked="checked" value="'.$person.'"'.$disabled.' />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.(' 'x2).' '; |
} |
} |
$output .= '</td>'. |
$output .= '</td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
Line 3253 sub coowner_invitations {
|
Line 5264 sub coowner_invitations {
|
'<td><i>'.&mt('Invite other Coordinators [_1]to become co-owners','<br />').'</i></td><td>'; |
'<td><i>'.&mt('Invite other Coordinators [_1]to become co-owners','<br />').'</i></td><td>'; |
foreach my $person (@othercoords) { |
foreach my $person (@othercoords) { |
my ($co_uname,$co_dom) = split(':',$person); |
my ($co_uname,$co_dom) = split(':',$person); |
$output .= '<span class="LC_nobreak"><label><input type="checkbox" name="invitecoowners" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.(' 'x2).' '; |
$output .= '<span class="LC_nobreak"><label><input type="checkbox" name="invitecoowners" value="'.$person.'"'.$disabled.' />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.(' 'x2).' '; |
} |
} |
$output .= '</td>'. |
$output .= '</td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
Line 3266 sub coowner_invitations {
|
Line 5277 sub coowner_invitations {
|
} |
} |
|
|
sub manage_coownership { |
sub manage_coownership { |
my ($cnum,$cdom,@currcoown) = @_; |
my ($cnum,$cdom,$currcoownref,$noedit) = @_; |
my (@pendingcoown); |
my (@pendingcoown,@currcoown); |
my $pendingcoowners = |
my $pendingcoowners = |
$env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'}; |
$env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'}; |
if ($pendingcoowners) { |
if ($pendingcoowners) { |
@pendingcoown = split(',',$pendingcoowners); |
@pendingcoown = split(',',$pendingcoowners); |
} |
} |
|
if (ref($currcoownref) eq 'ARRAY') { |
|
@currcoown = @{$currcoownref}; |
|
} |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
my ($is_coowner,$is_pending,$output); |
my ($is_coowner,$is_pending,$output); |
my $uname = $env{'user.name'}; |
my $uname = $env{'user.name'}; |
my $udom = $env{'user.domain'}; |
my $udom = $env{'user.domain'}; |
Line 3302 sub manage_coownership {
|
Line 5320 sub manage_coownership {
|
} |
} |
$output .= '<span class="LC_nobreak">'; |
$output .= '<span class="LC_nobreak">'; |
if ($is_coowner) { |
if ($is_coowner) { |
$output .= &mt('You are currently a co-owner:').' <label><input type="checkbox" name="remove_coowoner" value="'.$uname.':'.$udom.'" />'.&mt('Discontinue?').'</label>'; |
$output .= &mt('You are currently a co-owner:').' <label><input type="checkbox" name="remove_coowner" value="'.$uname.':'.$udom.'" />'.&mt('Discontinue?').'</label>'; |
} else { |
} else { |
$output .= &mt('The course owner has invited you to become a co-owner:').' <label><input type="radio" name="pending_coowoner" value="accept" />'.&mt('Accept?').'</label>'.(' 'x2). |
$output .= &mt('The course owner has invited you to become a co-owner:').' <label><input type="radio" name="pending_coowner" value="accept"'.$disabled.' />'.&mt('Accept?').'</label>'.(' 'x2). |
'<label><input type="radio" name=pending_coowoner" value="decline" />'.&mt('Decline?').'</label>'; |
'<label><input type="radio" name=pending_coowner" value="decline"'.$disabled.' />'.&mt('Decline?').'</label>'; |
} |
} |
$output .= '</span>'; |
$output .= '</span>'; |
if (@currcoown) { |
if (@currcoown) { |
Line 3319 sub manage_coownership {
|
Line 5337 sub manage_coownership {
|
} |
} |
|
|
sub print_localization { |
sub print_localization { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 3338 sub print_localization {
|
Line 5356 sub print_localization {
|
input => 'selectbox', |
input => 'selectbox', |
}, |
}, |
); |
); |
my $datatable; |
my ($datatable,$disabled); |
my $count = 0; |
my $count = 0; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
foreach my $item (@{$ordered}) { |
foreach my $item (@{$ordered}) { |
$count ++; |
$count ++; |
my $colspan; |
my $colspan; |
unless ($item eq 'languages') { |
unless ($item eq 'languages') { |
$colspan = 2; |
$colspan = 2; |
} |
} |
$datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); |
$datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); |
if ($item eq 'timezone') { |
if ($item eq 'timezone') { |
my $includeempty = 1; |
my $includeempty = 1; |
my $timezone = &Apache::lonlocal::gettimezone(); |
my $timezone = &Apache::lonlocal::gettimezone(); |
|
my $onchange; |
|
unless ($noedit) { |
|
$onchange = ' onchange="javascript:toggleTimeZone();"'; |
|
} |
|
my $id = ' id="LC_set_timezone"'; |
$datatable .= |
$datatable .= |
&Apache::loncommon::select_timezone($item,$timezone,undef, |
&Apache::loncommon::select_timezone($item,$timezone,$onchange, |
$includeempty); |
$includeempty,$id,$disabled); |
|
my $tzsty = 'none'; |
|
if ($timezone ne '') { |
|
$tzsty = 'block'; |
|
} |
|
$datatable .= '<div id="LC_tzoverdiv" style="display:'.$tzsty.';">'. |
|
'<span class="LC_nobreak">'. |
|
&mt('Override individual user preference?'). |
|
&yesno_radio('tzover',$settings,undef,1,'',$noedit). |
|
'</span></div>'; |
} elsif ($item eq 'datelocale') { |
} elsif ($item eq 'datelocale') { |
my $includeempty = 1; |
my $includeempty = 1; |
my $locale_obj = &Apache::lonlocal::getdatelocale(); |
my $locale_obj = &Apache::lonlocal::getdatelocale(); |
Line 3362 sub print_localization {
|
Line 5397 sub print_localization {
|
} |
} |
$datatable .= |
$datatable .= |
&Apache::loncommon::select_datelocale($item,$currdatelocale, |
&Apache::loncommon::select_datelocale($item,$currdatelocale, |
undef,$includeempty); |
undef,$includeempty,$disabled); |
} else { |
} else { |
if ($settings->{$item} eq '') { |
if ($settings->{$item} eq '') { |
$datatable .= '</td><td align="right">'. |
unless ($noedit) { |
&Apache::loncommon::select_language('languages_0','',1); |
$datatable .= '</td><td align="right">'. |
|
&Apache::loncommon::select_language('languages_0','',1); |
|
} |
} else { |
} else { |
my $num = 0; |
my $num = 0; |
my @languages = split(/\s*[,;:]\s*/,$settings->{$item}); |
my @languages = split(/\s*[,;:]\s*/,$settings->{$item}); |
Line 3386 sub print_localization {
|
Line 5423 sub print_localization {
|
'</b><input type="hidden" name="languages_'.$num. |
'</b><input type="hidden" name="languages_'.$num. |
'" value="'.$lang.'" /></span><br />'. |
'" value="'.$lang.'" /></span><br />'. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
'name="languages_delete" value="'.$num.'" />'. |
'name="languages_delete" value="'.$num.'"'.$disabled.' />'. |
&mt('Delete').'</label></span></td>'. |
&mt('Delete').'</label></span></td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
$num ++; |
$num ++; |
} |
} |
} |
} |
$datatable .= &Apache::loncommon::start_data_table_row(). |
unless ($noedit) { |
|
$datatable .= |
|
&Apache::loncommon::start_data_table_row(). |
'<td align="left"><span class="LC_nobreak">'. |
'<td align="left"><span class="LC_nobreak">'. |
&mt('Additional language:'). '</span><br />'. |
&mt('Additional language:'). '</span><br />'. |
&Apache::loncommon::select_language('languages_'.$num,'',1). |
&Apache::loncommon::select_language('languages_'.$num,'',1). |
'<input type="hidden" name="languages_total" value="'.$num.'" />'. |
'<input type="hidden" name="languages_total" value="'.$num.'" />'. |
'</td>'.&Apache::loncommon::end_data_table_row(). |
'</td>'.&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table().'<br />'; |
} |
|
$datatable .= &Apache::loncommon::end_data_table().'<br />'; |
} |
} |
} |
} |
$datatable .= &item_table_row_end(); |
$datatable .= &item_table_row_end(); |
Line 3419 sub get_lang_choices {
|
Line 5459 sub get_lang_choices {
|
} |
} |
|
|
sub print_feedback { |
sub print_feedback { |
my ($position,$cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; |
my ($position,$cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 3454 sub print_feedback {
|
Line 5494 sub print_feedback {
|
del => 'Delete?', |
del => 'Delete?', |
sec => 'Sections:', |
sec => 'Sections:', |
); |
); |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
foreach my $item (@{$ordered}) { |
foreach my $item (@{$ordered}) { |
$count ++; |
$count ++; |
if ($position eq 'top') { |
if ($position eq 'top') { |
Line 3464 sub print_feedback {
|
Line 5507 sub print_feedback {
|
} |
} |
if ($position eq 'top') { |
if ($position eq 'top') { |
my $includeempty = 0; |
my $includeempty = 0; |
$datatable .= '</td><td align="right">'. |
$datatable .= '</td><td align="right">'. |
&user_table($cdom,$item,\@sections, |
&user_table($cdom,$item,\@sections, |
$settings->{$item},\%lt); |
$settings->{$item},\%lt,$noedit); |
} else { |
} else { |
$datatable .= &Apache::lonhtmlcommon::textbox($item.'.text', |
$datatable .= &Apache::lonhtmlcommon::textbox($item.'.text', |
$settings->{$item.'.text'},$items{$item}{size}); |
$settings->{$item.'.text'},$items{$item}{size},$disabled); |
} |
} |
$datatable .= &item_table_row_end(); |
$datatable .= &item_table_row_end(); |
} |
} |
Line 3478 sub print_feedback {
|
Line 5521 sub print_feedback {
|
} |
} |
|
|
sub user_table { |
sub user_table { |
my ($cdom,$item,$sections,$currvalue,$lt) = @_; |
my ($cdom,$item,$sections,$currvalue,$lt,$noedit) = @_; |
my $output; |
my $output; |
if ($currvalue eq '') { |
if ($currvalue eq '') { |
$output .= &select_recipient($item,'0',$cdom,$sections); |
unless ($noedit) { |
|
$output .= &select_recipient($item,'0',$cdom,$sections); |
|
} |
} else { |
} else { |
my $num = 0; |
my $num = 0; |
my @curr = split(/,/,$currvalue); |
my @curr = split(/,/,$currvalue); |
$output .= '<table class="LC_data_table">'; |
$output .= '<table class="LC_data_table">'; |
my ($currusers); |
my ($currusers); |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
foreach my $val (@curr) { |
foreach my $val (@curr) { |
next if ($val eq ''); |
next if ($val eq ''); |
my ($uname,$udom,$seclist) = ($val =~ /^($match_username):($match_domain)(\(?[^\)]*\)?)$/); |
my ($uname,$udom,$seclist) = ($val =~ /^($match_username):($match_domain)(\(?[^\)]*\)?)$/); |
Line 3498 sub user_table {
|
Line 5547 sub user_table {
|
$currusers .= '<tr>'. |
$currusers .= '<tr>'. |
'<td valign="top"><span class="LC_nobreak">'. |
'<td valign="top"><span class="LC_nobreak">'. |
'<label><input type="checkbox" '. |
'<label><input type="checkbox" '. |
'name="'.$item.'_delete" value="'.$num.'" />'. |
'name="'.$item.'_delete" value="'.$num.'"'.$disabled.' />'. |
$lt->{'del'}.'</label>'. |
$lt->{'del'}.'</label>'. |
'<input type="hidden" name="'.$item.'_user_'. |
'<input type="hidden" name="'.$item.'_user_'. |
$num.'" value="'.$uname.':'.$udom.'" />'.(' 'x2). |
$num.'" value="'.$uname.':'.$udom.'" />'.(' 'x2). |
Line 3509 sub user_table {
|
Line 5558 sub user_table {
|
if (@{$sections}) { |
if (@{$sections}) { |
$currusers.= (' 'x3).$lt->{'sec'}.' '. |
$currusers.= (' 'x3).$lt->{'sec'}.' '. |
&select_sections($item,$num,$sections, |
&select_sections($item,$num,$sections, |
\@selsec); |
\@selsec,$noedit); |
} |
} |
} |
} |
$currusers .= '</span></td></tr>'; |
$currusers .= '</span></td></tr>'; |
Line 3527 sub user_table {
|
Line 5576 sub user_table {
|
'<table>'.$currusers.'</table></td>'. |
'<table>'.$currusers.'</table></td>'. |
'</tr>'; |
'</tr>'; |
} |
} |
$output .= '<tr>'. |
unless ($noedit) { |
|
$output .= |
|
'<tr>'. |
'<td align="left"><span class="LC_nobreak"><i>'. |
'<td align="left"><span class="LC_nobreak"><i>'. |
$lt->{'add'}.'</i></span><br />'. |
$lt->{'add'}.'</i></span><br />'. |
&select_recipient($item,$num,$cdom,$sections). |
&select_recipient($item,$num,$cdom,$sections). |
'<input type="hidden" name="'.$item.'_total" value="'.$num.'" />'. |
'<input type="hidden" name="'.$item.'_total" value="'.$num.'" />'. |
'</td></tr></table>'; |
'</td></tr>'; |
|
} |
|
$output .= '</table>'; |
} |
} |
return $output; |
return $output; |
} |
} |
Line 3542 sub select_recipient {
|
Line 5595 sub select_recipient {
|
my $domform = &Apache::loncommon::select_dom_form($cdom,$item.'_udom_'.$num,$includeempty); |
my $domform = &Apache::loncommon::select_dom_form($cdom,$item.'_udom_'.$num,$includeempty); |
my $selectlink = |
my $selectlink = |
&Apache::loncommon::selectstudent_link('display',$item.'_uname_'.$num, |
&Apache::loncommon::selectstudent_link('display',$item.'_uname_'.$num, |
$item.'_udom_'.$num,1); |
$item.'_udom_'.$num,'only'); |
my $output = |
my $output = |
'<table><tr><td align="center">'.&mt('Username').'<br />'. |
'<table><tr><td align="center">'.&mt('Username').'<br />'. |
'<input type="text" name="'.$item.'_uname_'.$num.'" value="" /></td>'. |
'<input type="text" name="'.$item.'_uname_'.$num.'" value="" /></td>'. |
Line 3559 sub select_recipient {
|
Line 5612 sub select_recipient {
|
} |
} |
|
|
sub select_sections { |
sub select_sections { |
my ($item,$num,$sections,$selected) = @_; |
my ($item,$num,$sections,$selected,$noedit) = @_; |
my ($output,@currsecs,$allsec); |
my ($output,@currsecs,$allsec,$disabled); |
if (ref($selected) eq 'ARRAY') { |
if (ref($selected) eq 'ARRAY') { |
@currsecs = @{$selected}; |
@currsecs = @{$selected}; |
} |
} |
if (!@currsecs) { |
if (!@currsecs) { |
$allsec = ' selected="selected"'; |
$allsec = ' selected="selected"'; |
} |
} |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
if (ref($sections) eq 'ARRAY') { |
if (ref($sections) eq 'ARRAY') { |
if (@{$sections}) { |
if (@{$sections}) { |
my $mult; |
my $mult; |
Line 3576 sub select_sections {
|
Line 5632 sub select_sections {
|
$mult .= ' size="4"'; |
$mult .= ' size="4"'; |
} |
} |
} |
} |
$output = '<select name="'.$item.'_sections_'.$num.'"'.$mult.'>'. |
$output = '<select name="'.$item.'_sections_'.$num.'"'.$mult.$disabled.'>'. |
' <option value=""'.$allsec.'>'.&mt('All').'</option>'; |
' <option value=""'.$allsec.'>'.&mt('All').'</option>'; |
foreach my $sec (@{$sections}) { |
foreach my $sec (@{$sections}) { |
my $is_sel; |
my $is_sel; |
Line 3592 sub select_sections {
|
Line 5648 sub select_sections {
|
} |
} |
|
|
sub print_discussion { |
sub print_discussion { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 3672 sub print_discussion {
|
Line 5728 sub print_discussion {
|
$datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); |
$datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); |
if ($item eq 'plc.roles.denied') { |
if ($item eq 'plc.roles.denied') { |
$datatable .= '</td><td align="right">'. |
$datatable .= '</td><td align="right">'. |
'<table>'.&role_checkboxes($cdom,$cnum,$item,$settings). |
'<table>'.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit). |
'</table>'; |
'</table>'; |
} elsif ($item eq 'plc.users.denied') { |
} elsif ($item eq 'plc.users.denied') { |
$datatable .= '</td><td align="right">'. |
$datatable .= '</td><td align="right">'. |
&user_table($cdom,$item,undef, |
&user_table($cdom,$item,undef, |
$settings->{$item},\%lt); |
$settings->{$item},\%lt,$noedit); |
} elsif ($item eq 'pch.roles.denied') { |
} elsif ($item eq 'pch.roles.denied') { |
$datatable .= '</td><td align="right">'. |
$datatable .= '</td><td align="right">'. |
'<table>'.&role_checkboxes($cdom,$cnum,$item,$settings). |
'<table>'.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit). |
'</table>'; |
'</table>'; |
} elsif ($item eq 'pch.users.denied') { |
} elsif ($item eq 'pch.users.denied') { |
$datatable .= '</td><td align="right">'. |
$datatable .= '</td><td align="right">'. |
&user_table($cdom,$item,undef, |
&user_table($cdom,$item,undef, |
$settings->{$item},\%lt); |
$settings->{$item},\%lt,$noedit); |
} elsif ($item eq 'pac.roles.denied') { |
} elsif ($item eq 'pac.roles.denied') { |
$datatable .= '</td><td align="right">'. |
$datatable .= '</td><td align="right">'. |
'<table>'.&role_checkboxes($cdom,$cnum,$item,$settings). |
'<table>'.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit). |
'</table>'; |
'</table>'; |
} elsif ($item eq 'pac.users.denied') { |
} elsif ($item eq 'pac.users.denied') { |
$datatable .= '</td><td align="right">'. |
$datatable .= '</td><td align="right">'. |
&user_table($cdom,$item,undef, |
&user_table($cdom,$item,undef, |
$settings->{$item},\%lt); |
$settings->{$item},\%lt,$noedit); |
} elsif ($item eq 'allow_limited_html_in_feedback') { |
} elsif ($item eq 'allow_limited_html_in_feedback') { |
$datatable .= &yesno_radio($item,$settings); |
$datatable .= &yesno_radio($item,$settings,undef,undef,undef,$noedit); |
} elsif ($item eq 'allow_discussion_post_editing') { |
} elsif ($item eq 'allow_discussion_post_editing') { |
$datatable .= '</td><td align="right"><br />'. |
$datatable .= '</td><td align="right"><br />'. |
&Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table(). |
Line 3703 sub print_discussion {
|
Line 5759 sub print_discussion {
|
'<th align="left">'.&mt('Role').'</th><th>'. |
'<th align="left">'.&mt('Role').'</th><th>'. |
&mt('Sections').'</th>'. |
&mt('Sections').'</th>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&role_checkboxes($cdom,$cnum,$item,$settings,1). |
&role_checkboxes($cdom,$cnum,$item,$settings,1,undef,$noedit). |
&Apache::loncommon::end_data_table().'<br />'; |
&Apache::loncommon::end_data_table().'<br />'; |
} elsif ($item eq 'discussion_post_fonts') { |
} elsif ($item eq 'discussion_post_fonts') { |
$datatable .= '</td><td align="right"><br />'. |
$datatable .= '</td><td align="right"><br />'. |
Line 3715 sub print_discussion {
|
Line 5771 sub print_discussion {
|
'<th align="center">'.&mt('font-style').'</th>'. |
'<th align="center">'.&mt('font-style').'</th>'. |
'<th align="center">'.&mt('Other css').'</th>'. |
'<th align="center">'.&mt('Other css').'</th>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&set_discussion_fonts($cdom,$cnum,$item,$settings). |
&set_discussion_fonts($cdom,$cnum,$item,$settings,$noedit). |
&Apache::loncommon::end_data_table().'<br />'; |
&Apache::loncommon::end_data_table().'<br />'; |
} |
} |
$datatable .= &item_table_row_end(); |
$datatable .= &item_table_row_end(); |
Line 3725 sub print_discussion {
|
Line 5781 sub print_discussion {
|
} |
} |
|
|
sub role_checkboxes { |
sub role_checkboxes { |
my ($cdom,$cnum,$item,$settings,$showsections,$crstype) = @_; |
my ($cdom,$cnum,$item,$settings,$showsections,$crstype,$noedit) = @_; |
my @roles = ('st','ad','ta','ep','in'); |
my @roles = ('st','ad','ta','ep','in'); |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
push(@roles,'co'); |
push(@roles,'co'); |
Line 3763 sub role_checkboxes {
|
Line 5819 sub role_checkboxes {
|
} |
} |
my $numinrow = 3; |
my $numinrow = 3; |
my $count = 0; |
my $count = 0; |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
foreach my $role (@roles) { |
foreach my $role (@roles) { |
my $checked = ''; |
my $checked = ''; |
if (grep(/^\Q$role\E$/,@current)) { |
if (grep(/^\Q$role\E$/,@current)) { |
Line 3781 sub role_checkboxes {
|
Line 5841 sub role_checkboxes {
|
} |
} |
} |
} |
$output .= '<td align="left"><span class="LC_nobreak"><label><input type="checkbox" name="'. |
$output .= '<td align="left"><span class="LC_nobreak"><label><input type="checkbox" name="'. |
$item.'" value="'.$role.'"'.$checked.'/> '. |
$item.'" value="'.$role.'"'.$checked.$disabled.'/> '. |
$plrole.'</label></span></td>'; |
$plrole.'</label></span></td>'; |
if ($showsections) { |
if ($showsections) { |
$output .= '<td align="left">'. |
$output .= '<td align="left">'. |
&select_sections($item,$role,\@sections,$currsec{$role}). |
&select_sections($item,$role,\@sections,$currsec{$role},$noedit). |
'</td></tr>'; |
'</td></tr>'; |
} |
} |
$count ++; |
$count ++; |
Line 3813 sub role_checkboxes {
|
Line 5873 sub role_checkboxes {
|
} |
} |
} |
} |
$output .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="'. |
$output .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="'. |
$item.'" value="'.$value.'"'.$checked.' /> '.$rolename. |
$item.'" value="'.$value.'"'.$checked.$disabled.' /> '.$rolename. |
'</label></span></td>'; |
'</label></span></td>'; |
if ($showsections) { |
if ($showsections) { |
$output .= '<td>'. |
$output .= '<td>'. |
&select_sections($item,$role,\@sections,$currsec{$role}). |
&select_sections($item,$role,\@sections,$currsec{$role},$noedit). |
'</td>'.&Apache::loncommon::end_data_table_row(); |
'</td>'.&Apache::loncommon::end_data_table_row(); |
} |
} |
$total ++; |
$total ++; |
Line 3839 sub role_checkboxes {
|
Line 5899 sub role_checkboxes {
|
} |
} |
|
|
sub set_discussion_fonts { |
sub set_discussion_fonts { |
my ($cdom,$cnum,$item,$settings) = @_; |
my ($cdom,$cnum,$item,$settings,$noedit) = @_; |
my ($classorder,$classtitles) = &discussion_vote_classes(); |
my ($classorder,$classtitles) = &discussion_vote_classes(); |
my ($styleorder,$styleitems) = &discussion_vote_styles(); |
my ($styleorder,$styleitems) = &discussion_vote_styles(); |
my $output; |
my $output; |
if (ref($classorder) eq 'ARRAY') { |
if (ref($classorder) eq 'ARRAY') { |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
foreach my $cat (@{$classorder}) { |
foreach my $cat (@{$classorder}) { |
my %curr = (); |
my %curr = (); |
($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) = |
($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) = |
Line 3860 sub set_discussion_fonts {
|
Line 5924 sub set_discussion_fonts {
|
($currsize,$currunit) = ($1,$2); |
($currsize,$currunit) = ($1,$2); |
$curr{'size'} = $currunit; |
$curr{'size'} = $currunit; |
} |
} |
$output .= '<input type="textbox" name="discussion_post_fonts_'.$cat.'_'.$item.'" value="'.$currsize.'" size="5">'. |
$output .= '<input type="textbox" name="discussion_post_fonts_'.$cat.'_'.$item.'" value="'.$currsize.'" size="5"'.$disabled.' />'. |
' '; |
' '; |
$selitem = 'unit'; |
$selitem = 'unit'; |
} |
} |
if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) { |
if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) { |
$output .= '<select name="discussion_post_fonts_'.$cat.'_'.$selitem.'">'; |
$output .= '<select name="discussion_post_fonts_'.$cat.'_'.$selitem.'"'.$disabled.'>'; |
foreach my $val (@{$styleitems->{$item}}) { |
foreach my $val (@{$styleitems->{$item}}) { |
my $sel; |
my $sel; |
if ($val eq $curr{$item}) { |
if ($val eq $curr{$item}) { |
Line 3876 sub set_discussion_fonts {
|
Line 5940 sub set_discussion_fonts {
|
} |
} |
} |
} |
} |
} |
$output .= '</span></td><td><input type="textbox" size="10" name="discussion_post_fonts_'.$cat.'_other" value="'.$curr{'other'}.'" /></td>'; |
$output .= '</span></td><td><input type="textbox" size="10" name="discussion_post_fonts_'.$cat.'_other" value="'.$curr{'other'}.'"'.$disabled.' /></td>'; |
} |
} |
$output .= &Apache::loncommon::end_data_table_row(); |
$output .= &Apache::loncommon::end_data_table_row(); |
} |
} |
Line 3908 sub discussion_vote_styles {
|
Line 5972 sub discussion_vote_styles {
|
} |
} |
|
|
sub print_classlists { |
sub print_classlists { |
my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype) = @_; |
my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
my @ordered; |
my @ordered; |
if ($position eq 'top') { |
if ($position eq 'top') { |
@ordered = ('default_enrollment_start_date', |
@ordered = ('default_enrollment_start_date', |
Line 3982 sub print_classlists {
|
Line 6046 sub print_classlists {
|
($settings->{'student_classlist_view'} eq 'section')) { |
($settings->{'student_classlist_view'} eq 'section')) { |
$settings->{'student_classlist_view'} = 'disabled'; |
$settings->{'student_classlist_view'} = 'disabled'; |
} |
} |
return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'classlists'); |
return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'classlists',$noedit); |
} |
} |
|
|
sub print_appearance { |
sub print_appearance { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 4038 sub print_appearance {
|
Line 6102 sub print_appearance {
|
text => '<b>'.&mt($itemtext->{'usejsme'}).'</b>', |
text => '<b>'.&mt($itemtext->{'usejsme'}).'</b>', |
input => 'radio', |
input => 'radio', |
}, |
}, |
|
'inline_chem' => { |
|
text => '<b>'.&mt($itemtext->{'inline_chem'}).'</b>', |
|
input => 'radio', |
|
}, |
|
'extresource' => { |
|
text => '<b>'.&mt($itemtext->{'extresource'}).'</b>', |
|
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'); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'appearance',$noedit); |
} |
} |
|
|
sub print_grading { |
sub print_grading { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 4095 sub print_grading {
|
Line 6173 sub print_grading {
|
input => 'radio', |
input => 'radio', |
}, |
}, |
); |
); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading'); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading',$noedit); |
} |
} |
|
|
sub print_printouts { |
sub print_printouts { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 4148 sub print_printouts {
|
Line 6226 sub print_printouts {
|
nullval => &mt('None specified - use domain default'), |
nullval => &mt('None specified - use domain default'), |
} |
} |
); |
); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'printouts'); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'printouts',$noedit); |
} |
} |
|
|
sub print_spreadsheet { |
sub print_spreadsheet { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 4184 sub print_spreadsheet {
|
Line 6262 sub print_spreadsheet {
|
input => 'radio', |
input => 'radio', |
}, |
}, |
); |
); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'spreadsheet'); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'spreadsheet',$noedit); |
} |
} |
|
|
sub print_bridgetasks { |
sub print_bridgetasks { |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; |
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
return; |
return; |
} |
} |
Line 4226 sub print_bridgetasks {
|
Line 6304 sub print_bridgetasks {
|
input => 'radio', |
input => 'radio', |
}, |
}, |
); |
); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'bridgetasks'); |
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'bridgetasks',$noedit); |
|
} |
|
|
|
sub print_ltitools { |
|
my ($cdom,$cnum,$settings,$rowtotal,$crstype,$noedit,$context) = @_; |
|
my ($datatable,$disabled,$css_class,$dest); |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
|
my $itemcount = 1; |
|
unless ($context eq 'domain') { |
|
my %tooltypes = &Apache::loncommon::usable_exttools(); |
|
unless ($tooltypes{'crs'}) { |
|
my $showtype = 'course'; |
|
if ($crstype eq 'Community') { |
|
$showtype = lc($crstype); |
|
} |
|
$css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
$datatable = '<tr '.$css_class.'><td colspan="2">'. |
|
&mt("Definition of external tools is not enabled for this $showtype.").'<br />'; |
|
if ($tooltypes{'dom'}) { |
|
$datatable .= &mt("Contact an administrator for the $showtype domain ([_1]) to request this feature be enabled.", |
|
'<i>'.$cdom.'</i>'). |
|
'<br /><br />'. |
|
&mt("Use of external tools defined at a domain level is enabled, so the $showtype editor can be used to add tool(s), if any have been defined."); |
|
} else { |
|
$datatable .= &mt("Use of external tools defined at a domain level is not enabled, either, for this $showtype."). |
|
'<br /><br />'. |
|
&mt("Contact an administrator for the $showtype domain ([_1]) to request changes.", |
|
'<i>'.$cdom.'</i>'); |
|
|
|
} |
|
$datatable .= '</tr>'; |
|
$itemcount ++; |
|
return $datatable; |
|
} |
|
} |
|
my %lt = <itools_names(); |
|
my $maxnum = 0; |
|
my %ordered; |
|
if (ref($settings) eq 'HASH') { |
|
foreach my $item (keys(%{$settings})) { |
|
if (ref($settings->{$item}) eq 'HASH') { |
|
my $num = $settings->{$item}{'order'}; |
|
$ordered{$num} = $item; |
|
} |
|
} |
|
} |
|
|
|
if ($context eq 'domain') { |
|
$dest = '/adm/domainprefs'; |
|
} else { |
|
$dest = '/adm/courseprefs'; |
|
} |
|
my ($switchserver,$switchmessage); |
|
$switchserver = &check_switchserver($cdom,$cnum,$context,$dest); |
|
if ($switchserver) { |
|
if ($context eq 'domain') { |
|
$switchmessage = &mt("submit from domain's primary library server: [_1].",$switchserver); |
|
} elsif ($crstype eq 'Community') { |
|
$switchmessage = &mt("submit from community's home server: [_1].",$switchserver); |
|
} else { |
|
$switchmessage = &mt("submit from course's home server: [_1].",$switchserver); |
|
} |
|
} |
|
my $maxnum = scalar(keys(%ordered)); |
|
my @courseroles = ('cc','in','ta','ep','st'); |
|
my @ltiroles = qw(Instructor ContentDeveloper TeachingAssistant Learner); |
|
my @fields = ('fullname','firstname','lastname','email','roles','user'); |
|
if (keys(%ordered)) { |
|
my @items = sort { $a <=> $b } keys(%ordered); |
|
for (my $i=0; $i<@items; $i++) { |
|
$css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
my $item = $ordered{$items[$i]}; |
|
my ($title,$key,$url,$usable,$lifetime,$imgsrc,%sigsel); |
|
if (ref($settings->{$item}) eq 'HASH') { |
|
$title = $settings->{$item}->{'title'}; |
|
$url = $settings->{$item}->{'url'}; |
|
$key = $settings->{$item}->{'key'}; |
|
$usable = $settings->{$item}->{'usable'}; |
|
$lifetime = $settings->{$item}->{'lifetime'}; |
|
my $image = $settings->{$item}->{'image'}; |
|
if ($image ne '') { |
|
$imgsrc = '<img src="'.$image.'" alt="'.&mt('Tool Provider icon').'" />'; |
|
} |
|
if ($settings->{$item}->{'sigmethod'} eq 'HMAC-256') { |
|
$sigsel{'HMAC-256'} = ' selected="selected"'; |
|
} else { |
|
$sigsel{'HMAC-SHA1'} = ' selected="selected"'; |
|
} |
|
} |
|
my $chgstr = ' onchange="javascript:reorderLTITools(this.form,'."'ltitools_".$item."'".');"'; |
|
$datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">' |
|
.'<select name="ltitools_'.$item.'"'.$chgstr.'>'; |
|
for (my $k=0; $k<=$maxnum; $k++) { |
|
my $vpos = $k+1; |
|
my $selstr; |
|
if ($k == $i) { |
|
$selstr = ' selected="selected" '; |
|
} |
|
$datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>'; |
|
} |
|
$datatable .= '</select>'.(' 'x2). |
|
'<label><input type="checkbox" name="ltitools_del" value="'.$item.'" />'. |
|
&mt('Delete?').'</label></span></td>'. |
|
'<td colspan="2">'. |
|
'<fieldset><legend>'.&mt('Required settings').'</legend>'. |
|
'<span class="LC_nobreak">'.$lt{'title'}.':<input type="text" size="20" name="ltitools_title_'.$i.'" value="'.$title.'" /></span> '. |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'version'}.':<select name="ltitools_version_'.$i.'">'. |
|
'<option value="LTI-1p0" selected="selected">1.1</option></select></span> '. |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'msgtype'}.':<select name="ltitools_msgtype_'.$i.'">'. |
|
'<option value="basic-lti-launch-request" selected="selected">Launch</option></select></span> '. |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'sigmethod'}.':<select name="ltitools_sigmethod_'.$i.'">'. |
|
'<option value="HMAC-SHA1"'.$sigsel{'HMAC-SHA1'}.'>HMAC-SHA1</option>'. |
|
'<option value="HMAC-SHA256"'.$sigsel{'HMAC-SHA256'}.'>HMAC-SHA256</option></select></span>'. |
|
'<br /><br />'. |
|
'<span class="LC_nobreak">'.$lt{'url'}.':<input type="text" size="60" name="ltitools_url_'.$i.'"'. |
|
' value="'.$url.'" /></span>'. |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'lifetime'}.':'. |
|
'<input type="text" size="5" name="ltitools_lifetime_'.$i.'" value="'.$lifetime.'" /></span><br /><br />'; |
|
if ($key ne '') { |
|
$datatable .= '<span class="LC_nobreak">'.$lt{'key'}; |
|
if ($noedit) { |
|
$datatable .= ': ['.&mt('not shown').']'; |
|
} elsif ($switchserver) { |
|
$datatable .= ': ['.&mt('[_1] to view/edit',$switchserver).']'; |
|
} else { |
|
$datatable .= ':<input type="text" size="25" name="ltitools_key_'.$i.'" value="'.$key.'" autocomplete="off"'.$disabled.' />'; |
|
} |
|
$datatable .= '</span> '.(' 'x2); |
|
} elsif (!$switchserver) { |
|
$datatable .= '<span class="LC_nobreak">'.$lt{'key'}.':'. |
|
'<input type="text" size="25" name="ltitools_key_'.$i.'" value="'.$key.'" autocomplete="off"'.$disabled.' />'. |
|
'</span> '.(' 'x2); |
|
} |
|
if ($switchserver) { |
|
if ($usable ne '') { |
|
$datatable .= '<div id="ltitools_divcurrsecret_'.$i.'" style="display:inline-block" /><span class="LC_nobreak">'. |
|
$lt{'secret'}.': ['.&mt('not shown').'] '.(' 'x2).'</span></div>'. |
|
'<span class="LC_nobreak">'.&mt('Change secret?'). |
|
'<label><input type="radio" value="0" name="ltitools_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','ltitools'".');" checked="checked"'.$disabled.' />'.&mt('No').'</label>'. |
|
(' 'x2). |
|
'<label><input type="radio" value="1" name="ltitools_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','ltitools'".');" '.$disabled.' />'.&mt('Yes').'</label>'.(' 'x2). |
|
'</span><div id="ltitools_divchgsecret_'.$i.'" style="display:none" />'. |
|
'<span class="LC_nobreak"> - '.$switchmessage.'</span>'. |
|
'</div>'; |
|
} elsif ($key eq '') { |
|
$datatable .= '<span class="LC_nobreak">'.&mt('Key and Secret are required').' - '.$switchmessage.'</span>'."\n"; |
|
} else { |
|
$datatable .= '<span class="LC_nobreak">'.&mt('Secret required').' - '.$switchmessage.'</span>'."\n"; |
|
} |
|
$datatable .= '<input type="hidden" name="ltitools_id_'.$i.'" value="'.$item.'" />'; |
|
} else { |
|
if ($usable ne '') { |
|
$datatable .= '<div id="ltitools_divcurrsecret_'.$i.'" style="display:inline-block" /><span class="LC_nobreak">'. |
|
$lt{'secret'}.': ['.&mt('not shown').'] '.(' 'x2).'</span></div>'. |
|
'<span class="LC_nobreak">'.&mt('Change?'). |
|
'<label><input type="radio" value="0" name="ltitools_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','ltitools'".');" checked="checked"'.$disabled.' />'.&mt('No').'</label>'. |
|
(' 'x2). |
|
'<label><input type="radio" value="1" name="ltitools_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','ltitools'".');"'.$disabled.' />'.&mt('Yes'). |
|
'</label> </span><div id="ltitools_divchgsecret_'.$i.'" style="display:none" />'. |
|
'<span class="LC_nobreak">'.&mt('New Secret').':'. |
|
'<input type="password" size="20" name="ltitools_secret_'.$i.'" value="" autocomplete="new-password"'.$disabled.' />'. |
|
'<label><input type="checkbox" name="ltitools_visible_'.$i.'" id="ltitools_visible_'.$i.'" onclick="if (this.checked) { this.form.ltitools_secret_'.$i.'.type='."'text'".' } else { this.form.ltitools_secret_'.$i.'.type='."'password'".' }"'.$disabled.' />'.&mt('Visible input').'</label>'. |
|
'<input type="hidden" name="ltitools_id_'.$i.'" value="'.$item.'" /></span></div>'; |
|
} else { |
|
$datatable .= |
|
'<span class="LC_nobreak">'.$lt{'secret'}.':'. |
|
'<input type="password" size="20" name="ltitools_secret_'.$i.'" value="" autocomplete="new-password"'.$disabled.' />'. |
|
'<label><input type="checkbox" name="ltitools_visible_'.$i.'" id="ltitools_visible_'.$i.'" onclick="if (this.checked) { this.form.ltitools_secret_'.$i.'.type='."'text'".' } else { this.form.ltitools_secret_'.$i.'.type='."'password'".' }"'.$disabled.' />'.&mt('Visible input').'</label>'. |
|
'<input type="hidden" name="ltitools_id_'.$i.'" value="'.$item.'" /></span>'; |
|
} |
|
} |
|
$datatable .= '</fieldset>'. |
|
'<fieldset><legend>'.&mt('Optional settings').'</legend>'. |
|
'<span class="LC_nobreak">'.&mt('Display target:'); |
|
my %currdisp; |
|
if (ref($settings->{$item}->{'display'}) eq 'HASH') { |
|
if ($settings->{$item}->{'display'}->{'target'} eq 'window') { |
|
$currdisp{'window'} = ' checked="checked"'; |
|
} elsif ($settings->{$item}->{'display'}->{'target'} eq 'tab') { |
|
$currdisp{'tab'} = ' checked="checked"'; |
|
} else { |
|
$currdisp{'iframe'} = ' checked="checked"'; |
|
} |
|
if ($settings->{$item}->{'display'}->{'width'} =~ /^(\d+)$/) { |
|
$currdisp{'width'} = $1; |
|
} |
|
if ($settings->{$item}->{'display'}->{'height'} =~ /^(\d+)$/) { |
|
$currdisp{'height'} = $1; |
|
} |
|
$currdisp{'linktext'} = $settings->{$item}->{'display'}->{'linktext'}; |
|
$currdisp{'explanation'} = $settings->{$item}->{'display'}->{'explanation'}; |
|
} else { |
|
$currdisp{'iframe'} = ' checked="checked"'; |
|
} |
|
foreach my $disp ('iframe','tab','window') { |
|
$datatable .= '<label><input type="radio" name="ltitools_target_'.$i.'" value="'.$disp.'"'.$currdisp{$disp}.' />'. |
|
$lt{$disp}.'</label>'.(' 'x2); |
|
} |
|
$datatable .= (' 'x4); |
|
foreach my $dimen ('width','height') { |
|
$datatable .= '<label>'.$lt{$dimen}.' '. |
|
'<input type="text" name="ltitools_'.$dimen.'_'.$i.'" size="5" value="'.$currdisp{$dimen}.'" /></label>'. |
|
(' 'x2); |
|
} |
|
$datatable .= '</span><br />'. |
|
'<div class="LC_left_float">'.$lt{'linktext'}.'<br />'. |
|
'<input type="text" name="ltitools_linktext_'.$i.'" size="25" value="'.$currdisp{'linktext'}.'" /></div>'. |
|
'<div class="LC_left_float">'.$lt{'explanation'}.'<br />'. |
|
'<textarea name="ltitools_explanation_'.$i.'" rows="5" cols="40">'.$currdisp{'explanation'}. |
|
'</textarea></div><div style=""></div><br />'; |
|
my %units = ( |
|
'passback' => 'days', |
|
'roster' => 'seconds', |
|
); |
|
foreach my $extra ('passback','roster') { |
|
my $validsty = 'none'; |
|
my $currvalid; |
|
my $checkedon = ''; |
|
my $checkedoff = ' checked="checked"'; |
|
if ($settings->{$item}->{$extra}) { |
|
$checkedon = $checkedoff; |
|
$checkedoff = ''; |
|
$validsty = 'inline-block'; |
|
if ($settings->{$item}->{$extra.'valid'} =~ /^\d+\.?\d*$/) { |
|
$currvalid = $settings->{$item}->{$extra.'valid'}; |
|
} |
|
} |
|
my $onclick = ' onclick="toggleLTITools(this.form,'."'$extra','$i'".');"'; |
|
$datatable .= '<div class="LC_floatleft"><span class="LC_nobreak">'.$lt{$extra}.' '. |
|
'<label><input type="radio" name="ltitools_'.$extra.'_'.$i.'" value="0"'.$checkedoff.$onclick.' />'. |
|
&mt('No').'</label>'.(' 'x2). |
|
'<label><input type="radio" name="ltitools_'.$extra.'_'.$i.'" value="1"'.$checkedon.$onclick.' />'. |
|
&mt('Yes').'</label></span></div>'. |
|
'<div class="LC_floatleft" style="display:'.$validsty.';" id="ltitools_'.$extra.'time_'.$i.'">'. |
|
'<span class="LC_nobreak">'. |
|
&mt("until at least [_1] $units{$extra} after launch", |
|
'<input type="text" name="ltitools_'.$extra.'valid_'.$i.'" value="'.$currvalid.'" />'). |
|
'</span></div><div style="padding:0;clear:both;margin:0;border:0"></div>'; |
|
} |
|
$datatable .= '<span class="LC_nobreak">'.$lt{'icon'}.': '; |
|
if ($imgsrc) { |
|
$datatable .= $imgsrc. |
|
'<label><input type="checkbox" name="ltitools_image_del"'. |
|
' value="'.$item.'" />'.&mt('Delete?').'</label></span> '. |
|
'<span class="LC_nobreak"> '.&mt('Replace:').' '; |
|
} else { |
|
$datatable .= '('.&mt('if larger than 21x21 pixels, image will be scaled').') '; |
|
} |
|
if ($switchserver) { |
|
$datatable .= &mt('Upload to library server: [_1]',$switchserver); |
|
} else { |
|
$datatable .= '<input type="file" name="ltitools_image_'.$i.'" value="" />'; |
|
} |
|
$datatable .= '</span></fieldset>'; |
|
my (%checkedfields,%rolemaps,$userincdom); |
|
if (ref($settings->{$item}) eq 'HASH') { |
|
if (ref($settings->{$item}->{'fields'}) eq 'HASH') { |
|
%checkedfields = %{$settings->{$item}->{'fields'}}; |
|
} |
|
$userincdom = $settings->{$item}->{'incdom'}; |
|
if (ref($settings->{$item}->{'roles'}) eq 'HASH') { |
|
%rolemaps = %{$settings->{$item}->{'roles'}}; |
|
$checkedfields{'roles'} = 1; |
|
} |
|
} |
|
$datatable .= '<fieldset><legend>'.&mt('User data sent on launch').'</legend>'. |
|
'<span class="LC_nobreak">'; |
|
my $userfieldstyle = 'display:none;'; |
|
my $seluserdom = ''; |
|
my $unseluserdom = ' selected="selected"'; |
|
foreach my $field (@fields) { |
|
my ($checked,$onclick,$id,$spacer); |
|
if ($checkedfields{$field}) { |
|
$checked = ' checked="checked"'; |
|
} |
|
if ($field eq 'user') { |
|
$id = ' id="ltitools_user_field_'.$i.'"'; |
|
$onclick = ' onclick="toggleLTITools(this.form,'."'$field','$i'".')"'; |
|
if ($checked) { |
|
$userfieldstyle = 'display:inline-block'; |
|
if ($userincdom) { |
|
$seluserdom = $unseluserdom; |
|
$unseluserdom = ''; |
|
} |
|
} |
|
} else { |
|
$spacer = (' ' x2); |
|
} |
|
$datatable .= '<label>'. |
|
'<input type="checkbox" name="ltitools_fields_'.$i.'" value="'.$field.'"'.$id.$checked.$onclick.' />'. |
|
$lt{$field}.'</label>'.$spacer; |
|
} |
|
$datatable .= '</span>'; |
|
$datatable .= '<div style="'.$userfieldstyle.'" id="ltitools_user_div_'.$i.'">'. |
|
'<span class="LC_nobreak"> : '. |
|
'<select name="ltitools_userincdom_'.$i.'">'. |
|
'<option value="">'.&mt('Select').'</option>'. |
|
'<option value="0"'.$unseluserdom.'>'.&mt('username').'</option>'. |
|
'<option value="1"'.$seluserdom.'>'.&mt('username:domain').'</option>'. |
|
'</select></span></div>'; |
|
$datatable .= '</fieldset>'. |
|
'<fieldset><legend>'.&mt('Role mapping').'</legend><table><tr>'; |
|
foreach my $role (@courseroles) { |
|
my ($selected,$selectnone); |
|
if (!$rolemaps{$role}) { |
|
$selectnone = ' selected="selected"'; |
|
} |
|
$datatable .= '<td style="text-align: center">'. |
|
&Apache::lonnet::plaintext($role,'Course').'<br />'. |
|
'<select name="ltitools_roles_'.$role.'_'.$i.'">'. |
|
'<option value=""'.$selectnone.'>'.&mt('Select').'</option>'; |
|
foreach my $ltirole (@ltiroles) { |
|
unless ($selectnone) { |
|
if ($rolemaps{$role} eq $ltirole) { |
|
$selected = ' selected="selected"'; |
|
} else { |
|
$selected = ''; |
|
} |
|
} |
|
$datatable .= '<option value="'.$ltirole.'"'.$selected.'>'.$ltirole.'</option>'; |
|
} |
|
$datatable .= '</select></td>'; |
|
} |
|
$datatable .= '</tr></table></fieldset>'; |
|
my %courseconfig; |
|
if (ref($settings->{$item}) eq 'HASH') { |
|
if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') { |
|
%courseconfig = %{$settings->{$item}->{'crsconf'}}; |
|
} |
|
} |
|
$datatable .= '<fieldset><legend>'.&mt('Configurable in course').'</legend><span class="LC_nobreak">'; |
|
foreach my $item ('label','title','target','linktext','explanation','append') { |
|
my $checked; |
|
if ($courseconfig{$item}) { |
|
$checked = ' checked="checked"'; |
|
} |
|
$datatable .= '<label>'. |
|
'<input type="checkbox" name="ltitools_courseconfig_'.$i.'" value="'.$item.'"'.$checked.' />'. |
|
$lt{'crs'.$item}.'</label> '."\n"; |
|
} |
|
$datatable .= '</span></fieldset>'. |
|
'<fieldset><legend>'.&mt('Custom items sent on launch').'</legend>'. |
|
'<table><tr><th>'.&mt('Action').'</th><th>'.&mt('Name').'</th><th>'.&mt('Value').'</th></tr>'; |
|
if (ref($settings->{$item}->{'custom'}) eq 'HASH') { |
|
my %custom = %{$settings->{$item}->{'custom'}}; |
|
if (keys(%custom) > 0) { |
|
foreach my $key (sort(keys(%custom))) { |
|
$datatable .= '<tr><td><span class="LC_nobreak">'. |
|
'<label><input type="checkbox" name="ltitools_customdel_'.$i.'" value="'. |
|
$key.'" />'.&mt('Delete').'</label></span></td><td>'.$key.'</td>'. |
|
'<td><input type="text" name="ltitools_customval_'.$key.'_'.$i.'"'. |
|
' value="'.$custom{$key}.'" /></td></tr>'; |
|
} |
|
} |
|
} |
|
$datatable .= '<tr><td><span class="LC_nobreak">'. |
|
'<label><input type="checkbox" name="ltitools_customadd" value="'.$i.'" />'. |
|
&mt('Add').'</label></span></td><td><input type="text" name="ltitools_custom_name_'.$i.'" />'. |
|
'</td><td><input type="text" name="ltitools_custom_value_'.$i.'" /></td></tr>'; |
|
$datatable .= '</table></fieldset></td></tr>'."\n"; |
|
$itemcount ++; |
|
} |
|
} |
|
$css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
my $chgstr = ' onchange="javascript:reorderLTITools(this.form,'."'ltitools_add_pos'".');"'; |
|
$datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n". |
|
'<input type="hidden" name="ltitools_maxnum" value="'.$maxnum.'" />'."\n". |
|
'<select name="ltitools_add_pos"'.$chgstr.'>'; |
|
for (my $k=0; $k<$maxnum+1; $k++) { |
|
my $vpos = $k+1; |
|
my $selstr; |
|
if ($k == $maxnum) { |
|
$selstr = ' selected="selected" '; |
|
} |
|
$datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>'; |
|
} |
|
$datatable .= '</select> '."\n". |
|
'<input type="checkbox" name="ltitools_add" value="1" />'.&mt('Add').'</span></td>'."\n". |
|
'<td colspan="2">'. |
|
'<fieldset><legend>'.&mt('Required settings').'</legend>'. |
|
'<span class="LC_nobreak">'.$lt{'title'}.':<input type="text" size="20" name="ltitools_add_title" value="" /></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'version'}.':<select name="ltitools_add_version">'. |
|
'<option value="LTI-1p0" selected="selected">1.1</option></select></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'msgtype'}.':<select name="ltitools_add_msgtype">'. |
|
'<option value="basic-lti-launch-request" selected="selected">Launch</option></select></span> '. |
|
'<span class="LC_nobreak">'.$lt{'sigmethod'}.':<select name="ltitools_add_sigmethod">'. |
|
'<option value="HMAC-SHA1" selected="selected">HMAC-SHA1</option>'. |
|
'<option value="HMAC-SHA256">HMAC-SHA256</option></select></span>'. |
|
'<br />'. |
|
'<span class="LC_nobreak">'.$lt{'url'}.':<input type="text" size="60" name="ltitools_add_url" value="" /></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'lifetime'}.':<input type="text" size="5" name="ltitools_add_lifetime" value="300" /></span><br />'; |
|
if ($switchserver) { |
|
$datatable .= '<span class="LC_nobreak">'.&mt('Key and Secret are required').' - '.$switchmessage.'</span>'."\n"; |
|
} else { |
|
$datatable .= '<span class="LC_nobreak">'.$lt{'key'}.':<input type="text" size="25" name="ltitools_add_key" value="" autocomplete="off"'.$disabled.' /></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$lt{'secret'}.':<input type="password" size="20" name="ltitools_secret_add" value="" autocomplete="new-password"'.$disabled.' />'. |
|
'<label><input type="checkbox" name="ltitools_add_visible" id="ltitools_add_visible" onclick="if (this.checked) { this.form.ltitools_secret_add.type='."'text'".' } else { this.form.ltitools_secret_add.type='."'password'".' }"'.$disabled.' />'.&mt('Visible input').'</label></span> '."\n"; |
|
} |
|
$datatable .= '<br /><br />'. |
|
'</fieldset>'. |
|
'<fieldset><legend>'.&mt('Optional settings').'</legend>'. |
|
'<span class="LC_nobreak">'.&mt('Display target:'); |
|
my %defaultdisp; |
|
$defaultdisp{'iframe'} = ' checked="checked"'; |
|
foreach my $disp ('iframe','tab','window') { |
|
$datatable .= '<label><input type="radio" name="ltitools_add_target" value="'.$disp.'"'.$defaultdisp{$disp}.' />'. |
|
$lt{$disp}.'</label>'.(' 'x2); |
|
} |
|
$datatable .= (' 'x4); |
|
foreach my $dimen ('width','height') { |
|
$datatable .= '<label>'.$lt{$dimen}.' '. |
|
'<input type="text" name="ltitools_add_'.$dimen.'" size="5" /></label>'. |
|
(' 'x2); |
|
} |
|
$datatable .= '</span><br />'. |
|
'<div class="LC_left_float">'.$lt{'linktext'}.'<br />'. |
|
'<input type="text" name="ltitools_add_linktext" size="5" /></div>'. |
|
'<div class="LC_left_float">'.$lt{'explanation'}.'<br />'. |
|
'<textarea name="ltitools_add_explanation" rows="5" cols="40"></textarea>'. |
|
'</div><div style=""></div><br />'; |
|
my %units = ( |
|
'passback' => 'days', |
|
'roster' => 'seconds', |
|
); |
|
my %defaulttimes = ( |
|
'passback' => '7', |
|
'roster' => '300', |
|
); |
|
foreach my $extra ('passback','roster') { |
|
my $onclick = ' onclick="toggleLTITools(this.form,'."'$extra','add'".');"'; |
|
$datatable .= '<div class="LC_floatleft"><span class="LC_nobreak">'.$lt{$extra}.' '. |
|
'<label><input type="radio" name="ltitools_'.$extra.'_add" value="0" checked="checked"'.$onclick.' />'. |
|
&mt('No').'</label></span>'.(' 'x2).'<span class="LC_nobreak">'. |
|
'<label><input type="radio" name="ltitools_'.$extra.'_add" value="1"'.$onclick.' />'. |
|
&mt('Yes').'</label></span></div>'. |
|
'<div class="LC_floatleft" style="display:none;" id="ltitools_'.$extra.'time_add">'. |
|
'<span class="LC_nobreak">'. |
|
&mt("until at least [_1] $units{$extra} after launch", |
|
'<input type="text" name="ltitools_'.$extra.'valid_add" value="'.$defaulttimes{$extra}.'" />'). |
|
'</span></div><div style="padding:0;clear:both;margin:0;border:0"></div>'; |
|
} |
|
$datatable .= '<span class="LC_nobreak">'.$lt{'icon'}.': '. |
|
'('.&mt('if larger than 21x21 pixels, image will be scaled').') '; |
|
if ($switchserver) { |
|
$datatable .= &mt('Upload to library server: [_1]',$switchserver); |
|
} else { |
|
$datatable .= '<input type="file" name="ltitools_add_image" value="" />'; |
|
} |
|
$datatable .= '</span></fieldset>'. |
|
'<fieldset><legend>'.&mt('User data sent on launch').'</legend>'. |
|
'<span class="LC_nobreak">'; |
|
foreach my $field (@fields) { |
|
my ($id,$onclick,$spacer); |
|
if ($field eq 'user') { |
|
$id = ' id="ltitools_user_field_add"'; |
|
$onclick = ' onclick="toggleLTITools(this.form,'."'$field','add'".')"'; |
|
} else { |
|
$spacer = (' ' x2); |
|
} |
|
$datatable .= '<label>'. |
|
'<input type="checkbox" name="ltitools_add_fields" value="'.$field.'"'.$id.$onclick.' />'. |
|
$lt{$field}.'</label>'.$spacer; |
|
} |
|
$datatable .= '</span>'. |
|
'<div style="display:none;" id="ltitools_user_div_add">'. |
|
'<span class="LC_nobreak"> : '. |
|
'<select name="ltitools_add_userincdom">'. |
|
'<option value="" selected="selected">'.&mt('Select').'</option>'. |
|
'<option value="0">'.&mt('username').'</option>'. |
|
'<option value="1">'.&mt('username:domain').'</option>'. |
|
'</select></span></div></fieldset>'; |
|
$datatable .= '<fieldset><legend>'.&mt('Role mapping').'</legend><table><tr>'; |
|
foreach my $role (@courseroles) { |
|
my ($checked,$checkednone); |
|
$datatable .= '<td style="text-align: center">'. |
|
&Apache::lonnet::plaintext($role,'Course').'<br />'. |
|
'<select name="ltitools_add_roles_'.$role.'">'. |
|
'<option value="" selected="selected">'.&mt('Select').'</option>'; |
|
foreach my $ltirole (@ltiroles) { |
|
$datatable .= '<option value="'.$ltirole.'">'.$ltirole.'</option>'; |
|
} |
|
$datatable .= '</select></td>'; |
|
} |
|
$datatable .= '</tr></table></fieldset>'. |
|
'<fieldset><legend>'.&mt('Configurable in course').'</legend><span class="LC_nobreak">'; |
|
foreach my $item ('label','title','target','linktext','explanation','append') { |
|
$datatable .= '<label>'. |
|
'<input type="checkbox" name="ltitools_add_courseconfig" value="'.$item.'" checked="checked" />'. |
|
$lt{'crs'.$item}.'</label>'.(' ' x2)."\n"; |
|
} |
|
$datatable .= '</span></fieldset>'. |
|
'<fieldset><legend>'.&mt('Custom items sent on launch').'</legend>'. |
|
'<table><tr><th>'.&mt('Action').'</th><th>'.&mt('Name').'</th><th>'.&mt('Value').'</th></tr>'. |
|
'<tr><td><span class="LC_nobreak">'. |
|
'<label><input type="checkbox" name="ltitools_add_custom" value="1" />'. |
|
&mt('Add').'</label></span></td><td><input type="text" name="ltitools_add_custom_name" />'. |
|
'</td><td><input type="text" name="ltitools_add_custom_value" /></td></tr>'. |
|
'</table></fieldset>'."\n". |
|
'</td>'."\n". |
|
'</tr>'."\n"; |
|
$itemcount ++; |
|
return $datatable; |
|
} |
|
|
|
sub ltitools_names { |
|
my %lt = &Apache::lonlocal::texthash( |
|
'title' => 'Title', |
|
'version' => 'Version', |
|
'msgtype' => 'Message Type', |
|
'sigmethod' => 'Signature Method', |
|
'url' => 'URL', |
|
'key' => 'Key', |
|
'lifetime' => 'Nonce lifetime (s)', |
|
'secret' => 'Secret', |
|
'icon' => 'Icon', |
|
'user' => 'User', |
|
'fullname' => 'Full Name', |
|
'firstname' => 'First Name', |
|
'lastname' => 'Last Name', |
|
'email' => 'E-mail', |
|
'roles' => 'Role', |
|
'window' => 'Window', |
|
'tab' => 'Tab', |
|
'iframe' => 'iFrame', |
|
'height' => 'Height', |
|
'width' => 'Width', |
|
'linktext' => 'Default Link Text', |
|
'explanation' => 'Default Explanation', |
|
'passback' => 'Tool can return grades:', |
|
'roster' => 'Tool can retrieve roster:', |
|
'crstarget' => 'Display target', |
|
'crslabel' => 'Course label', |
|
'crstitle' => 'Course title', |
|
'crslinktext' => 'Link Text', |
|
'crsexplanation' => 'Explanation', |
|
'crsappend' => 'Provider URL', |
|
); |
|
return %lt; |
|
} |
|
|
|
sub print_lti { |
|
my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
|
unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { |
|
return; |
|
} |
|
my @menuitems = ('fullname','coursetitle','role','logout','grades'); |
|
my %menutitles = <imenu_titles(); |
|
my ($domdefs,$displaydefs); |
|
if ($env{'request.lti.login'}) { |
|
my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider'); |
|
my @domdefsmenu; |
|
if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') { |
|
if ($lti{$env{'request.lti.login'}}{'topmenu'}) { |
|
$domdefs = &mt('Header shown').', '; |
|
} |
|
if ($lti{$env{'request.lti.login'}}{'inlinemenu'}) { |
|
$domdefs .= &mt('Inline menu shown'); |
|
} |
|
$domdefs =~ s/,\s$//; |
|
if (!$domdefs) { |
|
$domdefs = &mt('No header or inline menu shown'); |
|
} |
|
$domdefs = ' ('.&mt('Domain default').': '.$domdefs.')'; |
|
if (ref($lti{$env{'request.lti.login'}}{'lcmenu'}) eq 'ARRAY') { |
|
@domdefsmenu = @{$lti{$env{'request.lti.login'}}{'lcmenu'}}; |
|
} |
|
} |
|
$displaydefs = &mt('Domain defaults'); |
|
if (@domdefsmenu) { |
|
my @diffs = &Apache::loncommon::compare_arrays(\@menuitems,\@domdefsmenu); |
|
if (@diffs) { |
|
my $missing; |
|
foreach my $item (@menuitems) { |
|
unless (grep(/^\Q$item\E$/,@domdefsmenu)) { |
|
$missing .= ' '.$menutitles{$item}.','; |
|
} |
|
} |
|
$missing =~ s/,$//; |
|
$displaydefs .= ': '.&mt('Not shown').' --'.$missing; |
|
} else { |
|
$displaydefs .= ': '.&mt('All shown'); |
|
} |
|
} else { |
|
$displaydefs .= ': '.&mt('Not shown').' -- '.join(', ', map { $menutitles{$_}; } @menuitems); |
|
} |
|
} else { |
|
$displaydefs = &mt('Domain defaults only available in LTI context'); |
|
} |
|
my %items = ( |
|
'lti.override' => { |
|
text => '<b>'.&mt($itemtext->{'lti.override'}).'</b>'.$domdefs, |
|
input => 'radio', |
|
}, |
|
'lti.topmenu' => { |
|
text => '<b>'.&mt($itemtext->{'lti.topmenu'}).'</b>', |
|
input => 'radio', |
|
}, |
|
'lti.inlinemenu' => { |
|
text => '<b>'.&mt($itemtext->{'lti.inlinemenu'}).'</b>', |
|
input => 'radio', |
|
}, |
|
'lti.lcmenu' => { |
|
text => '<b>'.&mt($itemtext->{'lti.lcmenu'}).'</b><br />'.$displaydefs, |
|
input => 'custom', |
|
}, |
|
); |
|
return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'lti',$noedit); |
|
} |
|
|
|
sub lcmenu_checkboxes { |
|
my ($cdom,$caller,$settings,$crstype,$noedit) = @_; |
|
my @menuitems = ('fullname','coursetitle','role','logout','grades'); |
|
my %menutitles = <imenu_titles(); |
|
my (@current,@domdefs); |
|
if ($env{'request.lti.login'}) { |
|
my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider'); |
|
if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') { |
|
if (ref($lti{$env{'request.lti.login'}}{'lcmenu'}) eq 'ARRAY') { |
|
@domdefs = @{$lti{$env{'request.lti.login'}}{'lcmenu'}}; |
|
} |
|
} |
|
} |
|
if (ref($settings) eq 'HASH') { |
|
if ($settings->{'lti.lcmenu'}) { |
|
unless ($settings->{'lti.lcmenu'} eq 'none') { |
|
@current = split(',',$settings->{'lti.lcmenu'}); |
|
} |
|
} else { |
|
@current = @domdefs; |
|
} |
|
} else { |
|
@current = @domdefs; |
|
} |
|
my $numinrow = 3; |
|
my $count = 0; |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
|
my $output = '<table>'; |
|
foreach my $item (@menuitems) { |
|
my $checked = ''; |
|
if (grep(/^\Q$item\E$/,@current)) { |
|
$checked = ' checked="checked" '; |
|
} |
|
my $rem = $count%($numinrow); |
|
if ($rem == 0) { |
|
if ($count > 0) { |
|
$output .= '</tr>'; |
|
} |
|
$output .= '<tr>'; |
|
} |
|
$output .= '<td align="left"><span class="LC_nobreak"><label><input type="checkbox" '. |
|
'name="lti.lcmenu" value="'.$item.'"'.$checked.$disabled.'/> '. |
|
$menutitles{$item}.'</label></span></td>'; |
|
$count ++; |
|
} |
|
my $rem = $count%($numinrow); |
|
my $colsleft = $numinrow - $rem; |
|
if ($colsleft > 1 ) { |
|
$output .= '<td colspan="'.$colsleft.'" class="LC_left_item">'. |
|
' </td>'; |
|
} elsif ($colsleft == 1) { |
|
$output .= '<td class="LC_left_item"> </td>'; |
|
} |
|
$output .= '</tr></table>'; |
|
} |
|
|
|
sub ltimenu_titles { |
|
return &Apache::lonlocal::texthash( |
|
fullname => 'Full name', |
|
coursetitle => 'Course title', |
|
role => 'Role', |
|
logout => 'Logout', |
|
grades => 'Grades', |
|
); |
|
} |
|
|
|
sub print_menuitems { |
|
my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype,$noedit) = @_; |
|
unless ((ref($settings) eq 'HASH') && (ref($itemtext) eq 'HASH')) { |
|
return; |
|
} |
|
if ($position eq 'top') { |
|
my (%defaultmenu_options,@defaultmenu_order,$addcollection); |
|
if ($settings->{'menucollections'} ne '') { |
|
foreach my $item (split(/;/,$settings->{'menucollections'})) { |
|
my ($num,$value) = split(/\%/,$item); |
|
if ($num =~ /^\d+$/) { |
|
$defaultmenu_options{$num} = $num; |
|
} |
|
} |
|
@defaultmenu_order = sort { $a <=> $b } keys(%defaultmenu_options); |
|
$addcollection = $defaultmenu_order[-1] + 1; |
|
} else { |
|
$addcollection = 1; |
|
} |
|
$defaultmenu_options{$addcollection} = $addcollection; |
|
my %items = ( |
|
'menudefault' => { |
|
text => '<b>'.&mt($itemtext->{'menudefault'}).'</b><br />'. |
|
&mt("(can be overriden in deep-link context)"), |
|
input => 'selectbox', |
|
options => \%defaultmenu_options, |
|
order => \@defaultmenu_order, |
|
nullval => &mt('Standard (all menus shown)'), |
|
}, |
|
); |
|
return &make_item_rows($cdom,\%items,['menudefault'],$settings,$rowtotal,$crstype,'menuitems',$noedit); |
|
} else { |
|
my %menu; |
|
my $count = 0; |
|
my $next = 1; |
|
my ($datatable,$disabled); |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
|
|
|
my ($ordered,$cats) = &menuitems_categories(); |
|
my @order = @{$ordered}; |
|
my %categories = %{$cats}; |
|
my %menutitles = &menuitems_titles(); |
|
my %menufields = &menuitems_fields(); |
|
|
|
if ($settings->{'menucollections'} ne '') { |
|
foreach my $item (split(/;/,$settings->{'menucollections'})) { |
|
my ($num,$value) = split(/\%/,$item); |
|
if ($num =~ /^\d+$/) { |
|
my @entries = split(/\&/,$value); |
|
foreach my $entry (@entries) { |
|
my ($name,$fields) = split(/=/,$entry); |
|
$menu{$num}{$name} = $fields; |
|
} |
|
} |
|
} |
|
if (keys(%menu)) { |
|
my @current = sort { $a <=> $b } keys(%menu); |
|
$next += $current[-1]; |
|
foreach my $num (@current) { |
|
my %checked; |
|
my $on = ' checked="checked"'; |
|
foreach my $key (keys(%{$menu{$num}})) { |
|
if (($key eq 'top') || ($key eq 'inline') || ($key eq 'foot') || ($key eq 'main')) { |
|
if ($menu{$num}{$key} eq 'y') { |
|
$checked{$key} = $on; |
|
} |
|
} else { |
|
foreach my $field (split(/,/,$menu{$num}{$key})) { |
|
if (exists($menufields{$field})) { |
|
$checked{$field} = $on; |
|
} |
|
} |
|
} |
|
} |
|
if (ref($menu{$num}) eq 'HASH') { |
|
$datatable .= &item_table_row_start('<em class="LC_nav_bar">'.$num.'</em>',$count,'','','','LC_left_item'); |
|
foreach my $category (@order) { |
|
if ((ref($categories{$category}) eq 'ARRAY') && (@{$categories{$category}} > 0)) { |
|
$datatable .= '<fieldset style="vertical-align:top; display:inline-block"><legend>'.$menutitles{$category}.'</legend>'."\n"; |
|
if ($category eq 'text') { |
|
$datatable .= '<i>'.&mt('Header').'</i><br />'; |
|
} |
|
foreach my $field (@{$categories{$category}}) { |
|
if ($field eq 'disc') { |
|
$datatable .= '<br /><i>'.&mt('Footer').'</i><br />'; |
|
} |
|
$datatable .= '<label><input type="checkbox" name="menucollections_'.$num.'" value="'.$field.'"'.$checked{$field}.$disabled.' />'. |
|
$menufields{$field}.'</label><br />'; |
|
} |
|
$datatable .= '</fieldset>'; |
|
} |
|
} |
|
$datatable .= &item_table_row_end(); |
|
$count ++; |
|
} |
|
} |
|
} |
|
} elsif ($noedit) { |
|
my $text = &mt('No menu collections defined for this course.'); |
|
$datatable .= &item_table_row_start($text,$count); |
|
} |
|
unless ($noedit) { |
|
my $add = '<label><input type="checkbox" name="menucollections_add" id="menucollections_add" value="'.$next.'" '. |
|
'onclick="javascript:toggleAddmenucoll();" />'.&mt('Add').'</label>'; |
|
$datatable .= &item_table_row_start($add,$count,'','','','LC_left_item'); |
|
foreach my $category (@order) { |
|
if ((ref($categories{$category}) eq 'ARRAY') && (@{$categories{$category}} > 0)) { |
|
$datatable .= '<fieldset id="addmenucoll_'.$category.'" style="display:none; vertical-align:top;"><legend>'.$menutitles{$category}.'</legend>'."\n"; |
|
foreach my $field (@{$categories{$category}}) { |
|
$datatable .= '<label><input type="checkbox" class="LC_menucoll_add" name="menucollections_'.$next.'" value="'.$field.'"'.$disabled.' />'. |
|
$menufields{$field}.'</label><br />'; |
|
} |
|
$datatable .= '</fieldset>'; |
|
} |
|
} |
|
$datatable .= &item_table_row_end(); |
|
$count ++; |
|
} |
|
return $datatable; |
|
} |
|
} |
|
|
|
sub menuitems_abbreviations { |
|
my %briefcats = ( |
|
text => 'pt', |
|
links => 'p', |
|
list => 'ps', |
|
inline => 's', |
|
); |
|
return %briefcats; |
|
} |
|
|
|
sub menuitems_categories { |
|
my @order = ('shown','text','links','list','inline'); |
|
my %categories = ( |
|
shown => ['top','inline','foot','main'], |
|
text => ['name','role','crs','disc','fdbk'], |
|
links => ['pers','logo','menu','comm','roles','help','logout'], |
|
list => ['about','prefs','port','wish','anno','rss'], |
|
inline => ['cont','grades','chat','people','groups','resv','syll','feeds'], |
|
); |
|
return (\@order,\%categories); |
|
} |
|
|
|
sub menuitems_titles { |
|
return &Apache::lonlocal::texthash ( |
|
shown => 'Hierarchy', |
|
text => 'Text', |
|
links => 'Header links', |
|
list => 'Drop-down list', |
|
inline => 'Inline links', |
|
); |
|
} |
|
|
|
sub menuitems_fields { |
|
return &Apache::lonlocal::texthash ( |
|
top => 'Display header', |
|
inline => 'Display inline menu', |
|
foot => 'Display footer', |
|
main => 'Access to main menu', |
|
pers => 'Personal', |
|
logo => 'LON-CAPA', |
|
menu => 'Home', |
|
comm => 'Messages', |
|
roles => 'Roles/Courses', |
|
help => 'Help', |
|
logout => 'Logout', |
|
name => 'Fullname', |
|
crs => 'Course Title', |
|
role => 'Current Role', |
|
disc => 'Discussion', |
|
fdbk => 'Feedback', |
|
about => 'Information', |
|
prefs => 'Preferences', |
|
port => 'Portfolio', |
|
wish => 'Stored Links', |
|
anno => 'Calendar', |
|
rss => 'RSS Feeds', |
|
cont => 'Contents', |
|
grades => 'Grades', |
|
chat => 'Chat', |
|
people => 'People', |
|
groups => 'Groups', |
|
resv => 'Reservations', |
|
syll => 'Syllabus', |
|
feeds => 'Feeds', |
|
); |
|
} |
|
|
|
sub menucollections_display { |
|
my ($collections) = @_; |
|
my %menu; |
|
my ($ordered,$cats) = &menuitems_categories(); |
|
my @order = @{$ordered}; |
|
my %categories = %{$cats}; |
|
my %menutitles = &menuitems_titles(); |
|
my %menufields = &menuitems_fields(); |
|
foreach my $item (split(/;/,$collections)) { |
|
my ($num,$value) = split(/\%/,$item); |
|
if ($num =~ /^\d+$/) { |
|
my @entries = split(/\&/,$value); |
|
foreach my $entry (@entries) { |
|
my ($name,$fields) = split(/=/,$entry); |
|
$menu{$num}{$name} = $fields; |
|
} |
|
} |
|
} |
|
my $output = ''; |
|
if (keys(%menu)) { |
|
my @current = sort { $a <=> $b } keys(%menu); |
|
foreach my $num (@current) { |
|
my %checked; |
|
foreach my $key (keys(%{$menu{$num}})) { |
|
if (($key eq 'top') || ($key eq 'inline') || ($key eq 'foot') || ($key eq 'main')) { |
|
if ($menu{$num}{$key} eq 'y') { |
|
$checked{$key} = 1; |
|
} |
|
} else { |
|
foreach my $field (split(/,/,$menu{$num}{$key})) { |
|
if (exists($menufields{$field})) { |
|
$checked{$field} = 1; |
|
} |
|
} |
|
} |
|
} |
|
if (ref($menu{$num}) eq 'HASH') { |
|
$output .= '<fieldset><legend>'.&mt('Collection [_1]',$num).'</legend>'; |
|
foreach my $category (@order) { |
|
if ((ref($categories{$category}) eq 'ARRAY') && (@{$categories{$category}} > 0)) { |
|
$output .= '<fieldset style="vertical-align:top; display:inline-block">'. |
|
'<legend>'.$menutitles{$category}.'</legend>'."\n"; |
|
if ($category eq 'text') { |
|
$output .= '<b>'.&mt('Header Text').'</b><br /><br />'; |
|
} |
|
foreach my $field (@{$categories{$category}}) { |
|
if ($field eq 'disc') { |
|
$output .= '<br /><b>'.&mt('Footer Text').'</b><br /><br />'; |
|
} |
|
if ($checked{$field}) { |
|
$output .= &Apache::lonhtmlcommon::confirm_success($menufields{$field}); |
|
} else { |
|
$output .= &Apache::lonhtmlcommon::confirm_success($menufields{$field},1); |
|
} |
|
$output .= '<br />'; |
|
} |
|
$output .= '</fieldset>'; |
|
} |
|
} |
|
$output .= '</fieldset>'; |
|
} |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
sub print_linkprotection { |
|
my ($cdom,$cnum,$settings,$rowtotal,$crstype,$noedit,$context) = @_; |
|
|
|
my %linkprotection; |
|
my $count = 0; |
|
my $next = 1; |
|
my ($datatable,$disabled,$css_class,$dest); |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
|
my %desc = &linkprot_names(); |
|
my %lt = &Apache::lonlocal::texthash ( |
|
'requ' => 'Required settings', |
|
'opti' => 'Optional settings', |
|
); |
|
my $itemcount = 0; |
|
|
|
my $ltiauth; |
|
if ($context eq 'domain') { |
|
$ltiauth = 1; |
|
} else { |
|
if (exists($env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'})) { |
|
$ltiauth = $env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'}; |
|
} else { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); |
|
$ltiauth = $domdefs{'crsltiauth'}; |
|
} |
|
} |
|
if ($context eq 'domain') { |
|
$dest = '/adm/domainprefs'; |
|
} else { |
|
$dest = '/adm/courseprefs'; |
|
} |
|
|
|
my ($switchserver,$switchmessage); |
|
$switchserver = &check_switchserver($cdom,$cnum,$context,$dest); |
|
if ($switchserver) { |
|
if ($context eq 'domain') { |
|
$switchmessage = &mt("submit from domain's primary library server: [_1].",$switchserver); |
|
} elsif ($crstype eq 'Community') { |
|
$switchmessage = &mt("submit from community's home server: [_1].",$switchserver); |
|
} else { |
|
$switchmessage = &mt("submit from course's home server: [_1].",$switchserver); |
|
} |
|
} |
|
|
|
if ((ref($settings) eq 'HASH') && (ref($settings->{'linkprot'}) eq 'HASH')) { |
|
if (keys(%{$settings->{'linkprot'}})) { |
|
my @current = sort { $a <=> $b } keys(%{$settings->{'linkprot'}}); |
|
$next += $current[-1]; |
|
for (my $i=0; $i<@current; $i++) { |
|
my $num = $current[$i]; |
|
my %values; |
|
if (ref($settings->{'linkprot'}->{$num}) eq 'HASH') { |
|
%values = %{$settings->{'linkprot'}->{$num}}; |
|
} else { |
|
next; |
|
} |
|
my $selected; |
|
if (($values{'version'} eq 'LTI-1p0') || ($values{'version'} eq '')) { |
|
$selected = ' selected="selected"'; |
|
} |
|
$css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
$datatable .= |
|
'<tr '.$css_class.'><td><span class="LC_nobreak">'. |
|
'<label><input type="checkbox" name="linkprot_del" value="'.$i.'"'.$disabled.' />'. |
|
&mt('Delete?').'</label></span></td><td>'; |
|
my ($usersty,$onclickrequser,%checkedrequser,$onclickreturnurl,%checkedreturnurl); |
|
if ($ltiauth) { |
|
$usersty = 'display:none'; |
|
$onclickrequser = ' onclick="toggleLinkProtExtra(this.form,'."'requser','optional','1','block','$i'".');"'; |
|
%checkedrequser = ( |
|
no => ' checked="checked"', |
|
yes => '', |
|
); |
|
if ($values{'requser'}) { |
|
$checkedrequser{'yes'} = $checkedrequser{'no'}; |
|
$checkedrequser{'no'} = ''; |
|
} |
|
$datatable .= '<fieldset><legend>'.$lt{'requ'}.'</legend>'; |
|
if ($values{'requser'}) { |
|
$usersty = 'display:inline-block'; |
|
} |
|
} |
|
$onclickreturnurl = ' onclick="toggleLinkProtExtra(this.form,'."'returnurl','divurlparam','1','inline-block','$i'".');"'; |
|
%checkedreturnurl = ( |
|
no => ' checked="checked"', |
|
yes => '', |
|
); |
|
if ($values{'returnurl'} ne '') { |
|
$checkedreturnurl{'yes'} = $checkedreturnurl{'no'}; |
|
$checkedreturnurl{'no'} = ''; |
|
} |
|
$datatable .= |
|
'<span class="LC_nobreak">'.$desc{'name'}. |
|
':<input type="text" size="15" name="linkprot_name_'.$i.'" value="'.$values{'name'}.'" autocomplete="off"'.$disabled.' /></span> '. |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$desc{'version'}.':<select name="linkprot_version_'.$i.'"'.$disabled.'>'. |
|
'<option value="LTI-1p0" '.$selected.'>1.1</option></select></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$desc{'lifetime'}.':<input type="text" name="linkprot_lifetime_'.$i.'"'. |
|
' value="'.$values{'lifetime'}.'" size="3"'.$disabled.' /></span><br /><br />'; |
|
if ($values{'key'} ne '') { |
|
$datatable .= '<span class="LC_nobreak">'.$desc{'key'}; |
|
if ($noedit) { |
|
$datatable .= ': ['.&mt('not shown').']'; |
|
} elsif ($switchserver) { |
|
$datatable .= ': ['.&mt('[_1] to view/edit',$switchserver).']'; |
|
} else { |
|
$datatable .= ':<input type="text" size="25" name="linkprot_key_'.$i.'" value="'.$values{'key'}.'" autocomplete="off"'.$disabled.' />'; |
|
} |
|
$datatable .= '</span> '.(' 'x2); |
|
} elsif (!$switchserver) { |
|
$datatable .= '<span class="LC_nobreak">'.$desc{'key'}.':'. |
|
'<input type="text" size="25" name="linkprot_key_'.$i.'" value="'.$values{'key'}.'" autocomplete="off"'.$disabled.' />'. |
|
'</span> '.(' 'x2); |
|
} |
|
if ($switchserver) { |
|
if ($values{'usable'} ne '') { |
|
$datatable .= '<div id="linkprot_divcurrsecret_'.$i.'" style="display:inline-block" /><span class="LC_nobreak">'. |
|
$desc{'secret'}.': ['.&mt('not shown').'] '.(' 'x2).'</span></div>'. |
|
'<span class="LC_nobreak">'.&mt('Change secret?'). |
|
'<label><input type="radio" value="0" name="linkprot_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','linkprot'".');" checked="checked"'.$disabled.' />'.&mt('No').'</label>'. |
|
(' 'x2). |
|
'<label><input type="radio" value="1" name="linkprot_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','linkprot'".');" '.$disabled.' />'.&mt('Yes').'</label>'.(' 'x2). |
|
'</span><div id="linkprot_divchgsecret_'.$i.'" style="display:none" />'. |
|
'<span class="LC_nobreak"> - '.$switchmessage.'</span>'. |
|
'</div>'; |
|
} elsif ($values{'key'} eq '') { |
|
$datatable .= '<span class="LC_nobreak">'.&mt('Key and Secret are required').' - '.$switchmessage.'</span>'."\n"; |
|
} else { |
|
$datatable .= '<span class="LC_nobreak">'.&mt('Secret required').' - '.$switchmessage.'</span>'."\n"; |
|
} |
|
$datatable .= '<input type="hidden" name="linkprot_id_'.$i.'" value="'.$num.'" />'; |
|
} else { |
|
if ($values{'usable'} ne '') { |
|
$datatable .= '<div id="linkprot_divcurrsecret_'.$i.'" style="display:inline-block" /><span class="LC_nobreak">'. |
|
$desc{'secret'}.': ['.&mt('not shown').'] '.(' 'x2).'</span></div>'. |
|
'<span class="LC_nobreak">'.&mt('Change?'). |
|
'<label><input type="radio" value="0" name="linkprot_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','linkprot'".');" checked="checked"'.$disabled.' />'.&mt('No').'</label>'. |
|
(' 'x2). |
|
'<label><input type="radio" value="1" name="linkprot_changesecret_'.$i.'" onclick="javascript:toggleChgSecret(this.form,'."'$i','secret','linkprot'".');"'.$disabled.' />'.&mt('Yes'). |
|
'</label> </span><div id="linkprot_divchgsecret_'.$i.'" style="display:none" />'. |
|
'<span class="LC_nobreak">'.&mt('New Secret').':'. |
|
'<input type="password" size="20" name="linkprot_secret_'.$i.'" value="" autocomplete="new-password"'.$disabled.' />'. |
|
'<label><input type="checkbox" name="linkprot_visible_'.$i.'" id="linkprot_visible_'.$i.'" onclick="if (this.checked) { this.form.linkprot_secret_'.$i.'.type='."'text'".' } else { this.form.linkprot_secret_'.$i.'.type='."'password'".' }"'.$disabled.' />'.&mt('Visible input').'</label>'. |
|
'<input type="hidden" name="linkprot_id_'.$i.'" value="'.$num.'" /></span></div>'; |
|
} else { |
|
$datatable .= |
|
'<span class="LC_nobreak">'.$desc{'secret'}.':'. |
|
'<input type="password" size="20" name="linkprot_secret_'.$i.'" value="" autocomplete="new-password"'.$disabled.' />'. |
|
'<label><input type="checkbox" name="linkprot_visible_'.$i.'" id="linkprot_visible_'.$i.'" onclick="if (this.checked) { this.form.linkprot_secret_'.$i.'.type='."'text'".' } else { this.form.linkprot_secret_'.$i.'.type='."'password'".' }"'.$disabled.' />'.&mt('Visible input').'</label>'. |
|
'<input type="hidden" name="linkprot_id_'.$i.'" value="'.$num.'" /></span>'; |
|
} |
|
} |
|
$datatable .= '<br /><br />'. |
|
'<span class="LC_nobreak">'.$desc{'returnurl'}.'?'. |
|
'<label><input type="radio" name="linkprot_returnurl_'.$i.'" value="0"'. |
|
$onclickreturnurl.$checkedreturnurl{'no'}.$disabled.' />'.&mt('No').'</label> '. |
|
'<label><input type="radio" name="linkprot_returnurl_'.$i.'" value="1"'. |
|
$onclickreturnurl.$checkedreturnurl{'yes'}.$disabled.' />'.&mt('Yes').'</label></span>'. |
|
' </span><div id="linkprot_divurlparam_'.$i.'" style="display:none" />'. |
|
'<span class="LC_nobreak">'.&mt('Parameter name').':'. |
|
'<input type="text" size="15" name="linkprot_urlparam_'.$i.'" value="'.$values{'returnurl'}.'" autocomplete="off"'.$disabled.' />'. |
|
'</span></div> '; |
|
if ($ltiauth) { |
|
$datatable .= (' 'x2).'<span class="LC_nobreak">'.$desc{'requser'}.'?'. |
|
'<label><input type="radio" name="linkprot_requser_'.$i.'" value="0"'. |
|
$onclickrequser.$checkedrequser{'no'}.$disabled.' />'.&mt('No').'</label> '. |
|
'<label><input type="radio" name="linkprot_requser_'.$i.'" value="1"'. |
|
$onclickrequser.$checkedrequser{'yes'}.$disabled.' />'.&mt('Yes').'</label></span>'. |
|
'</fieldset>'. |
|
'<fieldset id="linkprot_optional_'.$i.'" style="'.$usersty.'"><legend>'.$lt{'opti'}.'</legend>'. |
|
&linkprot_options($i,$itemcount,$disabled,\%values,\%desc). |
|
'</fieldset>'; |
|
} |
|
$datatable .= '</td></tr>'; |
|
$itemcount ++; |
|
} |
|
} |
|
} |
|
$css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
$datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n". |
|
'<input type="hidden" name="linkprot_maxnum" value="'.$next.'" />'."\n". |
|
'<input type="checkbox" name="linkprot_add" value="1"'.$disabled.' />'.&mt('Add').'</span></td>'."\n". |
|
'<td width="100%">'; |
|
my ($usersty,$onclickrequser,%checkedrequser,$onclickreturnurl,%checkedreturnurl); |
|
if ($ltiauth) { |
|
$usersty = 'display:none'; |
|
$onclickrequser = ' onclick="toggleLinkProtExtra(this.form,'."'requser','optional','1','block','add'".');"'; |
|
%checkedrequser = ( |
|
no => ' checked="checked"', |
|
yes => '', |
|
); |
|
$datatable .= '<fieldset><legend>'.$lt{'requ'}.'</legend>'; |
|
} |
|
$onclickreturnurl = ' onclick="toggleLinkProtExtra(this.form,'."'returnurl','divurlparam','1','inline-block','add'".');"'; |
|
%checkedreturnurl = ( |
|
no => ' checked="checked"', |
|
yes => '', |
|
); |
|
$datatable .= '<span class="LC_nobreak">'.$desc{'name'}. |
|
':<input type="text" size="15" name="linkprot_name_add" value="" autocomplete="off"'.$disabled.' /></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$desc{'version'}.':<select name="linkprot_version_add"'.$disabled.'>'. |
|
'<option value="LTI-1p0" selected="selected">1.1</option></select></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$desc{'lifetime'}.':<input type="text" size="3" name="linkprot_lifetime_add" value="300"'.$disabled.' /></span> '."\n". |
|
'<br /><br />'; |
|
if ($switchserver) { |
|
$datatable .= '<span class="LC_nobreak">'.&mt('Key and Secret are required').' - '.$switchmessage.'</span>'."\n"; |
|
} else { |
|
$datatable .= '<span class="LC_nobreak">'.$desc{'key'}.':<input type="text" size="25" name="linkprot_key_add" value="" autocomplete="off"'.$disabled.' /></span> '."\n". |
|
(' 'x2). |
|
'<span class="LC_nobreak">'.$desc{'secret'}.':<input type="password" size="20" name="linkprot_secret_add" value="" autocomplete="new-password"'.$disabled.' />'. |
|
'<label><input type="checkbox" name="linkprot_visible_add" id="linkprot_visible_add" onclick="if (this.checked) { this.form.linkprot_secret_add.type='."'text'".' } else { this.form.linkprot_secret_add.type='."'password'".' }"'.$disabled.' />'.&mt('Visible input').'</label></span> '."\n"; |
|
} |
|
$datatable .= '<br /><br />'. |
|
'<span class="LC_nobreak">'.$desc{'returnurl'}.'?'. |
|
'<label><input type="radio" name="linkprot_returnurl_add" value="0"'. |
|
$onclickreturnurl.$checkedreturnurl{'no'}.$disabled.' />'.&mt('No').'</label> '. |
|
'<label><input type="radio" name="linkprot_returnurl_add" value="1"'. |
|
$onclickreturnurl.$checkedreturnurl{'yes'}.$disabled.' />'.&mt('Yes').'</label></span>'. |
|
' </span><div id="linkprot_divurlparam_add" style="display:none" />'. |
|
'<span class="LC_nobreak">'.&mt('Parameter name').':'. |
|
'<input type="text" size="15" name="linkprot_urlparam_add" value="" autocomplete="off"'.$disabled.' />'. |
|
'</span></div> '; |
|
if ($ltiauth) { |
|
$datatable .= (' 'x2).'<span class="LC_nobreak">'.$desc{'requser'}.'?'. |
|
'<label><input type="radio" name="linkprot_requser_add" value="0"'. |
|
$onclickrequser.$checkedrequser{'no'}.$disabled.' />'.&mt('No').'</label> '. |
|
'<label><input type="radio" name="linkprot_requser_add" value="1"'. |
|
$onclickrequser.$checkedrequser{'yes'}.$disabled.' />'.&mt('Yes').'</label></span>'. |
|
'</fieldset>'. |
|
'<fieldset id="linkprot_optional_add" style="'.$usersty.'"><legend>'.$lt{'opti'}.'</legend>'. |
|
&linkprot_options('add',$itemcount,$disabled,{},\%desc). |
|
'</fieldset>'; |
|
} |
|
$datatable .= '</td></tr>'; |
|
$$rowtotal ++; |
|
return $datatable; |
|
} |
|
|
|
sub linkprot_names { |
|
return &Apache::lonlocal::texthash( |
|
'version' => 'LTI Version', |
|
'key' => 'Key', |
|
'lifetime' => 'Nonce lifetime (s)', |
|
'name' => 'Launcher Application', |
|
'secret' => 'Secret', |
|
'returnurl' => 'Launcher return URL', |
|
'requser' => 'Use identity', |
|
'email' => 'Email address', |
|
'sourcedid' => 'User ID', |
|
'other' => 'Other', |
|
'auth' => 'Display LON-CAPA login page', |
|
'reject' => 'Discontinue launch process', |
|
); |
|
} |
|
|
|
sub check_switchserver { |
|
my ($cdom,$cnum,$context,$dest) = @_; |
|
my ($allowed,$switchserver,$home); |
|
if ($context eq 'domain') { |
|
$home = &Apache::lonnet::domain($cdom,'primary'); |
|
} else { |
|
$home = &Apache::lonnet::homeserver($cnum,$cdom); |
|
} |
|
unless (($home eq 'no_host') || ($home eq '')) { |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } |
|
if (!$allowed) { |
|
$switchserver='<a href="/adm/switchserver?otherserver='.$home.'&role='. |
|
&HTML::Entities::encode($env{'request.role'},'\'<>"&'). |
|
'&destinationurl='.$dest.'">'.&mt('Switch Server').'</a>'; |
|
} |
|
} |
|
return $switchserver; |
|
} |
|
|
|
sub linkprot_options { |
|
my ($num,$itemcount,$disabled,$current,$desc) = @_; |
|
my %lt; |
|
if (ref($desc) eq 'HASH') { |
|
%lt = %{$desc}; |
|
} |
|
my $userfieldsty = 'none'; |
|
my (%checked,$userfield); |
|
$checked{'sourcedid'} = ' checked="checked"'; |
|
$checked{'reject'} = ' checked="checked"'; |
|
if (ref($current) eq 'HASH') { |
|
if (($current->{'mapuser'} ne '') && ($current->{'mapuser'} ne 'lis_person_sourcedid')) { |
|
$checked{'sourcedid'} = ''; |
|
if ($current->{'mapuser'} eq 'lis_person_contact_email_primary') { |
|
$checked{'email'} = ' checked="checked"'; |
|
} else { |
|
$checked{'other'} = ' checked="checked"'; |
|
$userfield = $current->{'mapuser'}; |
|
$userfieldsty = 'inline-block'; |
|
} |
|
} |
|
if (($current->{'notstudent'} ne '') && ($current->{'notstudent'} ne 'reject')) { |
|
$checked{'reject'} = ''; |
|
$checked{'auth'} = ' checked="checked"'; |
|
} |
|
} |
|
my $onclickuser = ' onclick="toggleLinkProtExtra(this.form,'."'mapuser','userfield','other','inline-block','$num'".');"'; |
|
my $output = '<div class="LC_floatleft"><span class="LC_nobreak">'. |
|
&mt('Source of LON-CAPA username in LTI request').': '; |
|
foreach my $option ('sourcedid','email','other') { |
|
$output .= '<label><input type="radio" name="linkprot_mapuser_'.$num.'" value="'.$option.'"'. |
|
$checked{$option}.$onclickuser.$disabled.' />'.$lt{$option}.'</label>'. |
|
($option eq 'other' ? '' : (' 'x2) ); |
|
} |
|
$output .= '</span></div>'. |
|
'<div class="LC_floatleft" style="display:'.$userfieldsty.';" id="linkprot_userfield_'.$num.'">'. |
|
'<input type="text" name="linkprot_customuser_'.$num.'" '. |
|
'value="'.$userfield.'"'.$disabled.' /></div>'; |
|
$output .= '<br />'. |
|
'<div class="LC_floatleft"><span class="LC_nobreak">'. |
|
&mt('Action when username is not for an enrolled student').': '; |
|
foreach my $option ('reject','auth') { |
|
$output .= '<label><input type="radio" name="linkprot_notstudent_'.$num.'" value="'.$option.'"'. |
|
$checked{$option}.$disabled.' />'.$lt{$option}.'</label>'. |
|
($option eq 'auth' ? '' : (' 'x2) ); |
|
} |
|
$output .= '</span></div>'; |
|
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 .= '<div id="LC_extresreusediv" style="display:'.$reusesty.';">'. |
|
'<span class="LC_nobreak">'. |
|
'<label><input type="checkbox" name="extwintabreuse" value="1"'.$checked.'>'. |
|
&mt('Re-use tab/window').'</label>'. |
|
'</span></div>'. |
|
'<fieldset id="LC_extressize" style="display:'.$sizesty.';">'. |
|
'<legend>'.&mt('Window size (optional)').'</legend>'. |
|
'<span class="LC_nobreak">'. |
|
&mt('width').':<input type="text" name="extreswinwidth" value="'.$width.'" size="3" />px'. |
|
(' ' x 3). |
|
&mt('height').':<input type="text" name="extreswinheight" value="'.$height.'" size="3" />px'. |
|
'</span></fieldset>'; |
|
return $output; |
} |
} |
|
|
sub print_other { |
sub print_other { |
my ($cdom,$settings,$allitems,$rowtotal,$crstype) = @_; |
my ($cdom,$settings,$allitems,$rowtotal,$crstype,$noedit) = @_; |
unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) { |
unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) { |
return; |
return; |
} |
} |
Line 4251 sub print_other {
|
Line 7640 sub print_other {
|
input => 'textbox', |
input => 'textbox', |
size => '30', |
size => '30', |
}; |
}; |
my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'other'); |
return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'other',$noedit); |
} |
} |
|
|
sub get_other_items { |
sub get_other_items { |
Line 4280 sub get_other_items {
|
Line 7669 sub get_other_items {
|
} |
} |
|
|
sub item_table_row_start { |
sub item_table_row_start { |
my ($text,$count,$add_class,$colspan) = @_; |
my ($text,$count,$add_class,$colspan,$leftclass,$rightclass) = @_; |
my $output; |
my $output; |
my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row'; |
my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row'; |
$css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); |
$css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); |
|
if ($leftclass eq '') { |
|
$leftclass = 'LC_left_item'; |
|
} |
|
if ($rightclass eq '') { |
|
$rightclass = 'LC_right_item'; |
|
} |
$output .= '<tr class="'.$css_class.'">'."\n". |
$output .= '<tr class="'.$css_class.'">'."\n". |
'<td class="LC_left_item">'.$text. |
'<td class="'.$leftclass.'">'.$text. |
'</td>'; |
'</td>'; |
if ($colspan) { |
if ($colspan > 1) { |
$output .= '<td class="LC_right_item" colspan="'.$colspan.'">'; |
$output .= '<td class="'.$rightclass.'" colspan="'.$colspan.'">'; |
} else { |
} else { |
$output .= '<td class="LC_right_item">'; |
$output .= '<td class="'.$rightclass.'">'; |
} |
} |
return $output; |
return $output; |
} |
} |
Line 4300 sub item_table_row_end {
|
Line 7695 sub item_table_row_end {
|
} |
} |
|
|
sub yesno_radio { |
sub yesno_radio { |
my ($item,$settings,$unsetdefault,$valueyes,$valueno) = @_; |
my ($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit) = @_; |
my $itemon = ' '; |
my $itemon = ' '; |
my $itemoff = ' checked="checked" '; |
my $itemoff = ' checked="checked" '; |
if (($valueyes eq '') && ($valueno eq '')) { |
if (($valueyes eq '') && ($valueno eq '')) { |
Line 4319 sub yesno_radio {
|
Line 7714 sub yesno_radio {
|
} |
} |
} |
} |
} |
} |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
return '<span class="LC_nobreak"><label>'. |
return '<span class="LC_nobreak"><label>'. |
'<input type="radio" name="'.$item.'"'. |
'<input type="radio" name="'.$item.'"'. |
$itemon.' value="'.$valueyes.'" />'.&mt('Yes').'</label> '. |
$itemon.' value="'.$valueyes.'"'.$disabled.' />'.&mt('Yes').'</label> '. |
'<label><input type="radio" name="'.$item.'"'. |
'<label><input type="radio" name="'.$item.'"'. |
$itemoff.' value="'.$valueno.'" />'.&mt('No').'</label></span>'; |
$itemoff.' value="'.$valueno.'"'.$disabled.' />'.&mt('No').'</label></span>'; |
} |
} |
|
|
sub select_from_options { |
sub select_from_options { |
my ($item,$order,$options,$curr,$nullval,$multiple,$maxsize,$onchange) = @_; |
my ($item,$order,$options,$curr,$nullval,$multiple,$maxsize,$onchange,$noedit,$id) = @_; |
my $output; |
my $output; |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled=disabled"'; |
|
} |
if ((ref($order) eq 'ARRAY') && (ref($options) eq 'HASH')) { |
if ((ref($order) eq 'ARRAY') && (ref($options) eq 'HASH')) { |
$output='<select name="'.$item.'" '.$onchange; |
$output='<select name="'.$item.'" '.$onchange; |
if ($multiple) { |
if ($multiple) { |
Line 4339 sub select_from_options {
|
Line 7742 sub select_from_options {
|
$output .= ' size="'.$maxsize.'"'; |
$output .= ' size="'.$maxsize.'"'; |
} |
} |
} |
} |
$output .= '>'."\n"; |
if ($id ne '') { |
|
$output .= ' id="'.$id.'"'; |
|
} |
|
$output .= $disabled.'>'."\n"; |
if ($nullval ne '') { |
if ($nullval ne '') { |
$output .= '<option value=""'; |
$output .= '<option value=""'; |
if (ref($curr) eq 'ARRAY') { |
if (ref($curr) eq 'ARRAY') { |
Line 4372 sub select_from_options {
|
Line 7778 sub select_from_options {
|
} |
} |
|
|
sub make_item_rows { |
sub make_item_rows { |
my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype,$caller) = @_; |
my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype,$caller,$noedit) = @_; |
my $datatable; |
my $datatable; |
if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) { |
if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) { |
my $count = 0; |
my $count = 0; |
Line 4383 sub make_item_rows {
|
Line 7789 sub make_item_rows {
|
(($caller eq 'printouts') && ($item ne 'print_header_format'))) { |
(($caller eq 'printouts') && ($item ne 'print_header_format'))) { |
$colspan = 2; |
$colspan = 2; |
} |
} |
|
my $rowdesc; |
|
if ($caller eq 'appearance') { |
|
$rowdesc = '<span class="LC_nobreak">'.$items->{$item}{text}.'</span>'; |
|
} else { |
|
$rowdesc = $items->{$item}{text}; |
|
} |
if (exists $items->{$item}{advanced} && $items->{$item}{advanced} == 1) { |
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 { |
} 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') { |
if ($item eq 'defaultcredits') { |
my $defaultcredits = $env{'course.'.$env{'request.course.id'}.'.internal.defaultcredits'}; |
my $defaultcredits = $env{'course.'.$env{'request.course.id'}.'.internal.defaultcredits'}; |
Line 4398 sub make_item_rows {
|
Line 7810 sub make_item_rows {
|
} |
} |
$datatable .= $showcredits; |
$datatable .= $showcredits; |
} elsif ($item eq 'nothideprivileged') { |
} elsif ($item eq 'nothideprivileged') { |
$datatable .= ¬hidepriv_row($cdom,$item,$settings,$crstype); |
$datatable .= ¬hidepriv_row($cdom,$item,$settings,$crstype,$noedit); |
} elsif ($item eq 'checkforpriv') { |
} elsif ($item eq 'checkforpriv') { |
$datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype); |
$datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype,$noedit); |
} elsif ($item eq 'print_header_format') { |
} elsif ($item eq 'print_header_format') { |
$datatable .= &print_hdrfmt_row($item,$settings); |
$datatable .= &print_hdrfmt_row($item,$settings,$noedit); |
|
} elsif ($item eq 'lti.lcmenu') { |
|
$datatable .= &lcmenu_checkboxes($cdom,$item,$settings,$crstype,$noedit); |
|
} elsif ($item eq 'extresource') { |
|
$datatable .= &print_extresource_row($item,$items->{$item},$settings->{$item},$noedit); |
} elsif ($items->{$item}{input} eq 'dates') { |
} elsif ($items->{$item}{input} eq 'dates') { |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
$datatable .= |
$datatable .= |
&Apache::lonhtmlcommon::date_setter('display',$item, |
&Apache::lonhtmlcommon::date_setter('display',$item, |
$settings->{$item}); |
$settings->{$item},$disabled); |
} elsif ($items->{$item}{input} eq 'radio') { |
} elsif ($items->{$item}{input} eq 'radio') { |
my ($unsetdefault,$valueyes,$valueno); |
my ($unsetdefault,$valueyes,$valueno); |
if (($item eq 'usejsme') || ($item eq 'uselcmath')) { |
if (($item eq 'usejsme') || ($item eq 'uselcmath') || ($item eq 'inline_chem')) { |
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); |
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); |
unless ($domdefs{$item} eq '0') { |
unless ($domdefs{$item} eq '0') { |
$unsetdefault = 1; |
$unsetdefault = 1; |
} |
} |
$valueyes = "1"; |
$valueyes = "1"; |
$valueno = "0"; |
$valueno = "0"; |
|
} elsif (($item eq 'lti.topmenu') || ($item eq 'lti.inlinemenu')) { |
|
$valueyes = '1'; |
} |
} |
$datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno); |
$datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit); |
} elsif ($items->{$item}{input} eq 'selectbox') { |
} elsif ($items->{$item}{input} eq 'selectbox') { |
|
my $id; |
|
if ($caller eq 'menuitems') { |
|
$id = $item; |
|
} |
my $curr = $settings->{$item}; |
my $curr = $settings->{$item}; |
$datatable .= |
$datatable .= |
&select_from_options($item,$items->{$item}{'order'}, |
&select_from_options($item,$items->{$item}{'order'}, |
$items->{$item}{'options'},$curr, |
$items->{$item}{'options'},$curr, |
$items->{$item}{'nullval'}); |
$items->{$item}{'nullval'}, |
|
undef,undef,undef,$noedit,$id); |
} elsif ($items->{$item}{input} eq 'textbox') { |
} elsif ($items->{$item}{input} eq 'textbox') { |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled=disabled"'; |
|
} |
$datatable .= |
$datatable .= |
&Apache::lonhtmlcommon::textbox($item,$settings->{$item}, |
&Apache::lonhtmlcommon::textbox($item,$settings->{$item}, |
$items->{$item}{size}); |
$items->{$item}{size}, |
|
$disabled); |
} |
} |
$datatable .= &item_table_row_end(); |
$datatable .= &item_table_row_end(); |
} |
} |
Line 4439 sub make_item_rows {
|
Line 7871 sub make_item_rows {
|
} |
} |
|
|
sub nothidepriv_row { |
sub nothidepriv_row { |
my ($cdom,$item,$settings,$crstype) = @_; |
my ($cdom,$item,$settings,$crstype,$noedit) = @_; |
my ($cnum) = &get_course(); |
my ($cnum) = &get_course(); |
my ($datatable,%nothide,@checkdoms); |
my ($datatable,%nothide,@checkdoms); |
if (ref($settings) eq 'HASH') { |
if (ref($settings) eq 'HASH') { |
Line 4476 sub nothidepriv_row {
|
Line 7908 sub nothidepriv_row {
|
} |
} |
} |
} |
if (@privusers > 0) { |
if (@privusers > 0) { |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
$datatable .= '<table align="right">'; |
$datatable .= '<table align="right">'; |
foreach my $user (sort(@privusers)) { |
foreach my $user (sort(@privusers)) { |
my $hideon = ' checked="checked" '; |
my $hideon = ' checked="checked" '; |
Line 4492 sub nothidepriv_row {
|
Line 7928 sub nothidepriv_row {
|
'</td><td align="left">'. |
'</td><td align="left">'. |
'<span class="LC_nobreak"><label>'. |
'<span class="LC_nobreak"><label>'. |
'<input type="radio" name="'.$item.'_'.$user.'"'. |
'<input type="radio" name="'.$item.'_'.$user.'"'. |
$hideon.' value="" />'.&mt('Hidden').'</label> '. |
$hideon.' value=""'.$disabled.' />'.&mt('Hidden').'</label> '. |
'<label><input type="radio" name="'.$item.'_'.$user.'"'. |
'<label><input type="radio" name="'.$item.'_'.$user.'"'. |
$hideoff.' value="yes" />'.&mt('Shown').'</label></span></td>'. |
$hideoff.' value="yes"'.$disabled.' />'.&mt('Shown').'</label></span></td>'. |
'</tr>'; |
'</tr>'; |
} |
} |
$datatable .= '</table>'; |
$datatable .= '</table>'; |
Line 4509 sub nothidepriv_row {
|
Line 7945 sub nothidepriv_row {
|
} |
} |
|
|
sub checkforpriv_row { |
sub checkforpriv_row { |
my ($cdom,$item,$settings,$crstype) = @_; |
my ($cdom,$item,$settings,$crstype,$noedit) = @_; |
my $datatable; |
my $datatable; |
my %domains=map { $_ => 1; } &Apache::lonnet::all_domains(); |
my %domains=map { $_ => 1; } &Apache::lonnet::all_domains(); |
if (keys(%domains) == 1) { |
if (keys(%domains) == 1) { |
Line 4522 sub checkforpriv_row {
|
Line 7958 sub checkforpriv_row {
|
if ($settings->{$item} eq '') { |
if ($settings->{$item} eq '') { |
$datatable = '</td><td align="right">'. |
$datatable = '</td><td align="right">'. |
&Apache::loncommon::select_dom_form('','checkforpriv_'.$num, |
&Apache::loncommon::select_dom_form('','checkforpriv_'.$num, |
1,1,undef,undef,\@excdoms); |
1,1,undef,undef,\@excdoms, |
|
$noedit); |
} else { |
} else { |
my @privdoms = split(/,/,$settings->{$item}); |
my @privdoms = split(/,/,$settings->{$item}); |
my %domains=map { $_ => 1; } &Apache::lonnet::all_domains(); |
my %domains=map { $_ => 1; } &Apache::lonnet::all_domains(); |
$datatable = '</td><td align="right"><br />'. |
$datatable = '</td><td align="right"><br />'. |
&Apache::loncommon::start_data_table(); |
&Apache::loncommon::start_data_table(); |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
if (@privdoms > 0) { |
if (@privdoms > 0) { |
foreach my $currdom (@privdoms) { |
foreach my $currdom (@privdoms) { |
next unless ($domains{$currdom}); |
next unless ($domains{$currdom}); |
Line 4542 sub checkforpriv_row {
|
Line 7983 sub checkforpriv_row {
|
'</b><input type="hidden" name="checkforpriv_'.$num. |
'</b><input type="hidden" name="checkforpriv_'.$num. |
'" value="'.$currdom.'" /></span><br />'. |
'" value="'.$currdom.'" /></span><br />'. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
'name="checkforpriv_delete" value="'.$num.'" />'. |
'name="checkforpriv_delete" value="'.$num.'"'.$disabled.' />'. |
&mt('Delete').'</label></span></td>'. |
&mt('Delete').'</label></span></td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
$num ++; |
$num ++; |
Line 4557 sub checkforpriv_row {
|
Line 7998 sub checkforpriv_row {
|
'<td align="left"><span class="LC_nobreak">'. |
'<td align="left"><span class="LC_nobreak">'. |
&mt('Additional domain:'). '</span><br />'. |
&mt('Additional domain:'). '</span><br />'. |
&Apache::loncommon::select_dom_form('','checkforpriv_'.$num,1, |
&Apache::loncommon::select_dom_form('','checkforpriv_'.$num,1, |
1,undef,undef,\@excdoms). |
1,undef,undef,\@excdoms,$noedit). |
'</td>'.&Apache::loncommon::end_data_table_row(); |
'</td>'.&Apache::loncommon::end_data_table_row(); |
} |
} |
$datatable .= &Apache::loncommon::end_data_table(). |
$datatable .= &Apache::loncommon::end_data_table(). |
Line 4568 sub checkforpriv_row {
|
Line 8009 sub checkforpriv_row {
|
} |
} |
|
|
sub print_hdrfmt_row { |
sub print_hdrfmt_row { |
my ($item,$settings) = @_; |
my ($item,$settings,$noedit) = @_; |
my @curr; |
my @curr; |
my $currnum = 0; |
my $currnum = 0; |
my $maxnum = 2; |
my $maxnum = 2; |
Line 4641 function getIndexByName(item) {
|
Line 8082 function getIndexByName(item) {
|
ENDJS |
ENDJS |
$output .= '</td><td align="right"><br />'. |
$output .= '</td><td align="right"><br />'. |
$currstr.'<table class="LC_data_table">'; |
$currstr.'<table class="LC_data_table">'; |
|
my $disabled; |
|
if ($noedit) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
if (@curr > 0) { |
if (@curr > 0) { |
for (my $i=0; $i<@curr; $i++) { |
for (my $i=0; $i<@curr; $i++) { |
my $pos = $i+1; |
my $pos = $i+1; |
$output .= '<tr>'. |
$output .= '<tr>'. |
'<td align="left"><span class="LC_nobreak">'. |
'<td align="left"><span class="LC_nobreak">'. |
&position_selector($pos,$i,$maxnum).&mt('Delete:'). |
&position_selector($pos,$i,$maxnum,$disabled).&mt('Delete:'). |
'<input type="checkbox" name="printfmthdr_del_'.$i. |
'<input type="checkbox" name="printfmthdr_del_'.$i. |
'" /></span></td>'; |
'"'.$disabled.' /></span></td>'; |
if ($curr[$i] =~ /^%\d*[nca]$/) { |
if ($curr[$i] =~ /^%\d*[nca]$/) { |
my ($limit,$subst) = ($curr[$i] =~ /^%(\d*)([nca])$/); |
my ($limit,$subst) = ($curr[$i] =~ /^%(\d*)([nca])$/); |
$output .= '<td align="left">'. |
$output .= '<td align="left">'. |
&substitution_selector($i,$subst,$limit).'</td>'; |
&substitution_selector($i,$subst,$limit,$disabled).'</td>'; |
} else { |
} else { |
$output .= '<td colspan="2" align="left">'.&mt('Text').'<br />'. |
$output .= '<td colspan="2" align="left">'.&mt('Text').'<br />'. |
'<input type="textbox" name="printfmthdr_text_'.$i.'"'. |
'<input type="textbox" name="printfmthdr_text_'.$i.'"'. |
' value="'.$curr[$i].'" size="25" /></td>'; |
' value="'.$curr[$i].'" size="25"'.$disabled.' /></td>'; |
} |
} |
$output .= '</tr>'; |
$output .= '</tr>'; |
} |
} |
} |
} |
my $pos = $currnum+1; |
my $pos = $currnum+1; |
$output .= '<tr>'. |
unless ($noedit) { |
|
$output .= |
|
'<tr>'. |
'<td align="left"><span class="LC_nobreak">'. |
'<td align="left"><span class="LC_nobreak">'. |
&position_selector($pos,$currnum,$maxnum). |
&position_selector($pos,$currnum,$maxnum). |
'<b>'.&mt('New').'</b></span></td><td align="left">'. |
'<b>'.&mt('New').'</b></span></td><td align="left">'. |
&substitution_selector($currnum).'</td>'. |
&substitution_selector($currnum).'</td>'. |
'</tr>'; |
'</tr>'; |
$pos ++; |
$pos ++; |
$currnum ++; |
$currnum ++; |
$output .= '<tr>'. |
$output .= |
|
'<tr>'. |
'<td align="left"><span class="LC_nobreak">'. |
'<td align="left"><span class="LC_nobreak">'. |
&position_selector($pos,$currnum,$maxnum). |
&position_selector($pos,$currnum,$maxnum). |
'<b>'.&mt('New').'</b></span></td>'. |
'<b>'.&mt('New').'</b></span></td>'. |
Line 4679 ENDJS
|
Line 8127 ENDJS
|
'" value="" size ="25" />'. |
'" value="" size ="25" />'. |
'<input type="hidden" name="printfmthdr_maxnum" value="'. |
'<input type="hidden" name="printfmthdr_maxnum" value="'. |
$maxnum.'" /></td>'. |
$maxnum.'" /></td>'. |
'</tr>'. |
'</tr>'; |
'</table><br />'; |
} |
|
$output .= '</table><br />'; |
return $output; |
return $output; |
} |
} |
|
|
sub position_selector { |
sub position_selector { |
my ($pos,$num,$maxnum) = @_; |
my ($pos,$num,$maxnum,$disabled) = @_; |
my $output = '<select name="printfmthdr_pos_'.$num.'" onchange="reOrder('."'$num'".');">'; |
my $output = '<select name="printfmthdr_pos_'.$num.'" onchange="reOrder('."'$num'".');"'.$disabled.'>'; |
for (my $j=1; $j<=$maxnum; $j++) { |
for (my $j=1; $j<=$maxnum; $j++) { |
my $sel = ''; |
my $sel = ''; |
if ($pos == $j) { |
if ($pos == $j) { |
Line 4700 sub position_selector {
|
Line 8149 sub position_selector {
|
} |
} |
|
|
sub substitution_selector { |
sub substitution_selector { |
my ($num,$subst,$limit,$crstype) = @_; |
my ($num,$subst,$limit,$crstype,$disabled) = @_; |
my ($stunametxt,$crsidtxt); |
my ($stunametxt,$crsidtxt); |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$stunametxt = 'member name'; |
$stunametxt = 'member name'; |
Line 4715 sub substitution_selector {
|
Line 8164 sub substitution_selector {
|
a => 'assignment note', |
a => 'assignment note', |
); |
); |
my $output .= &mt('Substitution').'<br />'. |
my $output .= &mt('Substitution').'<br />'. |
'<select name="printfmthdr_sub_'.$num.'">'; |
'<select name="printfmthdr_sub_'.$num.'"'.$disabled.'>'; |
if ($subst eq '') { |
if ($subst eq '') { |
$output .= '<option value="" selected="selected"> </option>'; |
$output .= '<option value="" selected="selected"> </option>'; |
} |
} |
Line 4729 sub substitution_selector {
|
Line 8178 sub substitution_selector {
|
} |
} |
$output .= '</select></td><td align="left">'.&mt('Size limit').'<br />'. |
$output .= '</select></td><td align="left">'.&mt('Size limit').'<br />'. |
'<input type="textbox" name="printfmthdr_limit_'.$num. |
'<input type="textbox" name="printfmthdr_limit_'.$num. |
'" value="'.$limit.'" size="5" /></span>'; |
'" value="'.$limit.'" size="5"'.$disabled.' /></span>'; |
return $output; |
return $output; |
} |
} |
|
|
Line 4796 sub change_clone {
|
Line 8245 sub change_clone {
|
} |
} |
} |
} |
} |
} |
|
return; |
|
} |
|
|
|
sub devalidate_remote_courseprefs { |
|
my ($cdom,$cnum,$cachekeys) = @_; |
|
return unless (ref($cachekeys) eq 'HASH'); |
|
my %servers = &Apache::lonnet::internet_dom_servers($cdom); |
|
my %thismachine; |
|
map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids(); |
|
my @posscached = ('courselti','courseltitools'); |
|
if (keys(%servers)) { |
|
foreach my $server (keys(%servers)) { |
|
next if ($thismachine{$server}); |
|
my @cached; |
|
foreach my $name (@posscached) { |
|
if ($cachekeys->{$name}) { |
|
push(@cached,&escape($name).':'.&escape($cdom.'_'.$cnum)); |
|
} |
|
} |
|
if (@cached) { |
|
&Apache::lonnet::remote_devalidate_cache($server,\@cached); |
|
} |
|
} |
|
} |
return; |
return; |
} |
} |
|
|