use Analog\Analog;
use Galette\Entity\Adherent;
+use Galette\Entity\Document;
use Galette\Util\Release;
use RuntimeException;
];
//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'][] = [
}
//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(
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
* @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,
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: '
*/
private function buildOrderClause(Select $select, ?array $fields = null): Select
{
- $order = array();
+ $order = $this->extra_order;
switch ($this->filters->orderby) {
case self::ORDERBY_NICKNAME:
{% 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 %}
{% 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 %}
$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());