File:  [LON-CAPA] / loncom / interface / lonconfigsettings.pm
Revision 1.9: download - view: text, annotated - select for diffs
Thu Jan 7 18:21:25 2010 UTC (14 years, 3 months ago) by faziophi
Branches: MAIN
CVS tags: HEAD
course prefs --> jQuery accordion.  in order to not disrupt domain prefs,
etc. for now, some style information is changed dynamically through
jQuery CSS transformations.  also ignoring column display preferences for
now.  but this gets something into CVS...

# The LearningOnline Network with CAPA
# Handler to set domain-wide configuration settings
#
# $Id: lonconfigsettings.pm,v 1.9 2010/01/07 18:21:25 faziophi Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
#
###############################################################
##############################################################

package Apache::lonconfigsettings;

use strict;
use Apache::lonnet;
use Apache::loncommon();
use Apache::lonhtmlcommon();
use Apache::lonlocal;

sub print_header {
    my ($r,$phase,$context,$jscript) = @_;
    my ($pagetitle,$brcrumtitle,$action,$call_category_check);
    if ($context eq 'domain') {
        ($pagetitle, $brcrumtitle) = ('View/Modify Domain Settings','Domain Settings');
        $action = '/adm/domainprefs';
        if ($phase eq 'display') {
            my @actions = &Apache::loncommon::get_env_multiple('form.actions');
            if (grep(/^coursecategories$/,@actions)) {
                $call_category_check = qq|
    if (formname == document.display) {
        if (!categoryCheck(formname)) {
            return;
        }
    }
|;
            }
        }
    } else {
        if (&Apache::loncommon::course_type() eq 'Community') {
            ($pagetitle,$brcrumtitle) = ('Community Configuration','Community Configuration');
        } else {
            ($pagetitle,$brcrumtitle) = ('Course Configuration','Course Configuration');
        }
        $action = '/adm/courseprefs';
    }
    my $alert = &mt('You must select at least one functionality type to display.');
    my $js = '
<script type="text/javascript">
// <![CDATA[

function changePage(formname,newphase) {
    formname.phase.value = newphase;
    numchecked = 0;
    if (formname == document.pickactions) {
        if (formname.actions.length > 0) {
            for (var i = 0; i<formname.actions.length; i++) {
                if (formname.actions[i].checked) {
                    numchecked ++;
                }
            }
        } else {
            if (formname.actions.checked) {
                numchecked ++;
            }
        }
        if (numchecked > 0) {
            formname.submit();
        } else {
            alert("'.$alert.'");
            return;
        }
    }
    '.$call_category_check.'
    formname.submit();
}'."\n";
    if ($phase eq 'pickactions') {
        $js .=
            &Apache::lonhtmlcommon::set_form_elements({actions => 'checkbox',numcols => 'radio',})."\n".
            &javascript_set_colnums();
    } elsif ($phase eq 'display') {
        $js .= &color_pick_js()."\n";
    }
    $js .= &Apache::loncommon::viewport_size_js().'

// ]]>
</script>
';
    if ($jscript) {
        $js .= "

$jscript

";
    }
    my $additem;
    if ($phase eq 'pickactions') {
        my %loaditems = (
                    'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);",
                        );
        $additem = {'add_entries' => \%loaditems,};
    } else {
        my %loaditems = (
                    'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);",
                        );
        $additem = {'add_entries' => \%loaditems,};
    }
    $r->print(&Apache::loncommon::start_page($pagetitle,$js,$additem));
    $r->print(&Apache::lonhtmlcommon::breadcrumbs($brcrumtitle));
    $r->print('
<form name="parmform" action="">
<input type="hidden" name="pres_marker" />
<input type="hidden" name="pres_type" />
<input type="hidden" name="pres_value" />
</form>
');
    $r->print('<form method="post" name="'.$phase.'" action="'.$action.'"'.
              ' enctype="multipart/form-data">');
    return;
}

sub print_footer {
    my ($r,$phase,$newphase,$button_text,$actions) = @_;
    $button_text = &mt($button_text);
    $r->print('<input type="hidden" name="phase" value="" />'.
              '<input type="hidden" name="width" value="'.
              $env{'form.width'}.'" />'.
              '<input type="hidden" name="height" value="'.
              $env{'form.height'}.'" />');
    if (defined($env{'form.origin'})) {
        $r->print('<input type="hidden" name="origin" value="'.$env{'form.origin'}.'" />'."\n");
    }
    if (($phase eq 'display') || ($phase eq 'process')) {
        if (ref($actions) eq 'ARRAY') {
            foreach my $item (@{$actions}) {
                $r->print('<input type="hidden" name="actions" value="'.$item.'" />')."\n";
            }
        }
        $r->print('<input type="hidden" name="numcols" value="'.$env{'form.numcols'}.'" />');
    }
    my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
    if ($phase eq 'process') {
        $r->print('<p><a href='.$dest.'>'.$button_text.'</a></p>');
    } else {
        my $onclick;
        if ($phase eq 'display') {
            $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
        } else {
            $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
        }
        $r->print('<p><input type="button" name="store" value="'.
                  $button_text.'" onclick='.$onclick.' /></p>');
    }
    if ($phase eq 'process') {
        $r->print('</form>'.&Apache::loncommon::end_page());
    }
    return;
}

sub make_changes {
    my ($r,$dom,$phase,$context,$prefs_order,$prefs,$values,$confname,$roles,$allitems) = @_;
    my %brcrumtext = &get_crumb_text();
    my @actions = &Apache::loncommon::get_env_multiple('form.actions');
    my ($numchanged,%changes,%disallowed);
    &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:changePage(document.$phase,'display')",
        text=>$brcrumtext{$context}},
       {href=>"javascript:changePage(document.$phase,'$phase')",
        text=>"Updated"});
    &print_header($r,$phase,$context);
    my $crstype;
    if ($context eq 'course') {
        $crstype = &Apache::loncommon::course_type();
    }
    if ((ref($prefs_order) eq 'ARRAY') && (ref($prefs) eq 'HASH') && 
        (ref($prefs) eq 'HASH')) {
        foreach my $item (@{$prefs_order}) {
            if (grep(/^\Q$item\E$/,@actions)) {
                if ($context eq 'domain') {
                    $r->print('<h3>'.&mt($prefs->{$item}{'text'}).'</h3>'.
                              &Apache::domainprefs::process_changes($r,$dom,
                                          $confname,$item,$roles,$values));
                } else {
                    $changes{$item} = {};
                    &Apache::courseprefs::process_changes($dom,$item,$values,
                                                          $prefs->{$item},$changes{$item},
                                                          $allitems,\%disallowed,$crstype);
                    if (keys(%{$changes{$item}}) > 0) {
                        $numchanged ++;
                    }
                }
            }
        }
    }
    if ($context eq 'course') {
        if ($numchanged) {
            $r->print(&Apache::courseprefs::store_changes($dom,$confname,$prefs_order,\@actions,
                                                          $prefs,$values,\%changes,$crstype));
        } else {
            if ($crstype eq 'Community') {
                $r->print(&mt("No changes made to community configuration."));
            } else {
                $r->print(&mt("No changes made to course configuration."));
            }
        }
        if (keys(%disallowed) > 0) {
            $r->print('<p>');
            foreach my $item ('cloners','rolenames','feedback','discussion','localization') {
                if (ref($disallowed{$item}) eq 'HASH') {
                    if (keys(%{$disallowed{$item}}) > 0) {
                        $r->print(&Apache::courseprefs::display_disallowed($item,$disallowed{$item},
                                                                           $prefs,$crstype));
                    }
                }
            }
            $r->print('</p>');
        }
    }
    $r->print('<p>');
    my $footer_text = 'Back to configuration display';
    if ($context eq 'course') {
        $footer_text = 'Back to display/edit settings'; 
    }
    &print_footer($r,$phase,'display',$footer_text,\@actions);
    $r->print('</p>');
}

