]> git.agnieray.net Git - galette.git/commitdiff
Add region to members; closes #583
authorJohan Cwiklinski <johan@x-tnd.be>
Tue, 6 Feb 2024 21:35:22 +0000 (22:35 +0100)
committerJohan Cwiklinski <johan@x-tnd.be>
Thu, 8 Feb 2024 20:24:35 +0000 (21:24 +0100)
Also add region to preferences

14 files changed:
galette/includes/fields_defs/members_fields.php
galette/includes/routes/ajax.routes.php
galette/install/scripts/mysql.sql
galette/install/scripts/pgsql.sql
galette/install/scripts/sql/upgrade-to-1.10-mysql.sql
galette/install/scripts/sql/upgrade-to-1.10-pgsql.sql
galette/lib/Galette/Controllers/AjaxController.php
galette/lib/Galette/Core/Preferences.php
galette/lib/Galette/Entity/Adherent.php
galette/templates/default/components/form.html.twig
galette/templates/default/elements/scripts.html.twig
galette/templates/default/pages/preferences.html.twig
tests/Galette/Entity/tests/units/FieldsConfig.php
tests/Galette/Entity/tests/units/ListsConfig.php

index 722deb810938c2c9051761a9e261e3c856ab594a..6975e37738e85f9a81abdf82d9bc051291d1ab94 100644 (file)
@@ -125,12 +125,20 @@ $members_fields = array(
         'position' => 14,
         'category' => FieldsCategories::ADH_CATEGORY_CONTACT
     ),
