From fabb3d9604ea6bbaf98c291b8b0d940522030a93 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] Bug 9043: 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.

http://bugs.koha-community.org/show_bug.cgi?id=9456
---
 admin/preferences.pl                                       |   11 +++++++++--
 koha-tmpl/intranet-tmpl/prog/en/js/pages/preferences.js    |    5 ++++-
 .../intranet-tmpl/prog/en/modules/admin/preferences.tt     |   12 ++++++++++++
 svc/config/systempreferences                               |    2 +-
 4 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/admin/preferences.pl b/admin/preferences.pl
index db91e76..fc27657 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 C4::Auth;
@@ -104,6 +103,14 @@ 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 { { text => $options{multiple}->{$_}, value => $_, selected => ( $_ ~~ @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 8fe6369..9869e08 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/js/pages/preferences.js
+++ b/koha-tmpl/intranet-tmpl/prog/en/js/pages/preferences.js
@@ -4,6 +4,9 @@ KOHA.Preferences = {
     Save: function ( form ) {
         modified_prefs = $( form ).find( '.modified' );
         data = modified_prefs.serialize();
+        if ( data.length == 0 && $(modified_prefs).attr('multiple') ) {
+            data = $(modified_prefs).attr('name') + "=";
+        }
         if ( !data ) {
             humanMsg.displayAlert( MSG_NOTHING_TO_SAVE );
             return;
@@ -46,7 +49,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 be7ed9f..98d985e 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt
@@ -112,6 +112,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.7.10.4