sub display_settings {
    my ($r,$dom,$phase,$context,$prefs_order,$prefs,$values,$confname,$jscript,
        $allitems,$crstype) = @_;
    my %brcrumtext = &get_crumb_text();
    my @actions = &Apache::loncommon::get_env_multiple('form.actions');
    &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"javascript:changePage(document.$phase,'display')",
          text=>"Display/Edit Settings"});
    &print_header($r,$phase,$context,$jscript);
    if ((ref($prefs_order) eq 'ARRAY') && (ref($prefs) eq 'HASH') && (ref($values) eq 'HASH')) { 
        if (@actions > 0) {
            my $rowsum = 0;
            my (%output,%rowtotal,@items);
            my $halfway = @actions/2;
            foreach my $item (@{$prefs_order}) {
                if (grep(/^\Q$item\E$/,@actions)) {
                    push(@items,$item);
                    if ($context eq 'domain') {
                        ($output{$item},$rowtotal{$item}) =
                            &Apache::domainprefs::print_config_box($r,$dom,$confname,
                                $phase,$item,$prefs->{$item},$values->{$item});
                    } else {
                        ($output{$item},$rowtotal{$item}) =
                            &Apache::courseprefs::print_config_box($r,$dom,$phase,
                                $item,$prefs->{$item},$values,$allitems,$crstype);
                    }
                    $rowsum += $rowtotal{$item};
                }
            }
            my $colend;
            my $halfway = $rowsum/2;
            my $aggregate = 0;
            my $sumleft = 0;
            my $sumright = 0;
            my $crossover;
            for (my $i=0; $i<@items; $i++) {
                $aggregate += $rowtotal{$items[$i]};
                if ($aggregate > $halfway) {
                    $crossover = $i;
                    last;
                }
            }
            for (my $i=0; $i<$crossover; $i++) {
                $sumleft += $rowtotal{$items[$i]};
            }
            for (my $i=$crossover+1; $i<@items; $i++) {
                $sumright += $rowtotal{$items[$i]};
            }
            if ((@items > 1) && ($env{'form.numcols'} == 2)) {
                my $sumdiff = $sumright - $sumleft;
                if ($sumdiff > 0) {
                    $colend = $crossover + 1;
                } else {
                    $colend = $crossover;
                }
            } else {
                $colend = @items;
            }
            if ($context ne 'course') {
            	$r->print('<p><table class="LC_double_column"><tr><td class="LC_left_col">');            
            }
            else {
            	$r->print('<div id="prefs" style="max-width:900px;margin: 10px auto 10px auto;">');
            }
            for (my $i=0; $i<$colend; $i++) {
                $r->print($output{$items[$i]});
            }
            if ($context ne 'course') {
            	$r->print('</td><td></td><td class="LC_right_col">');
            }
            if ($colend < @items) {
                for (my $i=$colend; $i<@items; $i++) {
                    $r->print($output{$items[$i]});
                }
            }
            if ($context ne 'course') {
            	$r->print('</td></tr></table></p>');
            }
            else {
            	$r->print('</div>');
            }
            $r->print(&print_footer($r,$phase,'process','Save Changes',\@actions));
        } else {
            $r->print('<input type="hidden" name="phase" value="" />'.
                  '<input type="hidden" name="numcols" value="'.
                  $env{'form.numcols'}.'" />'."\n".
                  '<span class="LC_error">'.&mt('No settings chosen').
                  '</span>');
        }
        $r->print('</form>');
    }
    if ($context eq 'course') {
    	$r->print('
<script type="text/javascript">
	$(document).ready(function(){
		$("#prefs").accordion({
			autoHeight: false
		});
		$("#prefs td.LC_left_item").css("text-align", "right");
		$("#prefs td.LC_left_item").css("width", "40%");
		$("#prefs td.LC_left_item").css("padding-right", "10px");		
		$("#prefs td.LC_right_item").css("text-align", "left");
		$("#prefs td.LC_right_item").css("width", "60%");		
	});
</script>
');
    }
    $r->print(&Apache::loncommon::end_page());
    return;
}