+    'region_adh' => array(
+        'label'    => _T("Region:"),
+        'propname' => 'region',
+        'required' => false,
+        'visible'  => FieldsConfig::USER_WRITE,
+        'position' => 15,
+        'category' => FieldsCategories::ADH_CATEGORY_CONTACT
+    ),
     'pays_adh' => array(
         'label'    => _T("Country:"),
         'propname' => 'country',
         'required' => false,
         'visible'  => FieldsConfig::USER_WRITE,
-        'position' => 15,
+        'position' => 16,
         'category' => FieldsCategories::ADH_CATEGORY_CONTACT
     ),
     'tel_adh' => array(
@@ -138,7 +146,7 @@ $members_fields = array(
         'propname' => 'phone',
         'required' => false,
         'visible'  => FieldsConfig::USER_WRITE,
-        'position' => 16,
+        'position' => 17,
         'category' => FieldsCategories::ADH_CATEGORY_CONTACT
     ),
     'gsm_adh' => array(
@@ -146,7 +154,7 @@ $members_fields = array(
         'propname' => 'gsm',
         'required' => false,
         'visible'  => FieldsConfig::USER_WRITE,
-        'position' => 17,
+        'position' => 18,
         'category' => FieldsCategories::ADH_CATEGORY_CONTACT
     ),
     'email_adh' => array(
@@ -154,7 +162,7 @@ $members_fields = array(
         'propname' => 'email',
         'required' => false,
         'visible'  => FieldsConfig::USER_WRITE,
-        'position' => 18,
+        'position' => 19,
         'category' => FieldsCategories::ADH_CATEGORY_CONTACT
     ),
     'info_adh' => array(
index b2368b9113ec0f6d0fb5227450cbc186ec2b4106..1aa806cf0adfc29afdb339811bd700a615a3fa12 100644 (file)
@@ -48,6 +48,11 @@ $app->group('/ajax', function (RouteCollectorProxy $app) use ($authenticate) {
         [AjaxController::class, 'suggestCountries']
     )->setName('suggestCountry');
 
+    $app->post(
+        '/suggest/regions/{term}',
+        [AjaxController::class, 'suggestRegions']
+    )->setName('suggestRegion');
+
     $app->get(
         '/telemetry/infos',
         [AjaxController::class, 'telemetryInfos']
index fbc34fed9ec4b7706ab24be6e112b52e95bc4f41..60f16f02f507b82581f8ed05d3c1cf9460e9b177 100644 (file)
@@ -17,6 +17,7 @@ CREATE TABLE galette_adherents (
   adresse_adh text NOT NULL,
   cp_adh varchar(10) NOT NULL default '',
   ville_adh varchar(200) NOT NULL default '',
+  region_adh varchar(200) NOT NULL default '',
   pays_adh varchar(200) default NULL,
   tel_adh varchar(50) default NULL,
   gsm_adh varchar(50) default NULL,
index 9a7ce24781e7f81413dc9165525b445489ec516c..a2e23cf6d2ac806bbefb1c19bb64df4a09425927 100644 (file)
@@ -204,6 +204,7 @@ CREATE TABLE galette_adherents (
     adresse_adh text DEFAULT '' NOT NULL,
     cp_adh character varying(10) DEFAULT '' NOT NULL,
     ville_adh character varying(200) DEFAULT '' NOT NULL,
+    region_adh character varying(200) DEFAULT '' NOT NULL,
     pays_adh character varying(200) DEFAULT NULL,
     tel_adh character varying(50),
     gsm_adh character varying(50),
index 87a1cec8755549452a34117b54217b4a3a1731cd..180d8767a7c422bb826f8dba2d4dd1a7c8792020 100644 (file)
@@ -1,2 +1,4 @@
 -- Add amount to payment types
 ALTER TABLE galette_types_cotisation ADD amount double NULL;
+-- Add region to members
+ALTER TABLE galette_adherents ADD region_adh varchar(200) NOT NULL DEFAULT '';
index 029d8a7303c97a753cd0b21b37fed61a8f6e7947..f5638f966d234e329f3f547d1022483fd75e2ea4 100644 (file)
@@ -1,2 +1,4 @@
 -- Add amount to payment types
 ALTER TABLE galette_types_cotisation ADD amount real DEFAULT '0';
+-- Add region to members
+ALTER TABLE galette_adherents ADD region_adh character varying(200) DEFAULT '' NOT NULL;
index 1aae4e5d10f4c8e00b997b6e4a0a110660f1f28f..087bd07e04f38f11de53fde8db927cbc31d9286f 100644 (file)
@@ -169,7 +169,7 @@ class AjaxController extends AbstractController
             }
         } catch (Throwable $e) {
             Analog::log(
-                'Something went wrong is towns suggestion: ' . $e->getMessage(),
+                'Something went wrong in towns suggestion: ' . $e->getMessage(),
                 Analog::WARNING
             );
             throw $e;
@@ -209,7 +209,47 @@ class AjaxController extends AbstractController
             }
         } catch (Throwable $e) {
             Analog::log(
-                'Something went wrong is countries suggestion: ' . $e->getMessage(),
+                'Something went wrong in countries suggestion: ' . $e->getMessage(),
+                Analog::WARNING
+            );
+            throw $e;
+        }
+
+        return $this->withJson($response, $ret);
+    }
+
+    /**
+     * Ajax regions suggestion
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     * @param string   $term     Search term
+     *
+     * @return Response
+     */
+    public function suggestRegions(Request $request, Response $response, string $term): Response
+    {
+        $ret = [];
+
+        try {
+            $select = $this->zdb->select(Adherent::TABLE);
+            $select->columns(['region_adh']);
+            $select->where->like('region_adh', '%' . html_entity_decode($term) . '%');
+            $select->limit(10);
+            $select->order(['region_adh ASC']);
+
+            $regions = $this->zdb->execute($select);
+
+            $ret['success'] = true;
+            $ret['results'] = [];
+            foreach ($regions as $region) {
+                $ret['results'][] = [
+                    'title' => $region->region_adh
+                ];
+            }
+        } catch (Throwable $e) {
+            Analog::log(
+                'Something went wrong in regions suggestion: ' . $e->getMessage(),
                 Analog::WARNING
             );
             throw $e;
index 6f0291980aad7d3f77aa0e2d20d885000694f151..097101f5d630cc59574f728e4223a7f582740dec 100644 (file)
@@ -44,7 +44,8 @@ use Galette\Repository\Members;
  * @property string $pref_adresse Address
  * @property string $pref_adresse2 Address continuation
  * @property string $pref_cp Association zipcode
- * @property string $pref_ville Association town
+ * @property string $pref_ville Association
+ * @property string $pref_region Region
  * @property string $pref_pays Country
  * @property integer $pref_postal_adress Postal adress to use, one of self::POSTAL_ADDRESS*
  * @property integer $pref_postal_staff_member Staff member ID from which retrieve postal address
@@ -186,6 +187,7 @@ class Preferences
         'pref_adresse2'        =>    '',
         'pref_cp'        =>    '',
         'pref_ville'        =>    '',
+        'pref_region'        =>    '',
         'pref_pays'        =>    '',
         'pref_postal_adress'  => self::POSTAL_ADDRESS_FROM_PREFS,
         'pref_postal_staff_member' => '',
index e01110cb7383694d4eddf8ec6d9800b066bebce0..910314deb0017a65fbbe1a073cad030244221484 100644 (file)
@@ -101,6 +101,7 @@ use Galette\Features\Dynamics;
  * @property Social $social Social networks/Contact
  * @property string $number Member number
  * @property-read bool $self_adh
+ * @property string $region
  */
 class Adherent
 {
@@ -171,6 +172,7 @@ class Adherent
     /** @var array<int,Social> */
     private array $_socials;
     private ?string $_number = null;
+    private ?string $_region = null;
 
     private string $_row_classes;
 
index 03f86e306458b459305990e4aad2bab0929b39de..7a1bb4e620fc718306d290efbac9f73fbf960739 100644 (file)
@@ -92,7 +92,7 @@
                         {% if entry.field_id == 'id_statut' %}
                             {% set template = "status.html.twig" %}
                         {% endif %}
-                        {% if entry.field_id == 'ville_adh' or entry.field_id == 'lieu_naissance' or entry.field_id == 'pays_adh' %}
+                        {% if entry.field_id == 'ville_adh' or entry.field_id == 'lieu_naissance' or entry.field_id == 'pays_adh' or entry.field_id == 'region_adh' %}
                             {% set template = "search.html.twig" %}
                         {% endif %}
 
index 594daf4d6e2e5cbec999f1228765a1af1fea019b..c56b45e7bad7d0365392eb226b20f7db56857110 100644 (file)
                     },
                     minCharacters : 2
                 });
+                $('#region_adh_field').search({
+                    apiSettings: {
+                        url: '{{ url_for('suggestRegion', {'term': '{query}'}) }}',
+                        method: 'post',
+                        onFailure: function(response, element, xhr) {
+                            console.log(response);
+                        },
+                        onError: function(errorMessage, element, xhr) {
+                            {% include "elements/js/modal.js.twig" with {
+                                modal_title_twig: _T("An error occurred :(")|e("js"),
+                                modal_content: "errorMessage",
+                                modal_class: "tiny",
+                                modal_content_class: "scrolling",
+                                modal_deny_only: true,
+                                modal_cancel_text: _T("Close")|e("js"),
+                                modal_classname: "redalert",
+                            } %}
+                            console.log(xhr);
+                        }
+                    },
+                    minCharacters : 2
+                });
     {% endif %}
 
             {% include "elements/js/calendar.js.twig" %}
index dda15846d97be3d67570715762b38f207061f673..cf88f90e5df4df3720778884c2e23422165628dc 100644 (file)
                         <label for="pref_ville">{{ _T("City:") }}</label>
                         <input type="text" name="pref_ville" id="pref_ville" value="{{ pref.pref_ville }}" maxlength="100"/>
                     </div>
+                    <div class="field">
+                        <label for="pref_region">{{ _T("Region:") }}</label>
+                        <input type="text" name="pref_region" id=pref_region" value="{{ pref.pref_region }}" maxlength="100"/>
+                    </div>
                     <div class="field">
                         <label for="pref_pays">{{ _T("Country:") }}</label>
                         <input type="text" name="pref_pays" id="pref_pays" value="{{ pref.pref_pays }}" maxlength="50"/>
index 167f9b2d34c2cbc50841294b4edd9651967c6d57..a5495ae0be67f7eca3d7327ca101c1836748b551 100644 (file)
@@ -156,7 +156,7 @@ class FieldsConfig extends TestCase
         $this->assertCount(3, $categorized);
         $this->assertCount(13, $categorized[\Galette\Entity\FieldsCategories::ADH_CATEGORY_IDENTITY]);
         $this->assertCount(11, $categorized[\Galette\Entity\FieldsCategories::ADH_CATEGORY_GALETTE]);
-        $this->assertCount(10, $categorized[\Galette\Entity\FieldsCategories::ADH_CATEGORY_CONTACT]);
+        $this->assertCount(11, $categorized[\Galette\Entity\FieldsCategories::ADH_CATEGORY_CONTACT]);
     }
 
     /**
@@ -361,7 +361,7 @@ class FieldsConfig extends TestCase
 
         $this->assertInstanceOf('\stdClass', $elements[1]);
         $this->assertSame(3, $elements[1]->id);
-        $this->assertCount(8, $elements[1]->elements);
+        $this->assertCount(9, $elements[1]->elements);
 
         $this->assertInstanceOf('\stdClass', $elements[2]);
         $this->assertSame(2, $elements[2]->id);
@@ -384,7 +384,7 @@ class FieldsConfig extends TestCase
 
         $this->assertInstanceOf('\stdClass', $elements[1]);
         $this->assertSame(3, $elements[1]->id);
-        $this->assertCount(8, $elements[1]->elements);
+        $this->assertCount(9, $elements[1]->elements);
 
         $this->assertInstanceOf('\stdClass', $elements[2]);
         $this->assertSame(2, $elements[2]->id);
@@ -421,7 +421,7 @@ class FieldsConfig extends TestCase
 
         $this->assertInstanceOf('\stdClass', $elements['fieldsets'][1]);
         $this->assertSame(3, $elements['fieldsets'][1]->id);
-        $this->assertCount(8, $elements['fieldsets'][1]->elements);
+        $this->assertCount(9, $elements['fieldsets'][1]->elements);
 
         $this->assertInstanceOf('\stdClass', $elements['fieldsets'][2]);
         $this->assertSame(2, $elements['fieldsets'][2]->id);
@@ -449,7 +449,7 @@ class FieldsConfig extends TestCase
 
         $this->assertInstanceOf('\stdClass', $elements['fieldsets'][1]);
         $this->assertSame(3, $elements['fieldsets'][1]->id);
-        $this->assertCount(8, $elements['fieldsets'][1]->elements);
+        $this->assertCount(9, $elements['fieldsets'][1]->elements);
 
         $mail = $elements['fieldsets'][1]->elements['email_adh'];
         $this->assertFalse($mail->required); //email is not required per default
@@ -484,7 +484,7 @@ class FieldsConfig extends TestCase
 
         $this->assertInstanceOf('\stdClass', $elements['fieldsets'][1]);
         $this->assertSame(3, $elements['fieldsets'][1]->id);
-        $this->assertCount(8, $elements['fieldsets'][1]->elements);
+        $this->assertCount(9, $elements['fieldsets'][1]->elements);
 
         $mail = $elements['fieldsets'][1]->elements['email_adh'];
         $this->assertTrue($mail->required); //email is required for self subscription
index 73d94712182ea9f65652b59cd1509a76590922f5..cf9792f114cc173932b3d44c2755df869b8b7de7 100644 (file)
@@ -183,9 +183,9 @@ class ListsConfig extends TestCase
         $town['visible'] = \Galette\Entity\FieldsConfig::NOBODY;
 
         //gsm
-        $gsm = $fields[\Galette\Entity\FieldsCategories::ADH_CATEGORY_CONTACT][5]; //6 in FieldsConfig but 5 here.
+        $gsm = $fields[\Galette\Entity\FieldsCategories::ADH_CATEGORY_CONTACT][6]; //5 in FieldsConfig but 6 here.
         $gsm['position'] = count($fields[1]);
-        unset($fields[\Galette\Entity\FieldsCategories::ADH_CATEGORY_CONTACT][5]); //6 in FieldsConfig but 5 here.
+        unset($fields[\Galette\Entity\FieldsCategories::ADH_CATEGORY_CONTACT][6]); //5 in FieldsConfig but 6 here.
         $gsm['category'] = \Galette\Entity\FieldsCategories::ADH_CATEGORY_IDENTITY;
         $fields[\Galette\Entity\FieldsCategories::ADH_CATEGORY_IDENTITY][] = $gsm;