From raeburn at source.lon-capa.org Mon May 7 20:44:14 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 08 May 2018 00:44:14 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /lti ltiauth.pm Message-ID: raeburn Tue May 8 00:44:14 2018 EDT Modified files: /loncom/lti ltiauth.pm Log: - Bug 6754 LON-CAPA as LTI Provider - request.lti.login set to consumer's ID for LTI authenticated session. - Rights to create LON-CAPA courses (LTI type) assigned, as per domain config to new user created for LTI instructor - No "Login" shown for "Invalid call" displayed for failed LTI launch. Index: loncom/lti/ltiauth.pm diff -u loncom/lti/ltiauth.pm:1.9 loncom/lti/ltiauth.pm:1.10 --- loncom/lti/ltiauth.pm:1.9 Sat Apr 21 20:34:50 2018 +++ loncom/lti/ltiauth.pm Tue May 8 00:44:14 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Basic LTI Authentication Module # -# $Id: ltiauth.pm,v 1.9 2018/04/21 20:34:50 raeburn Exp $ +# $Id: ltiauth.pm,v 1.10 2018/05/08 00:44:14 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -578,7 +578,7 @@ if (($ltiroles[0] eq 'Instructor') && ($lcroles[0] eq 'cc') && ($lti{$itemid}{'mapcrs'}) && ($lti{$itemid}{'makecrs'})) { unless (&Apache::lonnet::usertools_access($uname,$udom,'lti','reload','requestcourses')) { - &Apache::lonnet::put('environment',{ 'requestcourses.lti' => 1, },$udom,$uname); + &Apache::lonnet::put('environment',{ 'requestcourses.lti' => 'autolimit=', },$udom,$uname); } } } else { @@ -892,7 +892,7 @@ $env{'request.lti.rosterurl'} = $params->{'ext_ims_lis_memberships_url'}; } } - $env{'request.lti.login'} = 1; + $env{'request.lti.login'} = $itemid; if ($params->{'launch_presentation_document_target'}) { $env{'request.lti.target'} = $params->{'launch_presentation_document_target'}; } @@ -916,7 +916,7 @@ 'domain' => $udom, 'username' => $uname, 'server' => $lonhost, - 'lti.login' => 1, + 'lti.login' => $itemid, 'lti.uri' => $tail, ); if ($role) { @@ -984,7 +984,7 @@ } &Apache::lonlocal::get_language_handle($r); $r->print( - &Apache::loncommon::start_page('Invalid LTI call'). + &Apache::loncommon::start_page('Invalid LTI call','',{ 'only_body' => 1,}). &mt('Invalid LTI call [_1]',$num). &Apache::loncommon::end_page()); return; From raeburn at source.lon-capa.org Mon May 7 21:19:06 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 08 May 2018 01:19:06 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonhelpmenu.pm Message-ID: raeburn Tue May 8 01:19:06 2018 EDT Modified files: /loncom/interface lonhelpmenu.pm Log: - Bug 6754 LON-CAPA as LTI Provider - If original LTI launch of LON-CAPA was for display in iframe linked LON-CAPA items are displayed within the same iframe. Index: loncom/interface/lonhelpmenu.pm diff -u loncom/interface/lonhelpmenu.pm:1.45 loncom/interface/lonhelpmenu.pm:1.46 --- loncom/interface/lonhelpmenu.pm:1.45 Mon Feb 20 00:36:40 2017 +++ loncom/interface/lonhelpmenu.pm Tue May 8 01:19:06 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # generate frame-based help system # -# $Id: lonhelpmenu.pm,v 1.45 2017/02/20 00:36:40 raeburn Exp $ +# $Id: lonhelpmenu.pm,v 1.46 2018/05/08 01:19:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -180,6 +180,10 @@ lastloc => 'Go back', close => 'Close', ); + my $target = '_top'; + if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $target = '_parent'; + } my %items = ( general => { href => '/adm/help/'.$general_help.'.hlp', @@ -229,14 +233,14 @@ img => '/res/adm/pages/tolastloc.png', alt => $lt{'lastloc'}, text => $lt{'lastloc'}, - target => '_top', + target => $target, }, close => { href => 'javascript:window.close()', img => $location.'/lonIcons/close.gif', alt => $lt{'close'}, text => $lt{'close'}, - target => '_top', + target => $target, }, ); my %help_submenu = ( @@ -392,6 +396,10 @@ $r->print(&Apache::loncommon::start_page('Help Content',undef, {'only_body' => 1,})); } + my $target = '_top'; + if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $target = '_parent'; + } if ($stayOnPage) { $r->print('
'); } @@ -425,7 +433,7 @@ &mt('[_1]Note[_2]: questions about course content should not be directed to the support team, but instead should be sent to the course instructor.'). ' '. &mt('This can be done by clicking the [_1]Communicate[_2] link or the "Send Feedback" link when viewing a content page.', - '','')); + '','')); } $r->print("

