Improves search on address components.
authorStéphane Jacob <sj@m4x.org>
Fri, 10 Jun 2011 09:08:03 +0000 (11:08 +0200)
committerStéphane Jacob <sj@m4x.org>
Fri, 10 Jun 2011 13:09:05 +0000 (15:09 +0200)
Removes confusing search on administrative_area_level_3, fatorizes code,
allows to easily delete search criteria.

htdocs/javascript/search.js
modules/search.php
templates/search/adv.form.address_component.tpl [new file with mode: 0644]
templates/search/adv.form.autocomplete_select.tpl
templates/search/adv.form.tpl

index 4347c33..feca64b 100644 (file)
@@ -21,7 +21,8 @@
 // {{{ Page initialization
 
 var baseurl = $.plURL('search/');
-var address_types = new Array('country', 'administrative_area_level_1', 'administrative_area_level_2', 'administrative_area_level_3', 'locality', 'sublocality');
+var address_types = new Array('country', 'administrative_area_level_1', 'administrative_area_level_2', 'locality', 'sublocality');
+var address_types_count = address_types.length;
 
 function load_advanced_search(request)
 {
@@ -46,13 +47,12 @@ function load_advanced_search(request)
         setAddress(0, 1, new Array(request['country'],
                                    request['administrative_area_level_1'],
                                    request['administrative_area_level_2'],
-                                   request['administrative_area_level_3'],
                                    request['locality'],
                                    request['sublocality'])
         );
     } else {
-        for (var i = 1; i < 6; ++i) {
-            $('tr#' + address_types[i] + '_list').hide();
+        for (var i = 1; i < address_types_count; ++i) {
+            $('tr#' + address_types[i]).hide();
         }
     }
 
@@ -86,6 +86,22 @@ function load_advanced_search(request)
     });
 
     $('#only_referent').change(function() { changeOnlyReferent(); });
+
+    $('.delete_address_component').click(function() {
+        var field_name = $(this).attr('href');
+        var hide = false;
+
+        for (var i = 1; i < address_types_count; ++i) {
+            if (field_name == address_types[i]) {
+                hide = true;
+            }
+            if (hide) {
+                delete_address_component(address_types[i]);
+            }
+        }
+
+        return false;
+    });
 }
 
 function display_list(field_name)
@@ -216,17 +232,17 @@ function setAddress(i, j, values)
             $("select[name='locality_text']").attr('value', '');
     }
 
