From 387f548ea1cd321d478e92d73fe1b87e55f93424 Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Tue, 19 Feb 2013 14:48:04 +0100
Subject: [PATCH] [PASSED QA] Bug 9043: [SIGNED OFF] Syspref improvement: add
 new type "multiple"

This patch adds a new type "multiple" for syspref.
This new type allows to select several values for one syspref.

Signed-off-by: Koha Team Lyon 3 <koha@univ-lyon3.fr>
Signed-off-by: Jacek Ablewicz <abl@biblos.pk.edu.pl>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
---
 admin/preferences.pl                                   | 18 ++++++++++++++++--
 .../intranet-tmpl/prog/en/js/pages/preferences.js      | 13 ++++++++++++-
 .../intranet-tmpl/prog/en/modules/admin/preferences.tt | 12 ++++++++++++
 svc/config/systempreferences                           |  2 +-
 4 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/admin/preferences.pl b/admin/preferences.pl
index 2d0bac5..00cf115 100755
--- a/admin/preferences.pl
+++ b/admin/preferences.pl
@@ -17,8 +17,7 @@
 # with Koha; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-use strict;
-use warnings;
+use Modern::Perl;
 
 use CGI;
 use Encode;
@@ -106,6 +105,21 @@ sub _get_chunk {
             map { { text => $options{'choices'}->{$_}, value => $_, selected => ( $_ eq $value || ( $_ eq '' && ( $value eq '0' || !$value ) ) ) } }
             keys %{ $options{'choices'} }
         ];
+    } elsif ( $options{'multiple'} ) {
+        my @values = split /\|/, $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 /^$option_value$/, @values,
+                }
+              }
+              keys %{ $options{multiple} }
+        ];
     }
 
     $chunk->{ 'type_' . $chunk->{'type'} } = 1;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/pages/preferences.js b/koha-tmpl/intranet-tmpl/prog/en/js/pages/preferences.js
index 6932312..9800f47 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/js/pages/preferences.js
+++ b/koha-tmpl/intranet-tmpl/prog/en/js/pages/preferences.js
@@ -3,7 +3,18 @@
 KOHA.Preferences = {
     Save: function ( form ) {
         modified_prefs = $( form ).find( '.modified' );
+        // $.serialize removes empty value, we need to keep them.
+        // If a multiple select has all its entries unselected
+        var unserialized = new Array();
+        $(modified_prefs).each(function(){
+            if ( $(this).attr('multiple') && $(this).val() == null ) {
+                unserialized.push($(this));
+            }
+        });
         data = modified_prefs.serialize();
+        $(unserialized).each(function(){
+            data += '&' + $(this).attr('name') + '=';
+        });
         if ( !data ) {
             humanMsg.displayAlert( MSG_NOTHING_TO_SAVE );
             return;
@@ -46,7 +57,7 @@ $( document ).ready( function () {
         $( this.form ).find( '.save-all' ).removeAttr( 'disabled' );
         $( this ).addClass( 'modified' );
         var name_cell = $( this ).parents( '.name-row' ).find( '.name-cell' );
-		if ( !name_cell.find( '.modified-warning' ).length )
+        if ( !name_cell.find( '.modified-warning' ).length )
             name_cell.append( '<em class="modified-warning">('+MSG_MODIFIED+')</em>' );
         KOHA.Preferences.Modified = true;
     }
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt
index 6b77990..7bc9014 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt
@@ -116,6 +116,18 @@
                         </option>
                         [% END %]
                     </select>
+                    [% ELSIF ( CHUNK.type_multiple ) %]
+                    <select name="pref_[% CHUNK.name %]" id="pref_[% CHUNK.name %]" class="preference preference-[% CHUNK.class or "choice" %]" multiple="multiple">
+                        [% FOREACH CHOICE IN CHUNK.CHOICES %]
+                        [% IF ( CHOICE.selected ) %]
+                        <option value="[% CHOICE.value %]" selected="selected">
+                        [% ELSE %]
+                        <option value="[% CHOICE.value %]">
+                        [% END %]
+                            [% CHOICE.text %]
+                        </option>
+                        [% END %]
+                    </select>
                     [% ELSIF ( CHUNK.type_textarea ) %]
 					<a class="expand-textarea" style="display: none" href="#">Click to Edit</a>
 					<textarea name="pref_[% CHUNK.name %]" id="pref_[% CHUNK.name %]" class="preference preference-[% CHUNK.class or "short" %]" rows="10" cols="40">[% CHUNK.value %]</textarea>
diff --git a/svc/config/systempreferences b/svc/config/systempreferences
index deeca51..6fceb97 100755
--- a/svc/config/systempreferences
+++ b/svc/config/systempreferences
@@ -95,7 +95,7 @@ sub set_preferences {
 
             next if ( !defined( $pref ) );
 
-            my $value = join( ',', $query->param( $param ) );
+            my $value = join( '|', $query->param( $param ) );
 
             C4::Context->set_preference( $pref, $value );
             logaction( 'SYSTEMPREFERENCE', 'MODIFY', undef, $pref . " | " . $value );
-- 
1.9.1