"); } From raeburn at source.lon-capa.org Mon May 7 21:48:18 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 08 May 2018 01:48:18 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface courseprefs.pm domainprefs.pm lonconfigsettings.pm Message-ID: raeburn Tue May 8 01:48:18 2018 EDT Modified files: /loncom/interface domainprefs.pm lonconfigsettings.pm courseprefs.pm Log: - Bug 6754 LON-CAPA as LTI Provider - Domain defaults for each Consumer - display standard LON-CAPA menus? (top line and/or second line) - menu include: fullname, role, context, logout, and/or grades? - Course Coordinator can override in course via "Course Settings". -------------- next part -------------- Index: loncom/interface/domainprefs.pm diff -u loncom/interface/domainprefs.pm:1.325 loncom/interface/domainprefs.pm:1.326 --- loncom/interface/domainprefs.pm:1.325 Fri Mar 23 01:01:20 2018 +++ loncom/interface/domainprefs.pm Tue May 8 01:48:18 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.325 2018/03/23 01:01:20 raeburn Exp $ +# $Id: domainprefs.pm,v 1.326 2018/05/08 01:48:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2909,6 +2909,35 @@ } } } + } else if (setting == 'lcmenu') { + var menus = new Array('lti_topmenu_'+item,'lti_inlinemenu_'+item); + var divid = 'lti_menufield_'+item; + var setvis = ''; + for (var i=0; i 'Other', 'passback' => 'Can return grades to Consumer:', 'roster' => 'Can retrieve roster from Consumer:', + 'topmenu' => 'Display LON-CAPA page header', + 'inlinemenu'=> 'Display LON-CAPA inline menu', ); return %lt; } @@ -4709,6 +4740,7 @@ $checked{'crssec'} = {}; $checked{'crssecsrc'} = {}; $checked{'lcauth'} = {}; + $checked{'menuitem'} = {}; if ($num eq 'add') { $checked{'lcauth'}{'lti'} = ' checked="checked"'; } @@ -4719,7 +4751,9 @@ my $lcauthparm; my $lcauthparmstyle = 'display:none'; my $lcauthparmtext; + my $menusty; my $numinrow = 4; + my %menutitles = <imenu_titles(); if (ref($current) eq 'HASH') { if (($current->{'mapuser'} ne '') && ($current->{'mapuser'} ne 'lis_person_sourcedid')) { @@ -4749,7 +4783,7 @@ } if ($current->{'makecrs'}) { $checked{'makecrs'}{'Y'} = ' checked="checked"'; - } + } if (ref($current->{'makeuser'}) eq 'ARRAY') { foreach my $role (@{$current->{'makeuser'}}) { $checked{'makeuser'}{$role} = ' checked="checked"'; @@ -4788,10 +4822,35 @@ } else { $checked{'crssec'}{'N'} = ' checked="checked"'; } + if ($current->{'topmenu'}) { + $checked{'topmenu'}{'Y'} = ' checked="checked"'; + } else { + $checked{'topmenu'}{'N'} = ' checked="checked"'; + } + if ($current->{'inlinemenu'}) { + $checked{'inlinemenu'}{'Y'} = ' checked="checked"'; + } else { + $checked{'inlinemenu'}{'N'} = ' checked="checked"'; + } + if (($current->{'topmenu'}) || ($current->{'inlinemenu'})) { + $menusty = 'inline-block'; + if (ref($current->{'lcmenu'}) eq 'ARRAY') { + foreach my $item (@{$current->{'lcmenu'}}) { + if (exists($menutitles{$item})) { + $checked{'menuitem'}{$item} = ' checked="checked"'; + } + } + } + } else { + $menusty = 'none'; + } } else { $checked{'makecrs'}{'N'} = ' checked="checked"'; $checked{'crssec'}{'N'} = ' checked="checked"'; -#FIXME + $checked{'topmenu'}{'N'} = ' checked="checked"'; + $checked{'inlinemenu'}{'Y'} = ' checked="checked"'; + $checked{'menuitem'}{'grades'} = ' checked="checked"'; + $menusty = 'inline-block'; } my @coursetypes = ('official','unofficial','community','textbook','placement','lti'); my %coursetypetitles = &Apache::lonlocal::texthash ( @@ -4818,6 +4877,7 @@ my $onclicksec = ' onclick="toggleLTI(this.form,'."'sec','$num'".');"'; my $onclicksecsrc = ' onclick="toggleLTI(this.form,'."'secsrc','$num'".')"'; my $onclicklcauth = ' onclick="toggleLTI(this.form,'."'lcauth','$num'".')"'; + my $onclickmenu = ' onclick="toggleLTI(this.form,'."'lcmenu','$num'".');"'; my $output = '
'.&mt('Mapping users').''. '
'.&mt('LON-CAPA username').': '; foreach my $option ('sourcedid','email','other') { @@ -4944,6 +5004,27 @@ '
'; } + $output .= '
'. + '
'.&mt('Course defaults (Course Coordinator can override)').''. + '
'.$lt{'topmenu'}.': '. + ''.(' 'x2). + '
'. + '
'. + '
'.$lt{'inlinemenu'}.': '. + ''.(' 'x2). + '
'; + $output .='
'. + '
'. + ''.&mt('Menu items').': '; + foreach my $type ('fullname','coursetitle','role','logout','grades') { + $output .= ''. + (' 'x2); + } $output .= '
'; # '
'.&mt('Assigning author roles').''; # @@ -4952,6 +5033,16 @@ return $output; } +sub ltimenu_titles { + return &Apache::lonlocal::texthash( + fullname => 'Full name', + coursetitle => 'Course title', + role => 'Role', + logout => 'Logout', + grades => 'Grades', + ); +} + sub print_coursedefaults { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked, at toggles); @@ -11457,8 +11548,8 @@ map { $posslticrs{$_} = 1; } @lticourseroles; map { $posscrstype{$_} = 1; } @coursetypes; -#FIXME - + my %menutitles = <imenu_titles(); + my (@items,%deletions,%itemids); if ($env{'form.lti_add'}) { my $consumer = $env{'form.lti_consumer_add'}; @@ -11610,18 +11701,31 @@ } } } - foreach my $field ('passback','roster') { + foreach my $field ('passback','roster','topmenu','inlinemenu') { if ($env{'form.lti_'.$field.'_'.$idx}) { $confhash{$itemid}{$field} = 1; } } + + if ($env{'form.lti_topmenu_'.$idx} || $env{'form.lti_inlinemenu_'.$idx}) { + $confhash{$itemid}{lcmenu} = []; + my @possmenu = &Apache::loncommon::get_env_multiple('form.lti_menuitem_'.$idx); + foreach my $field (@possmenu) { + if (exists($menutitles{$field})) { + if ($field eq 'grades') { + next unless ($env{'form.lti_inlinemenu_'.$idx}); + } + push(@{$confhash{$itemid}{lcmenu}},$field); + } + } + } unless (($idx eq 'add') || ($changes{$itemid})) { - foreach my $field ('mapuser','mapcrs','makecrs','section','passback','roster','lcauth','lcauthparm') { + foreach my $field ('mapuser','mapcrs','makecrs','section','passback','roster','lcauth','lcauthparm','topmenu','inlinemenu') { if ($domconfig{$action}{$itemid}{$field} ne $confhash{$itemid}{$field}) { $changes{$itemid} = 1; } } - foreach my $field ('makeuser','mapcrstype','selfenroll','instdata') { + foreach my $field ('makeuser','mapcrstype','selfenroll','instdata','lcmenu') { unless ($changes{$itemid}) { if (ref($domconfig{$action}{$itemid}{$field}) eq 'ARRAY') { if (ref($confhash{$itemid}{$field}) eq 'ARRAY') { @@ -11833,8 +11937,8 @@ } else { $resulttext .= '
  • '.&mt('No section assignment').'
  • '; } - foreach my $item ('passback','roster') { - $resulttext .= '
  • '.$lt{$item}.' '; + foreach my $item ('passback','roster','topmenu','inlinemenu') { + $resulttext .= '
  • '.$lt{$item}.': '; if ($confhash{$itemid}{$item}) { $resulttext .= &mt('Yes'); } else { @@ -11842,6 +11946,14 @@ } $resulttext .= '
  • '; } + if (ref($confhash{$itemid}{'lcmenu'}) eq 'ARRAY') { + if (@{$confhash{$itemid}{'lcmenu'}} > 0) { + $resulttext .= '
  • '.&mt('Menu items:').' '. + join(', ', map { $menutitles{$_}; } (@{$confhash{$itemid}{'lcmenu'}})).'
  • '; + } else { + $resulttext .= '
  • '.&mt('No menu items displayed in header or online menu').'
  • '; + } + } $resulttext .= ''; } } Index: loncom/interface/lonconfigsettings.pm diff -u loncom/interface/lonconfigsettings.pm:1.42 loncom/interface/lonconfigsettings.pm:1.43 --- loncom/interface/lonconfigsettings.pm:1.42 Fri Mar 23 01:01:21 2018 +++ loncom/interface/lonconfigsettings.pm Tue May 8 01:48:18 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: lonconfigsettings.pm,v 1.42 2018/03/23 01:01:21 raeburn Exp $ +# $Id: lonconfigsettings.pm,v 1.43 2018/05/08 01:48:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -219,7 +219,8 @@ $onload .= "toggleLTI(document.display,'user','add');". "toggleLTI(document.display,'crs','add');". "toggleLTI(document.display,'sec','add');". - "toggleLTI(document.display,'lcauth','add');"; + "toggleLTI(document.display,'lcauth','add');". + "toggleLTI(document.display,'lcmenu','add');"; if (ref($values) eq 'HASH') { if (ref($values->{'lti'}) eq 'HASH') { my $numlti = scalar(keys(%{$values->{'lti'}})); @@ -227,7 +228,8 @@ $onload .= "toggleLTI(document.display,'user','$i');". "toggleLTI(document.display,'crs','$i');". "toggleLTI(document.display,'sec','$i');". - "toggleLTI(document.display,'lcauth','$i');"; + "toggleLTI(document.display,'lcauth','$i');". + "toggleLTI(document.display,'lcmenu','$i');"; } } } Index: loncom/interface/courseprefs.pm diff -u loncom/interface/courseprefs.pm:1.86 loncom/interface/courseprefs.pm:1.87 --- loncom/interface/courseprefs.pm:1.86 Wed Jan 3 04:20:54 2018 +++ loncom/interface/courseprefs.pm Tue May 8 01:48:18 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.86 2018/01/03 04:20:54 raeburn Exp $ +# $Id: courseprefs.pm,v 1.87 2018/05/08 01:48:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -367,7 +367,7 @@ my %values=&Apache::lonnet::dump('environment',$cdom,$cnum); my @prefs_order = ('courseinfo','localization','feedback','discussion', 'classlists','appearance','grading','printouts', - 'spreadsheet','bridgetasks','other'); + 'spreadsheet','bridgetasks','lti','other'); my %prefs = ( 'courseinfo' => @@ -530,6 +530,18 @@ 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', + }, + }, 'other' => { text => 'Other settings', help => 'Course_Prefs_Other', @@ -725,6 +737,8 @@ $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); } elsif ($action eq 'bridgetasks') { $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); + } elsif ($action eq 'lti') { + $output .= &print_lti($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); } elsif ($action eq 'other') { $output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype,$noedit); } @@ -1257,6 +1271,38 @@ $settings =~ s/,$//; } $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$/, at lcmenu)) { + push(@newlcmenu,$item); + } + } + } + if (@newlcmenu) { + $newvalues{$entry} = join(',', at newlcmenu); + } else { + $newvalues{$entry} = 'none'; + } + } else { + $newvalues{$entry} = ''; + } + } } else { $newvalues{$entry} = $env{'form.'.$entry}; } @@ -1467,6 +1513,22 @@ } } $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); } else { $displayname = &mt($text); } @@ -1529,8 +1591,23 @@ } } elsif ($changes->{$item}{$key} eq '') { push(@delkeys,$key); - $output .= '
  • '.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]', - ''.$displayname.'')).'
  • '; + if ($item eq 'lti') { + 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 .= '
  • '.&mt('LTI settings for menu items only saved if page header and/or inline menu is set to be displayed').'
  • '; + } else { + $output .= '
  • '.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', + ''.$displayname.'', + "'$displayval'")).'
  • '; + } + } elsif (!exists($changes->{$item}{'lti.override'})) { + $output .= '
  • '.&mt('LTI settings only saved if Override is set to "Yes"').'
  • '; + } + } else { + $output .= '
  • '.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]', + ''.$displayname.'')).'
  • '; + } } else { $output .= '
  • '.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', ''.$displayname.'', @@ -1569,7 +1646,9 @@ } if (($key eq 'description') || ($key eq 'cloners') || ($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); } } @@ -1653,6 +1732,8 @@ my @coowners = split(',',$storehash->{'internal.'.$key}); $crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners; $count ++; + } elsif ($key =~ /^lti\./) { + &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash->{$key}}); } } if ($count) { @@ -4375,6 +4456,144 @@ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'bridgetasks',$noedit); } +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$/, at 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 => ''.&mt($itemtext->{'lti.override'}).''.$domdefs, + input => 'radio', + }, + 'lti.topmenu' => { + text => ''.&mt($itemtext->{'lti.topmenu'}).'', + input => 'radio', + }, + 'lti.inlinemenu' => { + text => ''.&mt($itemtext->{'lti.inlinemenu'}).'', + input => 'radio', + }, + 'lti.lcmenu' => { + text => ''.&mt($itemtext->{'lti.lcmenu'}).'
    '.$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, at 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 = ''; + foreach my $item (@menuitems) { + my $checked = ''; + if (grep(/^\Q$item\E$/, at current)) { + $checked = ' checked="checked" '; + } + my $rem = $count%($numinrow); + if ($rem == 0) { + if ($count > 0) { + $output .= ''; + } + $output .= ''; + } + $output .= ''; + $count ++; + } + my $rem = $count%($numinrow); + my $colsleft = $numinrow - $rem; + if ($colsleft > 1 ) { + $output .= ''; + } elsif ($colsleft == 1) { + $output .= ''; + } + $output .= '
    '. + '  
    '; +} + +sub ltimenu_titles { + return &Apache::lonlocal::texthash( + fullname => 'Full name', + coursetitle => 'Course title', + role => 'Role', + logout => 'Logout', + grades => 'Grades', + ); +} + sub print_other { my ($cdom,$settings,$allitems,$rowtotal,$crstype,$noedit) = @_; unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) { @@ -4557,6 +4776,8 @@ $datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype,$noedit); } elsif ($item eq 'print_header_format') { $datatable .= &print_hdrfmt_row($item,$settings,$noedit); + } elsif ($item eq 'lti.lcmenu') { + $datatable .= &lcmenu_checkboxes($cdom,$item,$settings,$crstype,$noedit); } elsif ($items->{$item}{input} eq 'dates') { my $disabled; if ($noedit) { @@ -4574,6 +4795,8 @@ } $valueyes = "1"; $valueno = "0"; + } elsif (($item eq 'lti.topmenu') || ($item eq 'lti.inlinemenu')) { + $valueyes = '1'; } $datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit); } elsif ($items->{$item}{input} eq 'selectbox') { From raeburn at source.lon-capa.org Tue May 8 11:31:22 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 08 May 2018 15:31:22 -0000 Subject: [LON-CAPA-cvs] cvs: loncom / lontrans.pm Message-ID: raeburn Tue May 8 15:31:22 2018 EDT Modified files: /loncom lontrans.pm Log: - Use internal_redirect to redirect to resource pointed to by a tiny URL, except when authenticated via LTI. Index: loncom/lontrans.pm diff -u loncom/lontrans.pm:1.22 loncom/lontrans.pm:1.23 --- loncom/lontrans.pm:1.22 Sat Apr 21 20:34:44 2018 +++ loncom/lontrans.pm Tue May 8 15:31:22 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # URL translation for User Files # -# $Id: lontrans.pm,v 1.22 2018/04/21 20:34:44 raeburn Exp $ +# $Id: lontrans.pm,v 1.23 2018/05/08 15:31:22 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -91,7 +91,10 @@ } } my $host = $r->headers_in->get('Host'); - if ($host) { + if ($r->is_initial_req() || !$host) { + $r->internal_redirect($realuri); + return OK; + } else { my $protocol = 'http'; if ($r->get_server_port == 443) { $protocol = 'https'; From raeburn at source.lon-capa.org Tue May 8 11:37:42 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 08 May 2018 15:37:42 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /auth lonlogout.pm Message-ID: raeburn Tue May 8 15:37:42 2018 EDT Modified files: /loncom/auth lonlogout.pm Log: - Bug 6754 LON-CAPA as LTI Provider - No log-in again link to LON-CAPA when accessed via LTI Consumer launch. Index: loncom/auth/lonlogout.pm diff -u loncom/auth/lonlogout.pm:1.53 loncom/auth/lonlogout.pm:1.54 --- loncom/auth/lonlogout.pm:1.53 Tue May 1 13:47:53 2018 +++ loncom/auth/lonlogout.pm Tue May 8 15:37:41 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Logout Handler # -# $Id: lonlogout.pm,v 1.53 2018/05/01 13:47:53 raeburn Exp $ +# $Id: lonlogout.pm,v 1.54 2018/05/08 15:37:41 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -191,10 +191,12 @@ $login_url = $relogin_server.'/adm/'. ($env{'request.sso.login'} ? 'roles': 'login?domain='.$domain); } - $relogmessage.='

    '.&mt('You have been successfully logged out.').' ' - .&mt('You can [_1]close this window[_2] now.' - ,'','') # ,'','') - .'

    '; + $relogmessage.='

    '.&mt('You have been successfully logged out.'); + unless (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $relogmessage.=' '.&mt('You can [_1]close this window[_2] now.', + '',''); # ,'',''); + } + $relogmessage.='

    '; =pod =head1 NOTES: @@ -204,9 +206,11 @@ Due to security reasons in new web browsers a window could only be closed with javascript, if this window has also been opened with javascript. This is not done here which means that in most cases the close link will not work. Unless we find another solution, this link should not be offered. (Stefan Bisitz, 2008-08-01) =cut - $relogmessage.='

    '.&mt('[_1]Log in again[_2]' - ,'','') - .'

    '; + unless ($env{'request.lti.login'}) { + $relogmessage.='

    '.&mt('[_1]Log in again[_2]' + ,'','') + .'

    '; + } } if ($env{'request.sso.login'} && defined($r->dir_config("lonSSOUserLogoutMessageFile_$domain"))) { From raeburn at source.lon-capa.org Tue May 8 11:44:11 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 08 May 2018 15:44:11 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /auth lonauth.pm migrateuser.pm Message-ID: raeburn Tue May 8 15:44:11 2018 EDT Modified files: /loncom/auth lonauth.pm migrateuser.pm Log: - Bug 6754 LON-CAPA as LTI Provider - Creation of new LON-CAPA course available from an LTI Consumer. Index: loncom/auth/lonauth.pm diff -u loncom/auth/lonauth.pm:1.151 loncom/auth/lonauth.pm:1.152 --- loncom/auth/lonauth.pm:1.151 Sat Apr 21 21:29:31 2018 +++ loncom/auth/lonauth.pm Tue May 8 15:44:11 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.151 2018/04/21 21:29:31 raeburn Exp $ +# $Id: lonauth.pm,v 1.152 2018/05/08 15:44:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -106,6 +106,11 @@ $r->headers_out->add('Set-cookie' => $defaultcookie); } $r->send_http_header; + if (ref($form) eq 'HASH') { + $form->{'lti.reqcrs'} = $env{'request.lti.reqcrs'}; + $form->{'lti.reqrole'} = $env{'request.lti.reqrole'}; + $form->{'lti.sourcecrs'} = $env{'request.lti.sourcecrs'}; + } &Apache::ltiauth::lti_reqcrs($r,$domain,$form,$username,$domain); return; } Index: loncom/auth/migrateuser.pm diff -u loncom/auth/migrateuser.pm:1.31 loncom/auth/migrateuser.pm:1.32 --- loncom/auth/migrateuser.pm:1.31 Tue Apr 17 19:48:18 2018 +++ loncom/auth/migrateuser.pm Tue May 8 15:44:11 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Starts a user off based of an existing token. # -# $Id: migrateuser.pm,v 1.31 2018/04/17 19:48:18 raeburn Exp $ +# $Id: migrateuser.pm,v 1.32 2018/05/08 15:44:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -94,6 +94,9 @@ if ($data->{'lti.target'}) { $lti_env{'request.lti.target'} = $data->{'lti.target'}; } + if ($data->{'lti.sourcecrs'}) { + $lti_env{'request.lti.sourcecrs'} = $data->{'lti.sourcecrs'}; + } } if ($data->{'lti.passbackid'}) { $lti_env{'request.lti.passbackid'} = $data->{'lti.passbackid'}; @@ -420,7 +423,7 @@ delete($lti_env->{'selfenrollrole'}); } if ($data{'lti.selfenrollrole'}) { - if (&Apache::ltiauth::lti_enroll($data{'username'},data{'domain'}, + if (&Apache::ltiauth::lti_enroll($data{'username'},$data{'domain'}, $data{'lti.selfenrollrole'}) eq 'ok') { my $url = '/adm/roles?selectrole=1&'. &escape($data{'lti.selfenrollrole'}).'=1'; From raeburn at source.lon-capa.org Tue May 8 16:30:13 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 08 May 2018 20:30:13 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface loncommon.pm lonmenu.pm mydesk.tab Message-ID: raeburn Tue May 8 20:30:13 2018 EDT Modified files: /loncom/interface mydesk.tab lonmenu.pm loncommon.pm Log: - Bug 6754 LON-CAPA as LTI Provider - For session launched by LTI Consumer, presence/contents of top line & second line menus determined by domain and/or course configuration. -------------- next part -------------- Index: loncom/interface/mydesk.tab diff -u loncom/interface/mydesk.tab:1.180 loncom/interface/mydesk.tab:1.181 --- loncom/interface/mydesk.tab:1.180 Tue May 1 12:40:06 2018 +++ loncom/interface/mydesk.tab Tue May 8 20:30:12 2018 @@ -1,4 +1,4 @@ -# $Id: mydesk.tab,v 1.180 2018/05/01 12:40:06 raeburn Exp $ +# $Id: mydesk.tab,v 1.181 2018/05/08 20:30:12 raeburn Exp $ # primary menu links # Apache::lonmenu::primary_menu() generates a menu from these elements # prim: item belongs to primary menu @@ -8,13 +8,15 @@ # text: link text # condition: when to show link, primary_menu will act upon this # possible conditions: -# - empty: link is displayed if user is authenticated -# - public: display link if user is public or authenticated +# - empty: link is displayed if user is authenticated (unless excluded by LTI) +# - public: display link if user is public or authenticated (unless excluded by LTI) # - onlypublic: only show this link to public users -# - newmsg: only display if there are new messages -# - nonewmsg: only display if there aren't any new messages -# - roles: show Roles instead of Courses -# - courses: show Courses instead of Roles +# - newmsg: only display if there are new messages (unless excluded by LTI) +# - nonewmsg: only display if there aren't any new messages (unless excluded by LTI) +# - roles: show Roles instead of Courses (unless LTI) +# - courses: show Courses instead of Roles (unless LTI) +# - notlti: not LTI launch +# - ltiexc: link shown unless LTI config excludes display # position: where link is to be displayed # possible positions: # - empty (will be displayed on right side -- default location). @@ -22,7 +24,7 @@ # prim:link:icon:alt:text:condition:position prim::::Personal::left prim:/adm/about.html:/adm/lonIcons/minilogo.gif:LON-CAPA Logo:About:public: -prim:/adm/menu:::Home:: +prim:/adm/menu:::Home:notlti: prim:/adm/communicate:::Messages:nonewmsg: prim:/adm/communicate:::New Messages:newmsg: prim:/adm/roles:::Roles:roles: @@ -30,7 +32,7 @@ prim:/adm/helpdesk:::Help:onlypublic: prim:/adm/roles:::Log In:onlypublic: prim::::Help:: -prim:/adm/logout:::Logout:: +prim:/adm/logout:::Logout:ltiexc: # primary sub-menu links # Apache::lonmenu::primary_menu() generates a sub-menus from these elements @@ -42,7 +44,7 @@ # possible conditions: # - empty: link displayed if user is authenticated # - portfolio: link displayed if portfolio access -# - blogs: link displayed if blog access +# - blog: link displayed if blog access # - wishlist: link displayed if user has privileges to use Stored Links # - reqcrs: link displayed if user can request Course or Community creation # primsub:parent:link:text:condition @@ -78,8 +80,11 @@ # - mgr: Manage grades # - author: authors (au, ca, aa) # - cca: Grant/revoke role of co-author (author only) -# - notltimapres: course context and not LTI launch for specific map or resource -# prim:link:icon:alt:text:condition +# - lti: LTI launch -- LTI-specific rules apply +# - notlti: not LTI launch +# - notltimapres: not LTI launch for specific map or resource +# scnd:link:icon:alt:text:condition +scnd::::Personal:lti scnd:/adm/navmaps?postdata=[url]&postsymb=[symb]:::Contents:notltimapres scnd:/adm/whatsnew:::What's New:whn scnd:/adm/quickgrades:::Grades:nvgr @@ -93,11 +98,15 @@ scnd::::Public:crsedit scnd:/public/[cdom]/[cnum]/syllabus:::Syllabus:showsyllabus scnd:/adm/[cdom]/[cnum]/_rss.html:::Feeds:showfeeds -scnd:/adm/roles:::Roles: +scnd:/adm/roles:::Roles:notlti +scnd:/adm/communicate:::Messages:lti +scnd::::Help:lti +scnd:/adm/logout:::Logout:lti scnd:/priv/[udom]/[uname]/:::Authoring Space:author scnd:/res/[udom]/[uname]/?launch=1:::Browse:author scnd:/adm/createuser:::People:cca scnd::::Settings:author +scnd:[javascript]open_aboutLC();:/adm/lonIcons/minilogo.gif:LON-CAPA Logo:About:lti # secondary sub-menu links # Apache::lonmenu::secondary_menu() generates a sub-menus from these elements @@ -114,7 +123,16 @@ # - mgr: link displayed if user can manage grades # - viewusers: link displayed if user can either grant/revoke student/member roles or view classlists # - vcg: link displayed if user can view groups to which he/she does not belong +# - lti: LTI launch -- LTI-specific rules apply +# - lti(portfolio,wishlist,blog): LTI launch -- LTI-specific rules apply in +# addition to access rule for tool itself (portfolio, wishlist or blog) # scndsub:parent:link:text:condition +scndsub:Personal:/adm/[domain]/[user]/aboutme:Information:lti +scndsub:Personal:/adm/preferences:Preferences:lti +scndsub:Personal:/adm/portfolio:Portfolio:ltiportfolio +scndsub:Personal:/adm/wishlist:Stored Links:ltiwishlist +scndsub:Personal:/adm/announcements:Calendar:lti +scndsub:Personal:/adm/[domain]/[user]/_rss.html:Feeds:ltiblog scndsub:Grades:/adm/statistics?reportSelected=student_assessment:Assessment Chart:vgr scndsub:Grades:/adm/statistics:Statistics and Reports:vgr scndsub:Grades:/adm/classcalc:Spreadsheet:vgr Index: loncom/interface/lonmenu.pm diff -u loncom/interface/lonmenu.pm:1.490 loncom/interface/lonmenu.pm:1.491 --- loncom/interface/lonmenu.pm:1.490 Fri Apr 27 23:01:05 2018 +++ loncom/interface/lonmenu.pm Tue May 8 20:30:12 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.490 2018/04/27 23:01:05 raeburn Exp $ +# $Id: lonmenu.pm,v 1.491 2018/05/08 20:30:12 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -247,8 +247,8 @@ # @primary_menu is filled within the BEGIN block of this module with # entries from mydesk.tab sub primary_menu { - my ($crstype) = @_; - my (%menu); + my ($crstype,$ltimenu) = @_; + my (%menu,%ltiexc); # each element of @primary contains following array: # (link url, icon path, alt text, link text, condition, position) my $public; @@ -265,9 +265,17 @@ my %roles_in_env; $rolecount = &Apache::lonroles::roles_from_env(\%roles_in_env,$update); } - my $ltitarget; + my ($lti,$ltitarget); if ($env{'request.lti.login'}) { + $lti = 1; $ltitarget = $env{'request.lti.target'}; + if (ref($ltimenu) eq 'HASH') { + foreach my $item ('fullname','logout') { + unless ($ltimenu->{$item}) { + $ltiexc{$item} = 1; + } + } + } } foreach my $menuitem (@primary_menu) { # evaluate conditions @@ -283,9 +291,15 @@ && !$public; # only visible to public # users next if $$menuitem[4] eq 'roles' ##show links depending on - && &Apache::loncommon::show_course(); ##term 'Courses' or - next if $$menuitem[4] eq 'courses' ##'Roles' wanted - && !&Apache::loncommon::show_course(); ## + && (&Apache::loncommon::show_course() ##term 'Courses' or + || $env{'request.lti.login'}); ##'Roles' wanted + next if $$menuitem[4] eq 'courses' ##and not LTI access + && (!&Apache::loncommon::show_course() + || !$env{'request.lti.login'}); + next if $$menuitem[4] eq 'notlti' + && $lti; + next if $$menuitem[4] eq 'ltiexc' + && exists($ltiexc{lc($menuitem->[3])}); my $title = $menuitem->[3]; if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) { if ($menuitem->[4] eq 'courses') { @@ -320,7 +334,9 @@ push(@primsub,$item); } if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) { - $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); + unless ($ltiexc{'fullname'}) { + $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); + } } else { $title = &mt($title); } @@ -384,7 +400,7 @@ } sub secondary_menu { - my ($httphost,$ltiscope) = @_; + my ($httphost,$ltiscope,$ltimenu,$noprimary) = @_; my $menu; my $crstype = &Apache::loncommon::course_type(); @@ -408,7 +424,7 @@ my $canplc = &Apache::lonnet::allowed('plc', $crs_sec); my $author = &getauthor(); - my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv,$grouptools); + my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv,$grouptools,$lti,$ltimapres,%ltiexc); $grouptools = 0; if ($env{'request.course.id'}) { $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -443,6 +459,19 @@ } } } + if ($env{'request.lti.login'}) { + $lti = 1; + if (ref($ltimenu) eq 'HASH') { + foreach my $item ('fullname','coursetitle','role','logout','grades') { + unless ($ltimenu->{$item}) { + $ltiexc{$item} = 1; + } + } + } + if (($ltiscope eq 'map') || ($ltiscope eq 'resource')) { + $ltimapres = 1; + } + } } my ($canmodifycoauthor); @@ -453,6 +482,7 @@ $canmodifycoauthor = 1; } } + my ($roleswitcher_js,$roleswitcher_form,$ltitarget); if ($env{'request.lti.login'}) { $ltitarget = $env{'request.lti.target'}; @@ -468,7 +498,7 @@ next if $$menuitem[4] =~ /^crsedit/ && (!$canedit && !$canvieweditor); next if $$menuitem[4] eq 'nvgr' - && $canvgr; + && ($canvgr || $ltiexc{'grades'}); next if $$menuitem[4] eq 'vgr' && !$canvgr; next if $$menuitem[4] eq 'viewusers' @@ -496,7 +526,13 @@ next if $$menuitem[4] eq 'cca' && !$canmodifycoauthor; next if $$menuitem[4] eq 'notltimapres' - && (($ltiscope eq 'resource') || ($ltiscope eq 'map')); + && $ltimapres; + next if $$menuitem[4] eq 'notlti' + && $lti; + next if $$menuitem[4] eq 'lti' + && (!$lti || !$noprimary); + next if $$menuitem[3] eq 'Logout' + && $ltiexc{'logout'}; my $title = $menuitem->[3]; if (defined($secondary_submenu{$title})) { @@ -523,9 +559,21 @@ next if ($item->[2] eq 'params' && !$canmodpara && !$canviewpara); next if ($item->[2] eq 'author' && !$author); next if ($item->[2] eq 'cca' && !$canmodifycoauthor); + next if ($item->[2] eq 'lti' && !$lti); + if ($item->[2] =~ /^lti(portfolio|wishlist|blog)$/) { + my $tool = $1; + next if !$lti; + next if (!&Apache::lonnet::usertools_access('','',$tool, + undef,'tools')); + } push(@scndsub,$item); } } + if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) { + unless ($ltiexc{'fullname'}) { + $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); + } + } if (@scndsub > 0) { $menu .= &create_submenu($link,$target,$title,\@scndsub,1); } elsif ($link ne '#') { @@ -534,15 +582,16 @@ } } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) { # special treatment for role selector - unless ($env{'request.lti.login'}) { - ($roleswitcher_js,$roleswitcher_form,my $switcher) = - &roles_selector( - $env{'course.' . $env{'request.course.id'} . '.domain'}, - $env{'course.' . $env{'request.course.id'} . '.num'}, - $httphost,$ltitarget - ); - $menu .= $switcher; - } + ($roleswitcher_js,$roleswitcher_form,my $switcher) = + &roles_selector( + $env{'course.' . $env{'request.course.id'} . '.domain'}, + $env{'course.' . $env{'request.course.id'} . '.num'}, + $httphost,$ltitarget + ); + $menu .= $switcher; + } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink + next if ($crstype eq 'Placement'); + $menu .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; } else { if ($$menuitem[3] eq 'Syllabus' && $env{'request.course.id'}) { my $url = $$menuitem[0]; @@ -589,7 +638,7 @@ } $menu =~ s/\[uname\]/$$author{user}/g; $menu =~ s/\[udom\]/$$author{dom}/g; - $menu =~ s/\[javascript\]/javascript:/; + $menu =~ s/\[javascript\]/javascript:/g; if ($env{'request.course.id'}) { $menu =~ s/\[cnum\]/$cnum/g; $menu =~ s/\[cdom\]/$cdom/g; @@ -2235,6 +2284,18 @@ 'height=500,width=600,resizable=yes,location=no,menubar=no,toolbar=no,scrollbars=yes'); } +function open_aboutLC() { + var isMobile = "$env{'browser.mobile'}"; + var url = '/adm/about.html'; + if (isMobile == 1) { + openMyModal(url,600,400,'yes'); + } else { + window.open(url,"aboutLONCAPA","height=400,width=600,scrollbars=1,resizable=1,menubar=0,location=1"); + } + return; +} + + (function (\$) { \$(document).ready(function () { \$.single=function(a){return function(b){a[0]=b;return a}}(\$([1])); Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.1317 loncom/interface/loncommon.pm:1.1318 --- loncom/interface/loncommon.pm:1.1317 Tue May 1 13:30:49 2018 +++ loncom/interface/loncommon.pm Tue May 8 20:30:12 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.1317 2018/05/01 13:30:49 raeburn Exp $ +# $Id: loncommon.pm,v 1.1318 2018/05/08 20:30:12 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -5941,6 +5941,10 @@ context, this will contain the URL for the landing item in the course, after launch from an LTI Consumer +=item * $ltimenu, optional argument, if LON-CAPA is in LTI Provider + context, this will contain a reference to hash of items + to be included in the page header and/or inline menu. + =back Returns: A uniform header for LON-CAPA web pages. @@ -5952,7 +5956,7 @@ sub bodytag { my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, - $no_nav_bar,$bgcolor,$args,$advtoolsref,$ltiscope,$ltiuri)=@_; + $no_nav_bar,$bgcolor,$args,$advtoolsref,$ltiscope,$ltiuri,$ltimenu)=@_; my $public; if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) @@ -6023,7 +6027,18 @@ if ($public) { undef($role); } - + + if (($env{'request.course.id'}) && ($env{'request.lti.login'})) { + if (ref($ltimenu) eq 'HASH') { + unless ($ltimenu->{'role'}) { + undef($role); + } + unless ($ltimenu->{'coursetitle'}) { + $realm=' '; + } + } + } + my $titleinfo = '

    '.$title.'

    '; # # Extra info if you are the DC @@ -6057,27 +6072,29 @@ $bodytag .= Apache::lonhtmlcommon::scripttag( Apache::lonmenu::utilityfunctions($httphost), 'start'); - my ($left,$right) = Apache::lonmenu::primary_menu($crstype); + unless ($args->{'no_primary_menu'}) { + my ($left,$right) = Apache::lonmenu::primary_menu($crstype,$ltimenu); - if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { - if ($dc_info) { - $dc_info = qq|$dc_info|; - } - $bodytag .= qq|
    $left $role
    - $realm $dc_info
    |; - return $bodytag; - } + if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { + if ($dc_info) { + $dc_info = qq|$dc_info|; + } + $bodytag .= qq|
    $left $role
    + $realm $dc_info
    |; + return $bodytag; + } - unless ($env{'request.symb'} =~ m/\.page___\d+___/) { - $bodytag .= qq|
    $left $role
    |; - } + unless ($env{'request.symb'} =~ m/\.page___\d+___/) { + $bodytag .= qq|
    $left $role
    |; + } - $bodytag .= $right; + $bodytag .= $right; - if ($dc_info) { - $dc_info = &dc_courseid_toggle($dc_info); + if ($dc_info) { + $dc_info = &dc_courseid_toggle($dc_info); + } + $bodytag .= qq|
    $realm $dc_info
    |; } - $bodytag .= qq|
    $realm $dc_info
    |; #if directed to not display the secondary menu, don't. if ($args->{'no_secondary_menu'}) { @@ -6085,7 +6102,10 @@ } #don't show menus for public users if (!$public){ - $bodytag .= Apache::lonmenu::secondary_menu($httphost,$ltiscope); + unless ($args->{'no_inline_menu'}) { + $bodytag .= Apache::lonmenu::secondary_menu($httphost,$ltiscope,$ltimenu, + $args->{'no_primary_menu'}); + } $bodytag .= Apache::lonmenu::serverform(); $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); if ($env{'request.state'} eq 'construct') { @@ -8697,13 +8717,38 @@ #&Apache::lonnet::logthis("start_page ".join(':',caller(0))); $env{'internal.start_page'}++; - my ($result, at advtools,$ltiscope,$ltiuri); + my ($result, at advtools,$ltiscope,$ltiuri,%ltimenu); if (! exists($args->{'skip_phases'}{'head'}) ) { $result .= &xml_begin($args->{'frameset'}) . &headtag($title, $head_extra, $args); } if (($env{'request.course.id'}) && ($env{'request.lti.login'})) { + if ($env{'course.'.$env{'request.course.id'}.'.lti.override'}) { + unless ($env{'course.'.$env{'request.course.id'}.'.lti.topmenu'}) { + $args->{'no_primary_menu'} = 1; + } + unless ($env{'course.'.$env{'request.course.id'}.'.lti.inlinemenu'}) { + $args->{'no_inline_menu'} = 1; + } + if ($env{'course.'.$env{'request.course.id'}.'.lti.lcmenu'}) { + map { $ltimenu{$_} = 1; } split(/,/,$env{'course.'.$env{'request.course.id'}.'.lti.lcmenu'}); + } + } else { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider'); + if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') { + unless ($lti{$env{'request.lti.login'}}{'topmenu'}) { + $args->{'no_primary_menu'} = 1; + } + unless ($lti{$env{'request.lti.login'}}{'inlinemenu'}) { + $args->{'no_inline_menu'} = 1; + } + if (ref($lti{$env{'request.lti.login'}}{'lcmenu'}) eq 'ARRAY') { + map { $ltimenu{$_} = 1; } @{$lti{$env{'request.lti.login'}}{'lcmenu'}}; + } + } + } ($ltiscope,$ltiuri) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'}, $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); @@ -8721,7 +8766,7 @@ $args->{'only_body'}, $args->{'domain'}, $args->{'force_register'}, $args->{'no_nav_bar'}, $args->{'bgcolor'}, $args, - \@advtools,$ltiscope,$ltiuri); + \@advtools,$ltiscope,$ltiuri,\%ltimenu); } } From raeburn at source.lon-capa.org Wed May 9 23:49:52 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Thu, 10 May 2018 03:49:52 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lontiny.pm Message-ID: raeburn Thu May 10 03:49:52 2018 EDT Modified files: /loncom/interface lontiny.pm Log: - Bug 6754 LON-CAPA as LTI Provider - For LTI session, no link to Roles/Courses page when tiny URL is invalid Index: loncom/interface/lontiny.pm diff -u loncom/interface/lontiny.pm:1.2 loncom/interface/lontiny.pm:1.3 --- loncom/interface/lontiny.pm:1.2 Sat Apr 14 02:29:44 2018 +++ loncom/interface/lontiny.pm Thu May 10 03:49:51 2018 @@ -2,7 +2,7 @@ # Extract domain, courseID, and symb from a shortened URL, # and switch role to a role in designated course. # -# $Id: lontiny.pm,v 1.2 2018/04/14 02:29:44 raeburn Exp $ +# $Id: lontiny.pm,v 1.3 2018/05/10 03:49:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -276,13 +276,16 @@ sub generic_error { my ($r) = @_; - my $linktext; - if ($env{'user.adv'}) { - $linktext = &mt('Continue to your roles page'); - } else { - $linktext = &mt('Continue to your courses page'); + my $continuelink; + unless ($env{'request.lti.login'}) { + my $linktext; + if ($env{'user.adv'}) { + $linktext = &mt('Continue to your roles page'); + } else { + $linktext = &mt('Continue to your courses page'); + } + $continuelink=''.$linktext.''; } - my $continuelink=''.$linktext.''; my $msg = &mt('The page you requested does not exist.'); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; From raeburn at source.lon-capa.org Thu May 10 00:06:13 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Thu, 10 May 2018 04:06:13 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonmenu.pm Message-ID: raeburn Thu May 10 04:06:13 2018 EDT Modified files: /loncom/interface lonmenu.pm Log: - Bug 6754 LON-CAPA as LTI Provider - For LTI session use icons only, by default, for standard items on right of page. Index: loncom/interface/lonmenu.pm diff -u loncom/interface/lonmenu.pm:1.491 loncom/interface/lonmenu.pm:1.492 --- loncom/interface/lonmenu.pm:1.491 Tue May 8 20:30:12 2018 +++ loncom/interface/lonmenu.pm Thu May 10 04:06:13 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.491 2018/05/08 20:30:12 raeburn Exp $ +# $Id: lonmenu.pm,v 1.492 2018/05/10 04:06:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1551,7 +1551,8 @@ unless ($env{'request.state'} eq 'construct') { push(@tools,63); } - if (($env{'environment.icons'} eq 'iconsonly') && + if ((($env{'environment.icons'} eq 'iconsonly') || + ($env{'environment.icons'} eq '') && ($env{'request.lti.login'})) && (grep(/^$idx$/, at tools))) { $inlineremote[$idx] = ''.$pic.'';