-    $("[name='" + next_type + "']").parent().load(baseurl + 'list/' + next_type, { previous:prev_type, value:values[i] }, function() {
+    $('#' + next_list).load(baseurl + 'list/' + next_type, { previous:prev_type, value:values[i] }, function() {
         if ($("select[name='" + next_type + "']").children("option").size() > 1) {
-            $("tr#" + next_list).show();
+            $("tr#" + next_type).show();
             $("select[name='" + next_type + "']").attr('value', values[j]);
-            if (j < 6) {
+            if (j < address_types_count) {
                 setAddress(j, j + 1, values);
             }
         } else {
-            $("tr#" + next_list).hide();
+            $("tr#" + next_type).hide();
             $("select[name='" + next_type + "']").attr('value', '');
-            if (j < 6) {
+            if (j < address_types_count) {
                 setAddress(i, j + 1, values);
             }
         }
@@ -239,18 +255,18 @@ function displayNextAddressComponent(i, j, value)
     var next_type = address_types[j];
     var next_list = next_type + '_list';
 
-    if (j == 3) {
+    if (next_type == 'locality') {
         $('tr#locality_text').hide();
         $("select[name='locality_text']").attr('value', '');
     }
 
-    $("[name='" + next_type + "']").parent().load(baseurl + 'list/' + next_type, { previous:prev_type, value:value }, function() {
+    $('#' + next_list).load(baseurl + 'list/' + next_type, { previous:prev_type, value:value }, function() {
         $("select[name='" + next_type + "']").attr('value', '');
         if ($("select[name='" + next_type + "']").children('option').size() > 1) {
-            $('tr#' + next_list).show();
+            $('tr#' + next_type).show();
         } else {
-            $('tr#' + next_list).hide();
-            if (j < 6) {
+            $('tr#' + next_type).hide();
+            if (j < address_types_count) {
                 displayNextAddressComponent(i, j + 1, value);
             }
         }
@@ -259,25 +275,34 @@ function displayNextAddressComponent(i, j, value)
 
 function changeAddressComponents(type, value)
 {
-    var i = 0, j = 0;
+    var i = 0;
 
-    while (address_types[i] != type && i < 6) {
+    while (address_types[i] != type && i < address_types_count) {
         ++i;
     }
 
-    j = i + 1;
-    while (j < 6) {
-        $("select[name='" + address_types[j] + "']").attr('value', '');
-        $('tr#' + address_types[j] + '_list').hide();
-        ++j;
+    for (var j = i + 1; j < address_types_count; ++j) {
+        delete_address_component(address_types[j]);
     }
 
-    if (value != '' && i < 5) {
+    if (value != '' && i < address_types_count) {
         $("select[name='" + type + "']").attr('value', value);
         displayNextAddressComponent(i, i + 1, value);
     }
 }
 
+function delete_address_component(field_name)
+{
+    $('tr#' + field_name).hide();
+    $('#' + field_name + '_list').html('');
+    $("input[name='" + field_name + "']").val('');
+
+    if (field_name == 'locality') {
+        $("select[name='locality_text']").attr('value', '');
+        $('tr#locality_text').show();
+    }
+}
+
 // when changing school, open diploma choice
 function changeSchool(schoolId, diploma)
 {
index b10b098..ff3d8b8 100644 (file)
@@ -312,7 +312,6 @@ class SearchModule extends PLModule
             break;
           case 'administrative_area_level_1':
           case 'administrative_area_level_2':
-          case 'administrative_area_level_3':
           case 'locality':
             $page->assign('onchange', 'changeAddressComponents(\'' . $type . '\', this.value)');
           case 'sublocality':
diff --git a/templates/search/adv.form.address_component.tpl b/templates/search/adv.form.address_component.tpl
new file mode 100644 (file)
index 0000000..f64ebf3
--- /dev/null
@@ -0,0 +1,34 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2011 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program 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.                                   *}
+{*                                                                        *}
+{*  This program 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 this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<tr id="{$name}">
+  <td>{$description}</td>
+  <td>
+    <span id="{$name}_list"></span>
+    <input name="{$name}" type="hidden" class="address_component" value="{$value}" />
+    <a href="{$name}" class="delete_address_component">
+      {icon name="cross" title="Supprimer ce critère"}
+    </a>
+  </td>
+</tr>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
index 8af2905..d634f8d 100644 (file)
 {*                                                                        *}
 {**************************************************************************}
 
-<td>{$description}</td>
-<td>
-  <span id="{$name}_list"></span>
-  <input name="{$name}_text" type="text" class="autocomplete" size="32" value="{$value_text}" />
-  <input name="{$name}" type="hidden" class="autocomplete_target" value="{$value}" />
-  <a href="{$name}" class="autocomplete_to_select" title="display" id="{$name}_table">
-    {icon name="table" title=$title}
-  </a>
-</td>
+<tr>
+  <td>{$description}</td>
+  <td>
+    <span id="{$name}_list"></span>
+    <input name="{$name}_text" type="text" class="autocomplete" size="32" value="{$value_text}" />
+    <input name="{$name}" type="hidden" class="autocomplete_target" value="{$value}" />
+    <a href="{$name}" class="autocomplete_to_select" title="display" id="{$name}_table">
+      {icon name="table" title=$title}
+    </a>
+  </td>
+</tr>
 
 {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
index 0c79d76..4df0e1d 100644 (file)
     <tr>
       <td colspan="2" class="center"><small>Seuls les lieux où résident des camarades sont proposés ci-dessous.</small></td>
     </tr>
-    <tr>
-      {include file="search/adv.form.autocomplete_select.tpl" description="Pays" name="country"
-        value_text=$smarty.request.country_text value=$smarty.request.country title="Tous les pays"}
-    </tr>
-    <tr id="administrative_area_level_1_list">
-      <td>Région, province, état&hellip;</td>
-      <td>
-        <input name="administrative_area_level_1" type="hidden" size="32" value="{$smarty.request.administrative_area_level_1}" />
-      </td>
-    </tr>
-    <tr id="administrative_area_level_2_list">
-      <td>Département, comté&hellip;</td>
-      <td>
-        <input name="administrative_area_level_2" type="hidden" size="32" value="{$smarty.request.administrative_area_level_2}" />
-      </td>
-    </tr>
-    <tr id="administrative_area_level_3_list">
-      <td>Canton&hellip;</td>
-      <td>
-        <input name="administrative_area_level_3" type="hidden" size="32" value="{$smarty.request.administrative_area_level_3}" />
-      </td>
-    </tr>
+    {include file="search/adv.form.autocomplete_select.tpl" description="Pays" name="country"
+      value_text=$smarty.request.country_text value=$smarty.request.country title="Tous les pays"}
+    {include file="search/adv.form.address_component.tpl" description="Région, province, état…" name="administrative_area_level_1"
+      value=$smarty.request.administrative_area_level_1}
+    {include file="search/adv.form.address_component.tpl" description="Département, comté…" name="administrative_area_level_2"
+      value=$smarty.request.administrative_area_level_2}
     <tr id="locality_text">
       <td>Ville</td>
       <td><input type="text" class="autocomplete" name="locality_text" size="32" value="{$smarty.request.locality_text}" /></td>
     </tr>
-    <tr id="locality_list">
-      <td>Ville</td>
-      <td>
-        <input name="locality" type="hidden" size="32" value="{$smarty.request.locality}" />
-      </td>
-    </tr>
-    <tr id="sublocality_list">
-      <td>Arrondissement, quartier&hellip;</td>
-      <td>
-        <input name="sublocality" type="hidden" size="32" value="{$smarty.request.sublocality}" />
-      </td>
-    </tr>
+    {include file="search/adv.form.address_component.tpl" description="Ville" name="locality" value=$smarty.request.locality}
+    {include file="search/adv.form.address_component.tpl" description="Arrondissement, quartier…" name="sublocality" value=$smarty.request.sublocality}
     <tr>
       <td colspan="2">
         <label for="only_current">
       <td>Description</td>
       <td><input type="text" class="autocomplete" name="jobdescription" size="32" value="{$smarty.request.jobdescription}" /></td>
     </tr>
-    <tr>
-      {include file="search/adv.form.autocomplete_select.tpl" description="Mots-clefs" name="jobterm"
-        value_text=$smarty.request.jobterm_text value=$smarty.request.jobterm title="Tous les mots-clefs"}
-    </tr>
+    {include file="search/adv.form.autocomplete_select.tpl" description="Mots-clefs" name="jobterm"
+      value_text=$smarty.request.jobterm_text value=$smarty.request.jobterm title="Tous les mots-clefs"}
     {if hasPerm('directory_private')}
     <tr>
       <td>CV contient</td>
     <tr>
       <th colspan="2">Divers</th>
     </tr>
-    <tr>
-      {include file="search/adv.form.autocomplete_select.tpl" description="Nationalité" name="nationalite"
-        value_text=$smarty.request.nationalite_text value=$smarty.request.nationalite title="Toutes les nationalités"}
-    </tr>
+    {include file="search/adv.form.autocomplete_select.tpl" description="Nationalité" name="nationalite"
+      value_text=$smarty.request.nationalite_text value=$smarty.request.nationalite title="Toutes les nationalités"}
     {if hasPerm('directory_private')}
-    <tr>
-      {include file="search/adv.form.autocomplete_select.tpl" description="Binet" name="binet"
-        value_text=$smarty.request.binet_text value=$smarty.request.binet title="Tous les binets"}
-    </tr>
+    {include file="search/adv.form.autocomplete_select.tpl" description="Binet" name="binet"
+      value_text=$smarty.request.binet_text value=$smarty.request.binet title="Tous les binets"}
     {/if}
-    <tr>
-      {include file="search/adv.form.autocomplete_select.tpl" description="Groupe X" name="groupex"
-        value_text=$smarty.request.groupex_text value=$smarty.request.groupex title="Tous les groupes X"}
-    </tr>
+    {include file="search/adv.form.autocomplete_select.tpl" description="Groupe X" name="groupex"
+      value_text=$smarty.request.groupex_text value=$smarty.request.groupex title="Tous les groupes X"}
     {if hasPerm('directory_private')}
-    <tr>
-      {include file="search/adv.form.autocomplete_select.tpl" description="Section" name="section"
-        value_text=$smarty.request.section_text value=$smarty.request.section title="Toutes les sections"}
-    </tr>
+    {include file="search/adv.form.autocomplete_select.tpl" description="Section" name="section"
+      value_text=$smarty.request.section_text value=$smarty.request.section title="Toutes les sections"}
     {/if}
-    <tr>
-      {include file="search/adv.form.autocomplete_select.tpl" description="Formation" name="school"
-        value_text=$smarty.request.school_text value=$smarty.request.school title="Toutes les formations"}
-    </tr>
+    {include file="search/adv.form.autocomplete_select.tpl" description="Formation" name="school"
+      value_text=$smarty.request.school_text value=$smarty.request.school title="Toutes les formations"}
     <tr>
       <td>Diplôme</td>
       <td>