--- loncom/interface/coursecatalog.pm 2014/04/28 22:12:55 1.84
+++ loncom/interface/coursecatalog.pm 2019/07/19 13:18:27 1.88.2.4
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler for displaying the course catalog interface
#
-# $Id: coursecatalog.pm,v 1.84 2014/04/28 22:12:55 raeburn Exp $
+# $Id: coursecatalog.pm,v 1.88.2.4 2019/07/19 13:18:27 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,6 +38,7 @@ use Apache::lonlocal;
use Apache::courseclassifier;
use Apache::lonacc;
use LONCAPA;
+use LONCAPA::lonauthcgi;
sub handler {
my ($r) = @_;
@@ -79,15 +80,19 @@ sub handler {
my %domconfig =
&Apache::lonnet::get_dom('configuration',['coursecategories'],$codedom);
my $knownuser = &user_is_known();
-
+ my $canviewall = &canview_all($knownuser,$codedom);
+
my ($cathash,$cattype);
if (ref($domconfig{'coursecategories'}) eq 'HASH') {
$cathash = $domconfig{'coursecategories'}{'cats'};
- if ($knownuser) {
+ if ($knownuser || $canviewall) {
$cattype = $domconfig{'coursecategories'}{'auth'};
} else {
$cattype = $domconfig{'coursecategories'}{'unauth'};
}
+ if ($cattype eq '') {
+ $cattype = 'std';
+ }
} else {
$cathash = {};
$cattype = 'std';
@@ -98,7 +103,7 @@ sub handler {
({href=>"/adm/coursecatalog",
text=>"Course/Community Catalog"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog'));
- if ($knownuser) {
+ if ($knownuser || $canviewall) {
$r->print('
'.&mt('No catalog of LON-CAPA courses/communities is provided for: [_1]',$domdesc).'
');
} else {
if ($domconfig{'coursecategories'}{'auth'} eq 'none') {
@@ -146,8 +151,8 @@ sub handler {
my %courses = &Apache::lonnet::courseiddump($codedom,'.',1,'.','.',
$cnum,undef,undef,'.',1);
if (keys(%courses)) {
- $env{'form.coursenum'} = $cnum;
- my %courseinfo = &build_courseinfo_hash(\%courses,$knownuser,$codedom);
+ $env{'form.coursenum'} = $cnum;
+ my %courseinfo = &build_courseinfo_hash(\%courses,$knownuser,$codedom,$canviewall);
undef($env{'form.coursenum'});
if (ref($courseinfo{$codedom.'_'.$cnum}) eq 'HASH') {
$r->print(&Apache::lonhtmlcommon::start_pick_box());
@@ -202,21 +207,31 @@ sub handler {
$r->print('
'.&Apache::loncommon::end_page());
return OK;
} else {
- if ($env{'form.coursenum'}) {
- $cnum = $env{'form.coursenum'};
+ if ($env{'form.coursenum'} ne '') {
+ if ($env{'form.coursenum'} =~ /^$LONCAPA::match_courseid$/) {
+ $cnum = $env{'form.coursenum'};
+ } else {
+ delete($env{'form.coursenum'});
+ }
}
}
- if ($env{'form.catalog_maxdepth'} ne '') {
- $env{'form.catalog_maxdepth'} =~ s{\D}{}g;
- }
-
- my (@cats,@trails,%allitems,%idx,@jsarray,%subcathash,$subcats);
+ my (@cats,@trails,%allitems,%idx,@jsarray,%subcathash,$subcats,%maxd,
+ $toplevelstr,$maxdepthstr);
if ($env{'form.withsubcats'}) {
$subcats = \%subcathash;
}
&Apache::loncommon::extract_categories($cathash,\@cats,\@trails,\%allitems,
- \%idx,\@jsarray,$subcats);
+ \%idx,\@jsarray,$subcats,\%maxd);
+ if (ref($cats[0]) eq 'ARRAY') {
+ foreach my $item (@{$cats[0]}) {
+ $toplevelstr .= "'".&js_escape($item)."::0',";
+ $maxdepthstr .= "'$maxd{$item}',";
+ }
+ $toplevelstr =~ s/,$//;
+ $maxdepthstr =~ s/,$//;
+ }
+ &validate_input(\@cats,\%maxd);
my ($numtitles,@codetitles);
if (($env{'form.coursenum'} ne '') && ($knownuser)) {
&course_details($r,$codedom,$formname,$domdesc,\@trails,\%allitems,\@codetitles);
@@ -226,9 +241,29 @@ sub handler {
my $catjs = <<"ENDSCRIPT";
function setCatDepth(depth) {
- document.coursecats.catalog_maxdepth.value = depth;
- if (depth == '') {
+ var depth = parseInt(depth);
+ if (depth !== NaN) {
+ if (depth > 0) {
+ var possmaxd = 0;
+ var toplevel = new Array($toplevelstr);
+ var maxdepths = new Array($maxdepthstr);
+ if (toplevel.length) {
+ for (var i=0; i possmaxd) {
+ depth = possmaxd;
+ }
+ }
+ document.coursecats.catalog_maxdepth.value = depth;
+ } else {
document.coursecats.currcat_0.value = '';
+ document.coursecats.catalog_maxdepth.value = '';
}
document.coursecats.submit();
return;
@@ -246,7 +281,7 @@ function setCourseId(caller) {
ENDSCRIPT
$catjs .= &courselink_javascript();
- if (&user_is_dc($codedom)) {
+ if (&user_is_dc($codedom) || $canviewall) {
$catjs .= <print(&print_course_listing($codedom,$numtitles,undef,undef,undef,
- \@codetitles));
+ \@codetitles,$canviewall));
}
} else {
my (%add_entries);
@@ -290,6 +325,7 @@ ENDTOGGJS
if (!$deeper) {
$alert = &mt('Choose a category to display');
}
+ &js_escape(\$alert);
$catjs .= <print('
');
}
if ($env{'form.state'} eq 'listing') {
- $r->print(&print_course_listing($codedom,undef,\@trails,\%allitems,$subcats,\@codetitles));
+ $r->print(&print_course_listing($codedom,undef,\@trails,\%allitems,$subcats,\@codetitles,
+ $canviewall));
}
}
}
@@ -333,6 +370,67 @@ ENDJS
return OK;
}
+sub validate_input {
+ my ($cats,$maxd) = @_;
+ my $currcat = '';
+ my $depth = 0;
+ if ($env{'form.catalog_maxdepth'} ne '') {
+ $env{'form.catalog_maxdepth'} =~ s{\D}{}g;
+ }
+ if ((ref($cats) eq 'ARRAY') && (ref($maxd) eq 'HASH')) {
+ if (ref($cats->[0]) eq 'ARRAY') {
+ if (@{$cats->[0]} == 1) {
+ if ($cats->[0][0] eq 'instcode') {
+ $currcat = 'instcode::0';
+ } elsif ($cats->[0][0] eq 'communities') {
+ $currcat = 'communities::0';
+ } elsif ($cats->[0][0] eq 'placement') {
+ $currcat = 'placement::0';
+ } else {
+ my $name = $cats->[0][0];
+ $currcat = &escape($name).'::0';
+ }
+ if (exists($maxd->{$cats->[0][0]})) {
+ if ($env{'form.catalog_maxdepth'} <= $maxd->{$cats->[0][0]}) {
+ $depth = $env{'form.catalog_maxdepth'};
+ } else {
+ $depth = $maxd->{$cats->[0][0]};
+ }
+ }
+ } elsif ((@{$cats->[0]} > 1) && ($env{'form.currcat_0'} ne '')) {
+ my ($escname) = ($env{'form.currcat_0'} =~ /^([^:]+)\:\:0$/);
+ if ($escname =~ /^instcode|communities|placement$/) {
+ $currcat = $env{'form.currcat_0'};
+ if (exists($maxd->{$escname})) {
+ if ($env{'form.catalog_maxdepth'} <= $maxd->{$escname}) {
+ $depth = $env{'form.catalog_maxdepth'};
+ } else {
+ $depth = $maxd->{$escname};
+ }
+ } else {
+ $depth = 1;
+ }
+ } elsif ($escname ne '') {
+ my $name = &unescape($escname);
+ if (grep(/^\Q$name\E$/,@{$cats->[0]})) {
+ $currcat = $env{'form.currcat_0'};
+ if (exists($maxd->{$name})) {
+ if ($env{'form.catalog_maxdepth'} <= $maxd->{$name}) {
+ $depth = $env{'form.catalog_maxdepth'};
+ } else {
+ $depth = $maxd->{$name};
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ $env{'form.currcat_0'} = $currcat;
+ $env{'form.catalog_maxdepth'} = $depth;
+ return;
+}
+
sub course_details {
my ($r,$codedom,$formname,$domdesc,$trails,$allitems,$codetitles) = @_;
my $output;
@@ -428,7 +526,7 @@ END
}
sub instcode_course_selector {
- my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs,$codetitles,$cattype) = @_;
+ my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs,$codetitles,$cattype,$canviewall) = @_;
my %coursecodes = ();
my %codes = ();
my %cat_titles = ();
@@ -448,10 +546,10 @@ sub instcode_course_selector {
'';
if ($totcodes) {
if (($env{'form.state'} eq 'listing') && ($numtitles > 0)) {
- $add_entries{'onLoad'} = 'setElements();';
+ $add_entries{'onload'} = 'setElements();';
}
- if (&user_is_dc($codedom)) {
- $add_entries{'onLoad'} .= ' toggleStatuses();toggleWasActive();'
+ if (&user_is_dc($codedom) || $canviewall) {
+ $add_entries{'onload'} .= ' toggleStatuses();toggleWasActive();'
}
&cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles,$cattype);
my $cat_maxdepth = $env{'form.catalog_maxdepth'};
@@ -459,7 +557,7 @@ sub instcode_course_selector {
''."\n".
''."\n".
''.
- &additional_filters($codedom));
+ &additional_filters($codedom,undef,$canviewall));
if ($numtitles > 0) {
$r->print(''.&mt('Choose which course(s) to list.').'
'.
&Apache::courseclassifier::build_instcode_selectors($numtitles,
@@ -680,10 +778,10 @@ sub get_depth_values {
}
sub additional_filters {
- my ($codedom,$has_subcats) = @_;
+ my ($codedom,$has_subcats,$canviewall) = @_;
my $is_dc = &user_is_dc($codedom);
my $output = '';
- if ($is_dc) {
+ if ($is_dc || $canviewall) {
$output .= '