]> git.agnieray.net Git - galette.git/commitdiff
Always display staff members first on public lists
authorJohan Cwiklinski <johan@x-tnd.be>
Fri, 29 Mar 2024 08:11:45 +0000 (09:11 +0100)
committerJohan Cwiklinski <johan@x-tnd.be>
Fri, 5 Apr 2024 19:24:49 +0000 (21:24 +0200)
closes #1809

galette/lib/Galette/Core/Galette.php
galette/lib/Galette/Repository/Members.php
galette/templates/default/pages/members_public_gallery.html.twig
galette/templates/default/pages/members_public_list.html.twig
tests/Galette/Repository/tests/units/Members.php

index da0b157206300477ed3332e5bc31393b87a39950..87e0476cd96a582ed984795d79d6015b1317e392 100644 (file)
@@ -23,6 +23,7 @@ namespace Galette\Core;
 
 use Analog\Analog;
 use Galette\Entity\Adherent;
+use Galette\Entity\Document;
 use Galette\Util\Release;
 use RuntimeException;
 
@@ -509,7 +510,7 @@ class Galette
             ];
 
             //display documents menu if at least one document is present with current ACLs
-            $document = new \Galette\Entity\Document($zdb);
+            $document = new Document($zdb);
             $documents = $document->getList();
             if ($login->isSuperAdmin() || count($documents)) {
                 $menus['public']['items'][] = [
@@ -621,7 +622,7 @@ class Galette
         }
 
         //display documents menu if at least one document is present with current ACLs
-        $document = new \Galette\Entity\Document($zdb);
+        $document = new Document($zdb);
         $documents = $document->getList();
         if ($login->isSuperAdmin() || count($documents)) {
             $dashboards = array_merge(
index 565d0fca7f3baa95bbae65742eed36a5d8793751..a8d87e19f4e9d3af29dfa580eb438a74cb0d58df 100644 (file)
@@ -103,7 +103,9 @@ class Members
     private MembersList|AdvancedMembersList $filters;
     private int $count = 0;
     /** @var array<string> */
-    private array $errors = array();
+    private array $errors = [];
+    /** @var string[] */
+    private array $extra_order = [];
 
     /**
      * Default constructor
@@ -442,13 +444,14 @@ class Members
      * @param boolean $with_photos get only members which have uploaded a
      *                             photo (for trombinoscope)
      *
-     * @return Adherent[]
+     * @return array<string, Adherent[]>
      */
     public function getPublicList(bool $with_photos)
     {
         global $zdb;
 
         try {
+            $this->extra_order = ['priorite_statut ASC'];
             $select = $this->buildSelect(
                 self::SHOW_PUBLIC_LIST,
                 null,
@@ -456,19 +459,37 @@ class Members
                 true
             );
 
+            $select->join(
+                array('status' => PREFIX_DB . Status::TABLE),
+                'a.' . Status::PK . '=status.' . Status::PK
+            );
+
             $this->filters->setLimits($select);
 
             $results = $zdb->execute($select);
-            $members = array();
             $deps = array(
                 'groups'    => false,
                 'dues'      => false,
                 'picture'   => $with_photos
             );
+
+            $status = new Status($zdb);
+            $status_list = $status->getCompleteList();
+
+            $staff = [];
+            $members = [];
             foreach ($results as $row) {
-                $members[] = new Adherent($zdb, $row, $deps);
+                $member = new Adherent($zdb, $row, $deps);
+                if ($status_list[$row->id_statut]['extra'] < self::NON_STAFF_MEMBERS) {
+                    $staff[] = $member;
+                } else {
+                    $members[] = $member;
+                }
             }
-            return $members;
+            return [
+                'staff'     => $staff,
+                'members'   => $members
+            ];
         } catch (Throwable $e) {
             Analog::log(
                 'Cannot list members with public information (photos: '
@@ -881,7 +902,7 @@ class Members
      */
     private function buildOrderClause(Select $select, ?array $fields = null): Select
     {
-        $order = array();
+        $order = $this->extra_order;
 
         switch ($this->filters->orderby) {
             case self::ORDERBY_NICKNAME:
index 02c4f1d8a87a06a8c84157334141d5c19f0f3d8b..b21587ef85fb32ba764b73aa9d72814fdd0991c3 100644 (file)
 {% set is_public = not login.isLogged() %}
 {% set list_type = 'cards' %}
 
+{% macro drawEntry(member, staff, time) %}
+    <div class="ui fluid card">
+        {% set mid = member.id %}
+        <div class="image">
+            <img
+                    src="{{ url_for("photo", {"id": member.id, "rand": time}) }}"
+                    width="{{ member.picture.getOptimalWidth() }}"
+                    height="{{ member.picture.getOptimalHeight() }}"
+                    alt="{{ member.sfullname }}{% if member.nickname != '' %} ({{ member.nickname|escape }}){% endif %}"
+            />
+        </div>
+        <div class="center aligned content">
+            <div class="header">{{ member.sfullname }}</div>
+            <a class="ui label">
+    {% if staff %}
+                <i class="ui user tie orange icon tooltip" aria-hidden="true"></i>
+    {% endif %}
+                {% if member.nickname != '' %}{{ member.nickname|escape }}{% endif %}
+    {% if staff %}
+                <div class="detail">{{ member.sstatus }}</div>
+    {% endif %}
+            </a>
+        </div>
+    </div>
+{% endmacro %}
+
 {% block infoline %}
     {% set infoline = {
         'label': _Tn("%count member", "%count members", nb_members)|replace({'%count': nb_members}),
 {% endblock %}
 
 {% block body %}
-    {% for member in members %}
-        <div class="ui fluid card">
-            {% set mid = member.id %}
-            <div class="image">
-                <img
-                    src="{{ url_for("photo", {"id": member.id, "rand": time}) }}"
-                    width="{{ member.picture.getOptimalWidth() }}"
-                    height="{{ member.picture.getOptimalHeight() }}"
-                    alt="{{ member.sfullname }}{% if member.nickname != '' %} ({{ member.nickname|escape }}){% endif %}"
-                    />
-            </div>
-            <div class="content">
-                <div class="center aligned header">{{ member.sfullname }}</div>
-                {% if member.nickname != '' %}<div class="center aligned meta">{{ member.nickname|escape }}</div>{% endif %}
-            </div>
-        </div>
+    {% if nb_members > 0 %}
+        {% for member in members.staff %}
+            {{ _self.drawEntry(member, true, time) }}
+        {% endfor %}
+        {% for member in members.members %}
+            {{ _self.drawEntry(member, false, time) }}
+        {% endfor %}
     {% else %}
         <div class="ui small message">
             <div class="content">
                 <em>{{ _T('No member') }}</em>
             </div>
         </div>
-    {% endfor %}
+    {% endif %}
 {% endblock %}
index a8e6792f49fc92398ff49d4eb9b6a8e501e5d9b7..039da015bde163a22343362e8b044e96c8d942bf 100644 (file)
 {% set no_action = true %}
 {% set is_public = not login.isLogged() %}
 
+{% macro drawEntry(member, staff) %}
+    {% set rclass = member.getRowClass() %}
+    <tr>
+        <td class="{{ rclass }} username_row" data-scope="row">
+            {% if member.isCompany() %}
+                <span>
+                        <i class="ui building outline icon tooltip" title="{{ _T('Is a company') }}" aria-hidden="true"></i>
+                        <span class="ui special popup">{{ _T('Is a company') }}</span>
+                    </span>
+            {%  elseif member.isMan() %}
+                <span>
+                        <i class="ui male icon tooltip" title="{{ _T('Is a man') }}" aria-hidden="true"></i>
+                        <span class="ui special popup">{{ _T('Is a man') }}</span>
+                    </span>
+            {%  elseif member.isWoman() %}
+                <span>
+                        <i class="ui female icon tooltip" title="{{ _T('Is a woman') }}" aria-hidden="true"></i>
+                        <span class="ui special popup">{{ _T('Is a woman') }}</span>
+                    </span>
+            {% else %}
+                <i class="ui icon" aria-hidden="true"></i>
+            {% endif %}
+            {% if member.website != '' %}
+                <a href="{{ member.website }}">{{ member.sfullname }}</a>
+            {% else %}
+                {{ member.sfullname }}
+            {% endif %}
+            {% if staff %}
+                <a class="ui label">
+                    <i class="ui user tie orange icon tooltip" aria-hidden="true"></i>
+                    {{ member.sstatus }}
+                </a>
+            {% endif %}
+        </td>
+        <td class="{{ rclass }}" data-col-label="{{ _T('Nickname') }}">{{ member.nickname|escape }}</td>
+        {% if login.isLogged() %}
+            <td class="{{ rclass }}" data-col-label="{{ _T('Email') }}"><a href="mailto:{{ member.email }}">{{ member.email }}</a></td>
+        {% endif %}
+        <td class="{{ rclass }}" data-col-label="{{ _T('Information') }}">{{ member.others_infos }}</td>
+    </tr>
+{% endmacro %}
+
 {% set form = {
     'order': {
         'name': 'publicList',
 {% endblock %}
 
 {% block body %}
-    {% for member in members %}
-        {% set rclass = member.getRowClass() %}
-        <tr>
-            <td class="{{ rclass }} username_row" data-scope="row">
-                {% if member.isCompany() %}
-                    <span>
-                        <i class="ui building outline icon tooltip" title="{{ _T('Is a company') }}" aria-hidden="true"></i>
-                        <span class="ui special popup">{{ _T('Is a company') }}</span>
-                    </span>
-                {%  elseif member.isMan() %}
-                    <span>
-                        <i class="ui male icon tooltip" title="{{ _T('Is a man') }}" aria-hidden="true"></i>
-                        <span class="ui special popup">{{ _T('Is a man') }}</span>
-                    </span>
-                {%  elseif member.isWoman() %}
-                    <span>
-                        <i class="ui female icon tooltip" title="{{ _T('Is a woman') }}" aria-hidden="true"></i>
-                        <span class="ui special popup">{{ _T('Is a woman') }}</span>
-                    </span>
-                {% else %}
-                    <i class="ui icon" aria-hidden="true"></i>
-                {% endif %}
-                {% if member.website != '' %}
-                    <a href="{{ member.website }}">{{ member.sfullname }}</a>
-                {% else %}
-                    {{ member.sfullname }}
-                {% endif %}
-            </td>
-            <td class="{{ rclass }}" data-col-label="{{ _T('Nickname') }}">{{ member.nickname|escape }}</td>
-            {% if login.isLogged() %}
-                <td class="{{ rclass }}" data-col-label="{{ _T('Email') }}"><a href="mailto:{{ member.email }}">{{ member.email }}</a></td>
-            {% endif %}
-            <td class="{{ rclass }}" data-col-label="{{ _T('Information') }}">{{ member.others_infos }}</td>
-        </tr>
+    {% if nb_members > 0 %}
+        {% for member in members.staff %}
+            {{ _self.drawEntry(member, true) }}
+        {% endfor %}
+
+        {% for member in members.members %}
+            {{ _self.drawEntry(member, false) }}
+        {% endfor %}
     {% else %}
         <tr>
             <td class="emptylist" colspan="4">
                 {{ _T('No member') }}
             </td>
         </tr>
-    {% endfor %}
+    {% endif %}
 {% endblock %}
index cd43c7623890d249c6a4e58f3cec687f517b87b4..6f325f719ae7f8e7a018442f7dda2cb4f752b2b9 100644 (file)
@@ -789,20 +789,30 @@ class Members extends GaletteTestCase
         $members = new \Galette\Repository\Members();
 
         $list = $members->getPublicList(false);
-        $this->assertCount(2, $list);
         $this->assertSame(2, $members->getCount());
+        $this->assertArrayHasKey('staff', $list);
+        $this->assertArrayHasKey('members', $list);
 
-        $adh = $list[0];
+        $staff = $list['staff'];
+        $list_members = $list['members'];
+        $this->assertCount(1, $staff);
+        $this->assertCount(1, $list_members);
+
+        $adh = $list_members[0];
 
         $this->assertInstanceOf(\Galette\Entity\Adherent::class, $adh);
         $this->assertTrue($adh->appearsInMembersList());
         $this->assertNull($adh->picture);
 
         $list = $members->getPublicList(true);
-        $this->assertCount(1, $list);
         $this->assertSame(1, $members->getCount());
 
-        $adh = $list[0];
+        $staff = $list['staff'];
+        $list_members = $list['members'];
+        $this->assertCount(1, $staff);
+        $this->assertCount(0, $list_members);
+
+        $adh = $staff[0];
 
         $this->assertInstanceOf(\Galette\Entity\Adherent::class, $adh);
         $this->assertTrue($adh->appearsInMembersList());