X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=admin%2Fpreferences.pl;h=49d06ad996e69fc3b92ae774b7108e765bc6843b;hb=9d6d641d1f8b77271800f43bc027b651f9aea52b;hp=b1ad005b8b0456527bf4d94114c607882e4fb744;hpb=b2b16fb8cf4bf89862eba6fc14d507dc79de4db7;p=srvgit diff --git a/admin/preferences.pl b/admin/preferences.pl index b1ad005b8b..49d06ad996 100755 --- a/admin/preferences.pl +++ b/admin/preferences.pl @@ -4,37 +4,34 @@ # # This file is part of Koha. # -# Koha 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. +# Koha 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 3 of the License, or +# (at your option) any later version. # -# Koha 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. +# Koha 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 Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . -use strict; -use warnings; +use Modern::Perl; -use CGI; -use C4::Auth; +use CGI qw ( -utf8 ); +use C4::Auth qw( get_template_and_user ); use C4::Context; -use C4::Koha; -use C4::Languages qw(getTranslatedLanguages); -use C4::ClassSource; -use C4::Log; -use C4::Output; +use C4::Koha qw( getallthemes ); +use C4::Languages qw( getTranslatedLanguages ); +use C4::ClassSource qw( GetClassSources GetClassSource ); +use C4::Output qw( output_html_with_http_headers ); use C4::Templates; -use C4::Budgets qw(GetCurrency); -use File::Spec; +use Koha::Acquisition::Currencies; use IO::File; -use YAML::Syck qw(); -$YAML::Syck::ImplicitTyping = 1; -our $lang; +use YAML::XS; +use Encode; +use List::MoreUtils qw( any ); # use Smart::Comments; # @@ -44,16 +41,16 @@ sub GetTab { my $tab_template = C4::Templates::gettemplate( 'admin/preferences/' . $tab . '.pref', 'intranet', $input ); - my $active_currency = GetCurrency(); + my $active_currency = Koha::Acquisition::Currencies->get_active; my $local_currency; if ($active_currency) { - $local_currency = $active_currency->{currency}; + $local_currency = $active_currency->currency; } $tab_template->param( local_currency => $local_currency, # currency code is used, because we do not know how a given currency is formatted. ); - return YAML::Syck::Load( $tab_template->output() ); + return YAML::XS::Load( Encode::encode_utf8($tab_template->output())); } sub _get_chunk { @@ -61,9 +58,20 @@ sub _get_chunk { my $name = $options{'pref'}; my $chunk = { name => $name, value => $value, type => $options{'type'} || 'input', class => $options{'class'} }; + if( $options{'syntax'} ){ + $chunk->{'syntax'} = $options{'syntax'}; + } + + if( $options{'type'} && $options{'type'} eq 'modalselect' ){ + $chunk->{'source'} = $options{'source'}; + $chunk->{'exclusions'} = $options{'exclusions'} // ""; + $chunk->{'type'} = 'modalselect'; + } if ( $options{'class'} && $options{'class'} eq 'password' ) { $chunk->{'input_type'} = 'password'; + } elsif ( $options{'class'} && $options{'class'} eq 'email' ) { + $chunk->{'input_type'} = 'email'; } elsif ( $options{'class'} && $options{'class'} eq 'date' ) { $chunk->{'dateinput'} = 1; } elsif ( $options{'type'} && ( $options{'type'} eq 'opac-languages' || $options{'type'} eq 'staff-languages' ) ) { @@ -76,13 +84,14 @@ sub _get_chunk { $interface = 'opac'; $theme = C4::Context->preference('opacthemes'); } else { - # this is the staff client + # this is the staff interface $interface = 'intranet'; $theme = C4::Context->preference('template'); } - $chunk->{'languages'} = getTranslatedLanguages( $interface, $theme, $lang, $current_languages ); + $chunk->{'languages'} = getTranslatedLanguages( $interface, $theme, undef, $current_languages ); $chunk->{'type'} = 'languages'; } elsif ( $options{ 'choices' } ) { + my $add_blank; if ( $options{'choices'} && ref( $options{ 'choices' } ) eq '' ) { if ( $options{'choices'} eq 'class-sources' ) { my $sources = GetClassSources(); @@ -91,6 +100,9 @@ sub _get_chunk { $options{'choices'} = { map { $_ => $_ } getallthemes( 'opac' ) } } elsif ( $options{'choices'} eq 'staff-templates' ) { $options{'choices'} = { map { $_ => $_ } getallthemes( 'intranet' ) } + } elsif ( $options{choices} eq 'patron-categories' ) { + $options{choices} = { map { $_->categorycode => $_->description } Koha::Patron::Categories->search }; + $add_blank = 1; } else { die 'Unrecognized source of preference values: ' . $options{'choices'}; } @@ -98,12 +110,47 @@ sub _get_chunk { $value ||= 0; - $chunk->{'type'} = 'select'; + $chunk->{'type'} = ( $options{class} && $options{class} eq 'multiple' ) ? 'multiple' : 'select'; + + my @values; + @values = split /,/, $value if defined($value); $chunk->{'CHOICES'} = [ sort { $a->{'text'} cmp $b->{'text'} } - map { { text => $options{'choices'}->{$_}, value => $_, selected => ( $_ eq $value || ( $_ eq '' && ( $value eq '0' || !$value ) ) ) } } + map { + my $c = $_; + { + text => $options{'choices'}->{$c}, + value => $c, + selected => ( + grep { $_ eq $c || ( $c eq '' && ($value eq '0' || !$value ) ) } @values + ) ? 1 : 0, + } + } keys %{ $options{'choices'} } ]; + + # Add a first blank value if needed + unshift @{ $chunk->{CHOICES} }, { + text => '', + value => '', + } if $add_blank && $chunk->{type} eq 'select'; + + } elsif ( $options{'multiple'} ) { + my @values; + @values = split /,/, $value if defined($value); + $chunk->{type} = 'multiple'; + $chunk->{CHOICES} = [ + sort { $a->{'text'} cmp $b->{'text'} } + map { + my $option_value = $_; + { + text => $options{multiple}->{$option_value}, + value => $option_value, + selected => (grep { $_ eq $option_value } @values) ? 1 : 0, + } + } + keys %{ $options{multiple} } + ]; } $chunk->{ 'type_' . $chunk->{'type'} } = 1; @@ -120,6 +167,13 @@ sub TransformPrefsToHTML { my $tab = $data->{ $title }; $tab = { '' => $tab } if ( ref( $tab ) eq 'ARRAY' ); + my @override_syspref_names; + if ( exists($ENV{OVERRIDE_SYSPREF_NAMES}) && + defined($ENV{OVERRIDE_SYSPREF_NAMES}) + ) { + @override_syspref_names = split /,/, $ENV{OVERRIDE_SYSPREF_NAMES}; + } + foreach my $group ( sort keys %$tab ) { if ( $group ) { push @lines, { is_group_title => 1, title => $group }; @@ -156,15 +210,24 @@ sub TransformPrefsToHTML { $name_entry->{'highlighted'} = 1; } } + $name_entry->{'overridden'} = 1 if ( any { $name eq $_ } @override_syspref_names ); push @names, $name_entry; } else { push @chunks, $piece; } } else { + if ( $piece ) { + my $version = Koha::version(); + my ( $major, $minor, $maintenance, $development ) = split( '\.', $version ); + if ( $minor % 2 ) { + $piece =~ s|__VERSION__|${major}_${minor}|g; + } else { + $piece =~ s|__VERSION__|master|g; + } + } push @chunks, { type_text => 1, contents => $piece }; } } - push @lines, { CHUNKS => \@chunks, NAMES => \@names, is_group_title => 0 }; } } @@ -182,7 +245,7 @@ sub _get_pref_files { foreach my $file ( glob( "$htdocs/$theme/$lang/modules/admin/preferences/*.pref" ) ) { my ( $tab ) = ( $file =~ /([a-z0-9_-]+)\.pref$/ ); - $results{$tab} = $open_files ? new IO::File( $file, 'r' ) : ''; + $results{$tab} = $open_files ? IO::File->new( $file, 'r' ) : ''; } return %results; @@ -195,8 +258,10 @@ sub SearchPrefs { my %tab_files = _get_pref_files( $input ); our @terms = split( /\s+/, $searchfield ); - foreach my $tab_name ( keys %tab_files ) { - my $data = GetTab( $input, $tab_name ); + foreach my $tab_name ( sort keys %tab_files ) { + # FIXME Hum? + # Force list context to remove 'uninitialized value in goto' warn coming from YAML::Syck; note that the other GetTab call is in list context too. The actual cause however is the null value for the pref OpacRenewalBranch in opac.pref + my ($data) = GetTab( $input, $tab_name ); my $title = ( keys( %$data ) )[0]; my $tab = $data->{ $title }; $tab = { '' => $tab } if ( ref( $tab ) eq 'ARRAY' ); @@ -216,12 +281,10 @@ sub SearchPrefs { foreach my $piece ( @$line ) { if ( ref( $piece ) eq 'HASH' ) { - if ( !$piece->{'pref'} ){ next; } - if ( $piece->{'pref'} =~ /^$searchfield$/i ) { - my ( undef, $LINES ) = TransformPrefsToHTML( $data, $searchfield ); - - return { search_jumped => 1, tab => $tab_name, tab_title => $title, LINES => $LINES }; - } elsif ( matches( $piece->{'pref'}, \@terms) ) { + if ( !$piece->{'pref'} ){ + next; + } + if ( matches( $piece->{'pref'}, \@terms) ) { $matched = 1; } elsif ( ref( $piece->{'choices'} ) eq 'HASH' && grep( { $_ && matches( $_, \@terms ) } values( %{ $piece->{'choices'} } ) ) ) { $matched = 1; @@ -241,7 +304,7 @@ sub SearchPrefs { if ( $matched_groups ) { my ( $title, $LINES ) = TransformPrefsToHTML( { $title => $matched_groups }, $searchfield ); - push @tabs, { tab => $tab, tab_title => $title, LINES => $LINES, }; + push @tabs, { tab => $tab, tab_title => $title, LINES => $LINES, tab_id => $tab_name }; } } @@ -250,42 +313,44 @@ sub SearchPrefs { sub matches { my ( $text, $terms ) = @_; - if ( $text ) { return !grep( { $text !~ /$_/i } @$terms ); } + if ( $text ) { + return !grep( + { + my $re = eval{qr|$_|i}; + $re = qr|\Q$_\E| if $@; + $text !~ m|$re|; + } @$terms + ) + } } my $dbh = C4::Context->dbh; -our $input = new CGI; +our $input = CGI->new; my ( $template, $borrowernumber, $cookie ) = get_template_and_user( - { template_name => "admin/preferences.tmpl", + { template_name => "admin/preferences.tt", query => $input, type => "intranet", - authnotrequired => 0, - flagsrequired => { parameters => 'parameters_remaining_permissions' }, - debug => 1, + flagsrequired => { parameters => 'manage_sysprefs' }, } ); -$lang = $template->param( 'lang' ); my $op = $input->param( 'op' ) || ''; my $tab = $input->param( 'tab' ); -$tab ||= 'acquisitions'; # Ideally this should be "local-use" but preferences.pl +$tab ||= 'accounting'; # Ideally this should be "local-use" but preferences.pl # does not presently support local use preferences my $highlighted; if ( $op eq 'save' ) { - unless ( C4::Context->config( 'demo' ) ) { - foreach my $param ( $input->param() ) { - my ( $pref ) = ( $param =~ /pref_(.*)/ ); + foreach my $param ( $input->param() ) { + my ( $pref ) = ( $param =~ /pref_(.*)/ ); - next if ( !defined( $pref ) ); + next if ( !defined( $pref ) ); - my $value = join( ',', $input->param( $param ) ); + my $value = join( ',', $input->param( $param ) ); - C4::Context->set_preference( $pref, $value ); - logaction( 'SYSTEMPREFERENCE', 'MODIFY', undef, $pref . " | " . $value ); - } + C4::Context->set_preference( $pref, $value ); } print $input->redirect( '/cgi-bin/koha/admin/preferences.pl?tab=' . $tab ); @@ -297,7 +362,10 @@ my @TABS; if ( $op eq 'search' ) { my $searchfield = $input->param( 'searchfield' ); - $searchfield =~ s/[^a-zA-Z0-9_ -]//g; + $searchfield =~ s/\p{IsC}//g; + $searchfield =~ s/\s+/ /; + $searchfield =~ s/^\s+//; + $searchfield =~ s/\s+$//; $template->param( searchfield => $searchfield ); @@ -322,7 +390,7 @@ if ( $op eq 'search' ) { if ( $tab ) { my ( $tab_title, $LINES ) = TransformPrefsToHTML( GetTab( $input, $tab ), $highlighted ); - push @TABS, { tab_title => $tab_title, LINES => $LINES }; + push @TABS, { tab_title => $tab_title, LINES => $LINES, tab_id => $tab }; $template->param( $tab => 1, tab => $tab,