Parcourir la source

V8-3296 - sort instruments alphabetically

Olivier Massot il y a 3 ans
Parent
commit
e9c5831abc

+ 8 - 2
ot_templating/Classes/ViewHelpers/Members/GetAllCaViewHelper.php

@@ -139,8 +139,14 @@ class GetAllCaViewHelper extends OtAbstractViewHelper {
                 }
             }
 
-            // Remove empty sections
-            $members = array_filter($membersByMission);
+            // Remove empty sections and translate
+            $members = [];
+            foreach ($membersByMission as $mission => $groupMembers) {
+                if (!$groupMembers) {
+                    continue;
+                }
+                $members[ucfirst($this->translate($mission))] = $groupMembers;
+            }
         }
 
         $variables = [$as => $members];

+ 79 - 49
ot_templating/Classes/ViewHelpers/Members/GetAllViewHelper.php

@@ -78,74 +78,104 @@ class GetAllViewHelper extends OtAbstractViewHelper {
         $organizationId = $this->arguments['organizationId'];
         $groupByInstruments = $this->arguments['groupByInstruments'];
 
-        try {
-            // Get members of the structure
-            $collection = $this->memberRepository->findByOrganizationId($organizationId);
-            $members = $collection->getMembers();
-        } catch (ApiRequestException $e) {
-            OtLogger::error(sprintf('API Error: %s', $e->getMessage()));
-            $members = [];
+        if ($groupByInstruments) {
+            $members = $this->getMembersAsGroups($organizationId);
+        } else {
+            $members = $this->getMembersAsSimpleList($organizationId);
         }
 
-        // Sort by instrument (conductor first), then alphabetically by name
-        usort($members,
-            static function($a, $b) {
-                if ($a->getInstrument() === 'CONDUCTOR') {
-                    return -1;
-                }
+        $variables = [$as => $members];
+        return $this->renderChildrenWithVariables($variables);
+    }
 
-                if ($b->getInstrument() === 'CONDUCTOR') {
-                    return 1;
-                }
+    /**
+     * Return the organization members as a simple array, sorted by name
+     *
+     * @param int $organizationId
+     * @return array
+     */
+    private function getMembersAsSimpleList(int $organizationId): array
+    {
+        $members = $this->getMembers($organizationId);
+        usort(
+            $members,
+            static function ($m1, $m2) { return strcmp($m1->getName(), $m2->getName()); }
+        );
+        return $members;
+    }
 
-                if ($a->getInstrument() !== $b->getInstrument()) {
-                    return strcmp($a->getInstrument(), $b->getInstrument());
-                }
+    /**
+     * Return the organization members as an array of the form :
+     *   [
+     *      'Instrument 1' => [Member1, Member2, ...],
+     *      'Instrument 2' => [Member3, ...],
+     *   ]
+     *
+     * Instruments keys are translated and sorted alphabetically, except for CONDUCTOR which shall appear first
+     * Group members are sorted by name
+     *
+     * @param int $organizationId
+     * @return array
+     */
+    private function getMembersAsGroups(int $organizationId): array
+    {
+        $members = $this->getMembers($organizationId);
 
-                if ($a->getName() !== $b->getName()) {
-                    return strcmp($a->getName(), $b->getName());
-                }
+        $stack = ['CONDUCTOR' => []];
+        $conductors = [];
 
-                return 0;
+        foreach ($members as $member) {
+            if ($member->getInstrument() === 'CONDUCTOR') {
+                $conductors[] = $member;
+                continue;
             }
-        );
 
-        if ($groupByInstruments && !empty($members)) {
-
-            // Instruments to display in first place (next will be sorted alphabetically)
-            $stack1 = ['CONDUCTOR' => []];
-
-            $stack2 = [];
-            foreach ($members as $member) {
-                // If that Instrument exist in stack1: put it in this one
-                if (array_key_exists($member->getInstrument(), $stack1)) {
-                    $stack1[$member->getInstrument()][] = $member;
-                } else {
-                    // Create the new array if needed in stack2, then put the member in it
-                    if (!array_key_exists($member->getInstrument(), $stack2)) {
-                        $stack2[$member->getInstrument()] = [];
-                    }
-                    $stack2[$member->getInstrument()][] = $member;
-                }
+            $instrument = ucfirst($this->translate($member->getInstrument()));
+            if (!array_key_exists($instrument, $stack)) {
+                $stack[$instrument] = [$member];
+                continue;
             }
 
-            // remove empty instruments in stack 1
-            $stack1 = array_filter($stack1);
+            $stack[$instrument][] = $member;
+        }
+
+        // remove empty instruments in stack 1
+        $stack = array_filter($stack);
 
-            // sort by instrument stack2
-            ksort($stack2);
+        // sort by instrument stack2
+        ksort($stack);
 
-            $members = array_merge($stack1, $stack2);
+        // sort groups by name
+        foreach (array_values($stack) as $group) {
+            usort(
+                $group,
+                static function ($m1, $m2) { return strcmp($m1->getName(), $m2->getName()); }
+            );
         }
 
-        $variables = [$as => $members];
-        return $this->renderChildrenWithVariables($variables);
+        // Add the conductors in first pos
+        if ($conductors) {
+            $stack = [ucfirst($this->translate('CONDUCTOR')) => $conductors] + $stack;
+        }
+
+        return $stack;
+    }
+
+    private function getMembers(int $organizationId): array
+    {
+        try {
+            // Get members of the structure
+            return $this->memberRepository->findByOrganizationId($organizationId)->getMembers();
+        } catch (ApiRequestException $e) {
+            OtLogger::error(sprintf('API Error: %s', $e->getMessage()));
+            return [];
+        }
     }
 
     /**
      * @param MemberRepository $memberRepository
      */
-    public function injectMemberRepository(MemberRepository $memberRepository)
+    public function injectMemberRepository(MemberRepository $memberRepository): void
     {
         $this->memberRepository = $memberRepository;
     }

+ 3 - 0
ot_templating/Resources/Private/Language/locallang.xlf

@@ -512,6 +512,9 @@
 			<trans-unit id="MEMBER_OF_BOARD_OF_HONOR" xml:space="preserve">
 			    <source>Membre d'Honneur du CA</source>
 			</trans-unit>
+			<trans-unit id="ACTIVE_COOPTED_BOARD_MEMBER" xml:space="preserve">
+			    <source>Membre du bureau coopté</source>
+			</trans-unit>
 			<trans-unit id="HONORARY_MEMBER" xml:space="preserve">
 			    <source>Membre d'Honneur</source>
 			</trans-unit>

+ 1 - 1
ot_templating/Resources/Private/Partials/Classic/MembersList.html

@@ -4,7 +4,7 @@
     <f:then>
         <f:for each="{members}" as="members" key="category">
             <h3>
-                <f:format.case value="{f:translate(key: category)}" mode="upper"/>
+                {category}
             </h3>
             <ul class="ot-members-list">
                 <f:for each="{members}" as="member">

+ 1 - 1
ot_templating/Resources/Private/Partials/Modern/MembersList.html

@@ -4,7 +4,7 @@
     <f:then>
         <f:for each="{members}" as="members" key="category">
             <h3>
-                <f:format.case value="{f:translate(key: category)}" mode="upper"/>
+                {category}
             </h3>
             <ul class="ot-members-list">
                 <f:for each="{members}" as="member">