sub display_choices {
    my ($r,$phase,$context,$prefs_order,$prefs) = @_;
    if ($phase eq '') {
        $phase = 'pickactions';
    }
    my %helphash;
    &print_header($r,$phase,$context);
    $r->print('<h3>'.&mt('Settings to display/modify').'</h3>');
    $r->print('<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".
              &Apache::loncommon::check_uncheck_jscript()."\n".
              '// ]]>'."\n".
              '</script>'."\n".'<p><input type="button" value="'.&mt('check all').'" '.
              'onclick="javascript:checkAll(document.pickactions.actions)"'.
              ' />'.('&nbsp;'x2).
              '<input type="button" value="'.&mt('uncheck all').'" '.
              'onclick="javascript:uncheckAll(document.pickactions.actions)"'.
              ' /></p><div class="LC_left_float">');
    my ($numitems,$midpoint,$seconddiv,$count);
    if (ref($prefs_order) eq 'ARRAY') {
        $numitems = @{$prefs_order};
    }
    $midpoint = int($numitems/2);
    if ($numitems%2) {
        $midpoint ++;
    }
    $count = 0;
    if ((ref($prefs_order) eq 'ARRAY') && (ref($prefs) eq 'HASH')) {
        foreach my $item (@{$prefs_order}) {
            $r->print('<h4>'.
                      &Apache::loncommon::help_open_topic($prefs->{$item}->{'help'}).
                      '<label><input type="checkbox" name="actions" value="'.$item.
                      '" />&nbsp;'.&mt($prefs->{$item}->{'text'}).'</label></h4>');
            $count ++;
            if ((!$seconddiv) && ($count >= $midpoint)) {
                $r->print('</div>'."\n".'<div class="LC_left_float">'."\n");
                $seconddiv = 1;
            }
        }
        $r->print('</div><div class="LC_clear_float_footer"></div><h3>'.
                  &mt('Display options').'</h3>'."\n".
                  '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".
                  '<label><input type="radio" name="numcols" value="1" />'.
                  &mt('one column').'</label>&nbsp;&nbsp;<label>'.
                  '<input type="radio" name="numcols" value="2" />'.
                  &mt('two columns').'</label></span></p>');
    }
    $r->print(&print_footer($r,$phase,'display','Go'));
    $r->print('</form>');
    $r->print(&Apache::loncommon::end_page());
    return;
}

sub javascript_set_colnums {
    return <<END;
function setDisplayColumns() {
    if (document.pickactions.width.value > 1100) {
        document.pickactions.numcols[1].checked = true;
    } else {
        document.pickactions.numcols[0].checked = true;
    }
}
END
}

sub color_pick_js {
    my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
    my $output = <<"ENDCOL";
    function pclose() {
        parmwin=window.open("/adm/rat/empty.html","LONCAPAparms","height=350,width=350,scrollbars=no,menubar=no");
        parmwin.close();
    }

    $pjump_def

    function psub() {
        pclose();
        if (document.parmform.pres_marker.value!='') {
            if (document.parmform.pres_type.value!='') {
                eval('document.display.'+
                     document.parmform.pres_marker.value+
                     '.value=document.parmform.pres_value.value;');
            }
        } else {
            document.parmform.pres_value.value='';
            document.parmform.pres_marker.value='';
        }
    }

    function get_id (span_id) {
        if (document.getElementById) {
            return document.getElementById(span_id);
        }
        if (document.all) {
            return document.all[span_id];
        }
        return false;
    }

    function colchg_span (span_id_str,new_color_item) {
        var span_ref = get_id(span_id_str);
        if (span_ref.style) { span_ref = span_ref.style; }
        span_ref.background = new_color_item.value;
        span_ref.backgroundColor = new_color_item.value;
        span_ref.bgColor = new_color_item.value;
    }

ENDCOL
    return $output;
}

sub get_crumb_text {
    my %brcrumbtext = (
                       domain => 'Domain Settings',
                       course => 'Display/Edit Settings',
                     );
    return %brcrumbtext;
}

1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>