MDL-55941 output: Refactor and improve initialbar UX to use templates
authorIlya Tregubov <ilya@catalyst-au.net>
Mon, 12 Dec 2016 01:17:59 +0000 (12:17 +1100)
committerIlya Tregubov <ilya@catalyst-au.net>
Fri, 24 Mar 2017 09:31:03 +0000 (20:31 +1100)
12 files changed:
lib/outputcomponents.php
lib/outputrenderers.php
lib/tablelib.php
lib/templates/initials_bar.mustache [new file with mode: 0644]
lib/tests/behat/alpha_chooser.feature [new file with mode: 0644]
report/completion/index.php
report/progress/index.php
theme/boost/scss/moodle/core.scss
theme/bootstrapbase/less/moodle/core.less
theme/bootstrapbase/style/moodle.css
user/index.php
user/renderer.php

index 30284ef..eb3da9c 100644 (file)
@@ -3061,6 +3061,121 @@ class paging_bar implements renderable, templatable {
     }
 }
 
+/**
+ * Component representing initials bar.
+ *
+ * @copyright 2017 Ilya Tregubov
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since Moodle 3.3
+ * @package core
+ * @category output
+ */
+class initials_bar implements renderable, templatable {
+
+    /**
+     * @var string Currently selected letter.
+     */
+    public $current;
+
+    /**
+     * @var string Class name to add to this initial bar.
+     */
+    public $class;
+
+    /**
+     * @var string The name to put in front of this initial bar.
+     */
+    public $title;
+
+    /**
+     * @var string URL parameter name for this initial.
+     */
+    public $urlvar;
+
+    /**
+     * @var string URL object.
+     */
+    public $url;
+
+    /**
+     * @var array An array of letters in the alphabet.
+     */
+    public $alpha;
+
+    /**
+     * Constructor initials_bar with only the required params.
+     *
+     * @param string $current the currently selected letter.
+     * @param string $class class name to add to this initial bar.
+     * @param string $title the name to put in front of this initial bar.
+     * @param string $urlvar URL parameter name for this initial.
+     * @param string $url URL object.
+     * @param array $alpha of letters in the alphabet.
+     */
+    public function __construct($current, $class, $title, $urlvar, $url, $alpha = null) {
+        $this->current       = $current;
+        $this->class    = $class;
+        $this->title    = $title;
+        $this->urlvar    = $urlvar;
+        $this->url    = $url;
+        $this->alpha    = $alpha;
+    }
+
+    /**
+     * Export for template.
+     *
+     * @param renderer_base $output The renderer.
+     * @return stdClass
+     */
+    public function export_for_template(renderer_base $output) {
+        $data = new stdClass();
+
+        if ($this->alpha == null) {
+            $this->alpha = explode(',', get_string('alphabet', 'langconfig'));
+        }
+
+        if ($this->current == 'all') {
+            $this->current = '';
+        }
+
+        // We want to find a letter grouping size which suits the language so
+        // find the largest group size which is less than 15 chars.
+        // The choice of 15 chars is the largest number of chars that reasonably
+        // fits on the smallest supported screen size. By always using a max number
+        // of groups which is a factor of 2, we always get nice wrapping, and the
+        // last row is always the shortest.
+        $groupsize = count($this->alpha);
+        $groups = 1;
+        while ($groupsize > 15) {
+            $groups *= 2;
+            $groupsize = ceil(count($this->alpha) / $groups);
+        }
+
+        $groupsizelimit = 0;
+        $groupnumber = 0;
+        foreach ($this->alpha as $letter) {
+            if ($groupsizelimit++ > 0 && $groupsizelimit % $groupsize == 1) {
+                $groupnumber++;
+            }
+            $groupletter = new stdClass();
+            $groupletter->name = $letter;
+            $groupletter->url = $this->url->out(false, array($this->urlvar => $letter));
+            if ($letter == $this->current) {
+                $groupletter->selected = $this->current;
+            }
+            $data->group[$groupnumber]->letter[] = $groupletter;
+        }
+
+        $data->class = $this->class;
+        $data->title = $this->title;
+        $data->url = $this->url->out(false, array($this->urlvar => ''));
+        $data->current = $this->current;
+        $data->all = get_string('all');
+
+        return $data;
+    }
+}
+
 /**
  * This class represents how a block appears on a page.
  *
index 22eaf1e..c57bb73 100644 (file)
@@ -2925,6 +2925,32 @@ EOD;
         return html_writer::tag('div', $output, array('class' => 'paging'));
     }
 
+    /**
+     * Returns HTML to display initials bar to provide access to other pages  (usually in a search)
+     *
+     * @param string $current the currently selected letter.
+     * @param string $class class name to add to this initial bar.
+     * @param string $title the name to put in front of this initial bar.
+     * @param string $urlvar URL parameter name for this initial.
+     * @param string $url URL object.
+     * @param array $alpha of letters in the alphabet.
+     * @return string the HTML to output.
+     */
+    public function initials_bar($current, $class, $title, $urlvar, $url, $alpha = null) {
+        $ib = new initials_bar($current, $class, $title, $urlvar, $url, $alpha);
+        return $this->render($ib);
+    }
+
+    /**
+     * Internal implementation of initials bar rendering.
+     *
+     * @param initials_bar $initialsbar
+     * @return string
+     */
+    protected function render_initials_bar(initials_bar $initialsbar) {
+        return $this->render_from_template('core/initials_bar', $initialsbar->export_for_template($this));
+    }
+
     /**
      * Output the place a skip link goes to.
      *
index 59c17a1..84d077b 100644 (file)
@@ -907,8 +907,12 @@ class flexible_table {
     /**
      * This function is not part of the public api.
      * @return string initial of first name we are currently filtering by
+     *
+     * @deprecated since Moodle 3.3
      */
     function get_initial_first() {
+        debugging('Method get_initial_first() is no longer used and has been deprecated, ' .
+            'to print initials bar call print_initials_bar()', DEBUG_DEVELOPER);
         if (!$this->use_initials) {
             return NULL;
         }
@@ -919,8 +923,12 @@ class flexible_table {
     /**
      * This function is not part of the public api.
      * @return string initial of last name we are currently filtering by
+     *
+     * @deprecated since Moodle 3.3
      */
     function get_initial_last() {
+        debugging('Method get_initial_last() is no longer used and has been deprecated, ' .
+            'to print initials bar call print_initials_bar()', DEBUG_DEVELOPER);
         if (!$this->use_initials) {
             return NULL;
         }
@@ -935,44 +943,29 @@ class flexible_table {
      * @param string $class class name to add to this initial bar.
      * @param string $title the name to put in front of this initial bar.
      * @param string $urlvar URL parameter name for this initial.
+     *
+     * @deprecated since Moodle 3.3
      */
     protected function print_one_initials_bar($alpha, $current, $class, $title, $urlvar) {
+
+        debugging('Method print_one_initials_bar() is no longer used and has been deprecated, ' .
+            'to print initials bar call print_initials_bar()', DEBUG_DEVELOPER);
+
         echo html_writer::start_tag('div', array('class' => 'initialbar ' . $class)) .
-                html_writer::tag('span', $title . ': ', array('class' => 'initialbarlabel'));
+            $title . ' : ';
         if ($current) {
-            echo html_writer::link($this->baseurl->out(false, array($urlvar => '')),
-                    get_string('all'), array('class' => 'initialbarall'));
+            echo html_writer::link($this->baseurl->out(false, array($urlvar => '')), get_string('all'));
         } else {
-            echo html_writer::tag('strong', get_string('all'), array('class' => 'initialbarall'));
-        }
-
-        // We want to find a letter grouping size which suits the language so
-        // find the largest group size which is less than 15 chars. By always
-        // using a max number of groups which is a factor of 2, we always get
-        // nice wrapping, and the last row is always the shortest.
-        $groupsize = count($alpha);
-        $groups = 1;
-        while ($groupsize > 15) {
-            $groups *= 2;
-            $groupsize = ceil(count($alpha) / $groups);
+            echo html_writer::tag('strong', get_string('all'));
         }
 
-        echo html_writer::start_tag('span', array('class' => 'initialbargroups'));
-        echo html_writer::start_tag('span', array('class' => 'initialbargroup'));
-        $c = 0;
         foreach ($alpha as $letter) {
-            if ($c++ > 0 && $c % $groupsize == 1) {
-                echo html_writer::end_tag('span') . ' ';
-                echo html_writer::start_tag('span', array('class' => 'initialbargroup'));
-            }
             if ($letter === $current) {
                 echo html_writer::tag('strong', $letter);
             } else {
                 echo html_writer::link($this->baseurl->out(false, array($urlvar => $letter)), $letter);
             }
         }
-        echo html_writer::end_tag('span');
-        echo html_writer::end_tag('span');
 
         echo html_writer::end_tag('div');
     }
@@ -981,29 +974,29 @@ class flexible_table {
      * This function is not part of the public api.
      */
     function print_initials_bar() {
-        if ((!empty($this->prefs['i_last']) || !empty($this->prefs['i_first']) ||$this->use_initials)
-                    && isset($this->columns['fullname'])) {
+        global $OUTPUT;
 
-            $alpha  = explode(',', get_string('alphabet', 'langconfig'));
+        if ((!empty($this->prefs['i_last']) || !empty($this->prefs['i_first']) ||$this->use_initials)
+            && isset($this->columns['fullname'])) {
 
-            // Bar of first initials
             if (!empty($this->prefs['i_first'])) {
                 $ifirst = $this->prefs['i_first'];
             } else {
                 $ifirst = '';
             }
-            $this->print_one_initials_bar($alpha, $ifirst, 'firstinitial',
-                    get_string('firstname'), $this->request[TABLE_VAR_IFIRST]);
 
-            // Bar of last initials
             if (!empty($this->prefs['i_last'])) {
                 $ilast = $this->prefs['i_last'];
             } else {
                 $ilast = '';
             }
-            $this->print_one_initials_bar($alpha, $ilast, 'lastinitial',
-                    get_string('lastname'), $this->request[TABLE_VAR_ILAST]);
+
+            $prefixfirst = $this->request[TABLE_VAR_IFIRST];
+            $prefixlast = $this->request[TABLE_VAR_ILAST];
+            echo $OUTPUT->initials_bar($ifirst, 'firstinitial', get_string('firstname'), $prefixfirst, $this->baseurl);
+            echo $OUTPUT->initials_bar($ilast, 'lastinitial', get_string('lastname'), $prefixlast, $this->baseurl);
         }
+
     }
 
     /**
diff --git a/lib/templates/initials_bar.mustache b/lib/templates/initials_bar.mustache
new file mode 100644 (file)
index 0000000..dcb7001
--- /dev/null
@@ -0,0 +1,100 @@
+{{!
+    This file is part of Moodle - http://moodle.org/
+
+    Moodle 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 3 of the License, or
+    (at your option) any later version.
+
+    Moodle 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 Moodle.  If not, see <http://www.gnu.org/licenses/>.
+}}
+{{!
+    @template core/initials_bar
+
+    Initials bar.
+
+    Example context (json):
+    {
+        "title": "First name",
+        "class": "firstinitial",
+        "current": "A",
+        "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst",
+        "all": "All",
+        "group": [
+           {
+              "letter": [
+                 {
+                    "name": "A",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=A"
+                 },
+                 {
+                    "name": "B",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=B"
+                 },
+                 {
+                    "name": "C",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=C"
+                 },
+                 {
+                    "name": "D",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=D"
+                 }
+
+              ]
+           },
+           {
+              "letter": [
+                 {
+                    "name": "W",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=W",
+                    "selected": "W"
+                 },
+                 {
+                    "name": "X",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=X"
+                 },
+                 {
+                    "name": "Y",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=Y"
+                 },
+                 {
+                    "name": "Z",
+                    "url": "http://moodle.generic32/report/progress/index.php?course=2&sifirst=Z"
+                 }
+
+              ]
+           }
+         ]
+    }
+}}
+<div class="initialbar {{class}}">
+    <span class="initialbarlabel">{{title}}</span>
+    {{#current}}
+        <a class="initialbarall letter" href="{{url}}">{{all}}</a>
+    {{/current}}
+    {{^current}}
+        <div class="initialbarall letter active">{{all}}</div>
+    {{/current}}
+
+    <div class="initialbargroups">
+        {{#group}}
+            <ul class="initialbargroup">
+                {{#letter}}
+                    {{#selected}}
+                        <li><span class="letter active {{name}}">{{name}}</span></li>
+                    {{/selected}}
+                    {{^selected}}
+                        <li><a class="letter {{name}}" href="{{url}}">{{name}}</a></li>
+                    {{/selected}}
+                {{/letter}}
+            </ul>
+        {{/group}}
+    </div>
+</div>
+
diff --git a/lib/tests/behat/alpha_chooser.feature b/lib/tests/behat/alpha_chooser.feature
new file mode 100644 (file)
index 0000000..f42a500
--- /dev/null
@@ -0,0 +1,380 @@
+@core
+Feature: Initials bar
+  In order to filter users from user list
+  As an admin
+  I need to be able to use letter filters
+
+  Background:
+    Given the following "users" exist:
+      | username  | firstname | lastname | email                 |
+      | teacher   | Ateacher  | Teacher  | teacher@example.com   |
+      | student1  | Astudent  | Astudent | student1@example.com  |
+      | student2  | Bstudent  | Astudent | student2@example.com  |
+      | student3  | Cstudent  | Cstudent | student3@example.com  |
+      | student4  | Cstudent  | Cstudent | student4@example.com  |
+      | student5  | Cstudent  | Cstudent | student5@example.com  |
+      | student6  | Cstudent  | Cstudent | student6@example.com  |
+      | student7  | Cstudent  | Cstudent | student7@example.com  |
+      | student8  | Cstudent  | Cstudent | student8@example.com  |
+      | student9  | Cstudent  | Cstudent | student9@example.com  |
+      | student10 | Cstudent  | Cstudent | student10@example.com |
+      | student11 | Cstudent  | Cstudent | student11@example.com |
+      | student12 | Cstudent  | Cstudent | student12@example.com |
+      | student13 | Cstudent  | Cstudent | student13@example.com |
+      | student14 | Cstudent  | Cstudent | student14@example.com |
+      | student15 | Cstudent  | Cstudent | student15@example.com |
+      | student16 | Cstudent  | Cstudent | student16@example.com |
+      | student17 | Cstudent  | Cstudent | student17@example.com |
+      | student18 | Cstudent  | Cstudent | student18@example.com |
+      | student19 | Cstudent  | Cstudent | student19@example.com |
+      | student20 | Cstudent  | Cstudent | student20@example.com |
+      | student21 | Cstudent  | Cstudent | student21@example.com |
+      | student22 | Cstudent  | Cstudent | student22@example.com |
+      | student23 | Cstudent  | Cstudent | student23@example.com |
+      | student24 | Cstudent  | Cstudent | student24@example.com |
+
+    And the following "courses" exist:
+      | fullname | shortname | category |enablecompletion |
+      | Course 1 | C1        | 0        | 1               |
+    And the following "course enrolments" exist:
+      | user      | course | role           |
+      | teacher   | C1     | editingteacher |
+      | student1  | C1     | student        |
+      | student2  | C1     | student        |
+      | student3  | C1     | student        |
+      | student4  | C1     | student        |
+      | student5  | C1     | student        |
+      | student6  | C1     | student        |
+      | student7  | C1     | student        |
+      | student8  | C1     | student        |
+      | student9  | C1     | student        |
+      | student10 | C1     | student        |
+      | student11 | C1     | student        |
+      | student12 | C1     | student        |
+      | student13 | C1     | student        |
+      | student14 | C1     | student        |
+      | student15 | C1     | student        |
+      | student16 | C1     | student        |
+      | student17 | C1     | student        |
+      | student18 | C1     | student        |
+      | student19 | C1     | student        |
+      | student20 | C1     | student        |
+      | student21 | C1     | student        |
+      | student22 | C1     | student        |
+      | student23 | C1     | student        |
+      | student24 | C1     | student        |
+
+  @javascript
+  Scenario: Filter users on assignment submission page
+    Given the following "activities" exist:
+      | activity | course | idnumber | name           | intro                       | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled |
+      | assign   | C1     | assign1  | TestAssignment | Test assignment description | 0                                   | 0                             |
+    And I log in as "teacher"
+    And I follow "Course 1"
+    And I follow "TestAssignment"
+    When I navigate to "View all submissions" in current page administration
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+    And I click on "A" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "B" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I am on homepage
+    And I follow "Course 1"
+    And I follow "TestAssignment"
+    When I navigate to "View all submissions" in current page administration
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+
+  @javascript
+  Scenario: Filter users on view gradebook page
+    Given the following "activities" exist:
+      | activity | course | idnumber | name           | intro                       | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled |
+      | assign   | C1     | assign1  | TestAssignment | Test assignment description | 0                                   | 0                             |
+    And I log in as "teacher"
+    And I follow "Course 1"
+    And I follow "TestAssignment"
+    When I navigate to "View all submissions" in current page administration
+    And I select "View gradebook" from the "jump" singleselect
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+    And I click on "A" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "B" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I am on homepage
+    And I follow "Course 1"
+    And I follow "TestAssignment"
+    When I navigate to "View all submissions" in current page administration
+    And I select "View gradebook" from the "jump" singleselect
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+
+  @javascript
+  Scenario: Filter users on course participants page
+    Given the following "activities" exist:
+      | activity | course | idnumber | name           | intro                       | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled |
+      | assign   | C1     | assign1  | TestAssignment | Test assignment description | 0                                   | 0                             |
+    And I log in as "teacher"
+    And I follow "Course 1"
+    And I follow "Participants"
+    And I select "Brief" from the "mode" singleselect
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+    And I click on "A" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "B" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I am on homepage
+    And I follow "Course 1"
+    And I follow "Participants"
+    And I select "Brief" from the "mode" singleselect
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+
+  @javascript
+  Scenario: Filter users on course participants page
+    Given the following "activities" exist:
+      | activity | course | idnumber | name           | intro                       | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled |
+      | assign   | C1     | assign1  | TestAssignment | Test assignment description | 0                                   | 0                             |
+    And I log in as "teacher"
+    And I follow "Course 1"
+    And I follow "Participants"
+    And I select "User details" from the "mode" singleselect
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+    And I click on "A" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "B" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I am on homepage
+    And I follow "Course 1"
+    And I follow "Participants"
+    And I select "User details" from the "mode" singleselect
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+
+  @javascript
+  Scenario: Filter users on activity completion page
+    Given the following "activities" exist:
+      | activity | course | idnumber | name           | intro                       | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled |
+      | assign   | C1     | assign1  | TestAssignment | Test assignment description | 0                                   | 0                             |
+    And I log in as "admin"
+    And I am on site homepage
+    And I follow "Course 1"
+    And I follow "TestAssignment"
+    And I navigate to "Edit settings" in current page administration
+    And I expand all fieldsets
+    And I set the field "Completion tracking" to "1"
+    And I click on "Save and return to course" "button"
+    And I navigate to "Course completion" in current page administration
+    And I expand all fieldsets
+    And I click on "Assignment - TestAssignment" "checkbox"
+    And I click on "Save changes" "button"
+    And I log out
+    And I log in as "teacher"
+    And I follow "Course 1"
+    And I navigate to "More..." in current page administration
+    And I follow "Activity completion"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
+    And I click on "A" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "B" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I am on homepage
+    And I follow "Course 1"
+    And I navigate to "More..." in current page administration
+    And I follow "Activity completion"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should not see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should not see "Cstudent Cstudent"
+    And I click on "All" "link" in the ".initialbar.lastinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.firstinitial" "css_element"
+    And ".initialbarall.letter.active" "css_element" should exist in the ".initialbar.lastinitial" "css_element"
+    And ".letter.active.B" "css_element" should not exist in the ".initialbar.firstinitial" "css_element"
+    And ".letter.active.A" "css_element" should not exist in the ".initialbar.lastinitial" "css_element"
+    And I should see "Astudent Astudent"
+    And I should see "Bstudent Astudent"
+    And I should see "Cstudent Cstudent"
index d4db15b..b4479b9 100644 (file)
@@ -160,6 +160,25 @@ if ($csv) {
     groups_print_course_menu($course, $CFG->wwwroot.'/report/completion/?course='.$course->id);
 }
 
+if ($sifirst !== 'all') {
+    set_user_preference('ifirst', $sifirst);
+}
+if ($silast !== 'all') {
+    set_user_preference('ilast', $silast);
+}
+
+if (!empty($USER->preference['ifirst'])) {
+    $sifirst = $USER->preference['ifirst'];
+} else {
+    $sifirst = 'all';
+}
+
+if (!empty($USER->preference['ilast'])) {
+    $silast = $USER->preference['ilast'];
+} else {
+    $silast = 'all';
+}
+
 // Generate where clause
 $where = array();
 $where_params = array();
@@ -209,38 +228,13 @@ if (strlen($sort)) {
 }
 $link .= '&amp;start=';
 
-// Build the the page by Initial bar
-$initials = array('first', 'last');
-$alphabet = explode(',', get_string('alphabet', 'langconfig'));
-
 $pagingbar = '';
-foreach ($initials as $initial) {
-    $var = 'si'.$initial;
 
-    $othervar = $initial == 'first' ? 'silast' : 'sifirst';
-    $othervar = $$othervar != 'all' ? "&amp;{$othervar}={$$othervar}" : '';
-
-    $pagingbar .= ' <div class="initialbar '.$initial.'initial">';
-    $pagingbar .= get_string($initial.'name').':&nbsp;';
-
-    if ($$var == 'all') {
-        $pagingbar .= '<strong>'.get_string('all').'</strong> ';
-    }
-    else {
-        $pagingbar .= "<a href=\"{$link}{$othervar}\">".get_string('all').'</a> ';
-    }
-
-    foreach ($alphabet as $letter) {
-        if ($$var === $letter) {
-            $pagingbar .= '<strong>'.$letter.'</strong> ';
-        }
-        else {
-            $pagingbar .= "<a href=\"$link&amp;$var={$letter}{$othervar}\">$letter</a> ";
-        }
-    }
-
-    $pagingbar .= '</div>';
-}
+// Initials bar.
+$prefixfirst = 'sifirst';
+$prefixlast = 'silast';
+$pagingbar .= $OUTPUT->initials_bar($sifirst, 'firstinitial', get_string('firstname'), $prefixfirst, $url);
+$pagingbar .= $OUTPUT->initials_bar($silast, 'lastinitial', get_string('lastname'), $prefixlast, $url);
 
 // Do we need a paging bar?
 if ($total > COMPLETION_REPORT_PAGE) {
index c97d4a6..2895e13 100644 (file)
@@ -94,6 +94,25 @@ $reportsurl = $CFG->wwwroot.'/course/report.php?id='.$course->id;
 $completion = new completion_info($course);
 $activities = $completion->get_activities();
 
+if ($sifirst !== 'all') {
+    set_user_preference('ifirst', $sifirst);
+}
+if ($silast !== 'all') {
+    set_user_preference('ilast', $silast);
+}
+
+if (!empty($USER->preference['ifirst'])) {
+    $sifirst = $USER->preference['ifirst'];
+} else {
+    $sifirst = 'all';
+}
+
+if (!empty($USER->preference['ilast'])) {
+    $silast = $USER->preference['ilast'];
+} else {
+    $silast = 'all';
+}
+
 // Generate where clause
 $where = array();
 $where_params = array();
@@ -179,38 +198,13 @@ if (strlen($sort)) {
 }
 $link .= '&amp;start=';
 
-// Build the the page by Initial bar
-$initials = array('first', 'last');
-$alphabet = explode(',', get_string('alphabet', 'langconfig'));
-
 $pagingbar = '';
-foreach ($initials as $initial) {
-    $var = 'si'.$initial;
 
-    $othervar = $initial == 'first' ? 'silast' : 'sifirst';
-    $othervar = $$othervar != 'all' ? "&amp;{$othervar}={$$othervar}" : '';
-
-    $pagingbar .= ' <div class="initialbar '.$initial.'initial">';
-    $pagingbar .= get_string($initial.'name').':&nbsp;';
-
-    if ($$var == 'all') {
-        $pagingbar .= '<strong>'.get_string('all').'</strong> ';
-    }
-    else {
-        $pagingbar .= "<a href=\"{$link}{$othervar}\">".get_string('all').'</a> ';
-    }
-
-    foreach ($alphabet as $letter) {
-        if ($$var === $letter) {
-            $pagingbar .= '<strong>'.$letter.'</strong> ';
-        }
-        else {
-            $pagingbar .= "<a href=\"$link&amp;$var={$letter}{$othervar}\">$letter</a> ";
-        }
-    }
-
-    $pagingbar .= '</div>';
-}
+// Initials bar.
+$prefixfirst = 'sifirst';
+$prefixlast = 'silast';
+$pagingbar .= $OUTPUT->initials_bar($sifirst, 'firstinitial', get_string('firstname'), $prefixfirst, $url);
+$pagingbar .= $OUTPUT->initials_bar($silast, 'lastinitial', get_string('lastname'), $prefixlast, $url);
 
 // Do we need a paging bar?
 if ($total > COMPLETION_REPORT_PAGE) {
index 9b929ec..c7a3be9 100644 (file)
@@ -1093,13 +1093,80 @@ body#page-lib-editor-tinymce-plugins-moodlemedia-preview {
 }
 
 .initialbar {
-    a,
-    strong {
-        padding-left: 3px;
-        padding-right: 3px;
+
+    overflow: auto;
+
+    .initialbarlabel {
+        display: inline-block;
+        width: 6em;
+        float: left;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+
+    .initialbarall {
+        float: left;
+        width: 4em;
+        margin-bottom: 2px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+
+    .initialbargroups {
+        float: left;
+    }
+
+    .initialbargroup {
+        float: left;
+        display: inline-block;
+        white-space: nowrap;
+        margin: 0;
+        padding: 0;
+
+        li {
+            float: left;
+            list-style: none;
+        }
+    }
+
+    .letter {
+        display: inline-block;
+        height: 1.5em;
+        min-width: 1.5em;
+        text-align: center;
+
+        color: $pagination-color;
+        border-width: $pagination-border-width;
+        border-color: $pagination-border-color;
+        border-style: solid;
+        background-color: $pagination-bg;
+    }
+    .letter:hover {
+        color: $pagination-hover-color;
+        border-color: $pagination-hover-border;
+        background-color: $pagination-hover-bg;
+    }
+
+    .letter.active {
+        color: $pagination-active-color;
+        border-color: $pagination-active-border;
+        background-color: $pagination-active-bg;
+    }
+
+}
+
+@media (max-width: 400px) {
+    .initialbar {
+        .letter {
+            /* This is chosen so that 23 letter at 320px just fits */
+            font-size: 11.5px;
+        }
     }
 }
 
+
 /* Moodle Dialogue Settings (moodle-core-dialogue)  */
 .moodle-dialogue-base .moodle-dialogue-lightbox {
     background-color: $gray;
index 9b4156c..a927e3c 100644 (file)
@@ -1266,6 +1266,7 @@ body#page-lib-editor-tinymce-plugins-moodlemedia-preview {
     white-space: nowrap;
     text-align: center;
 }
+
 .initialbar {
 
     overflow: auto;
@@ -1279,6 +1280,15 @@ body#page-lib-editor-tinymce-plugins-moodlemedia-preview {
         white-space: nowrap;
     }
 
+    .initialbarall {
+        float: left;
+        width: 4em;
+        margin-bottom: 2px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+
     .initialbargroups {
         float: left;
     }
@@ -1287,30 +1297,35 @@ body#page-lib-editor-tinymce-plugins-moodlemedia-preview {
         float: left;
         display: inline-block;
         white-space: nowrap;
+        margin: 0;
+        padding: 0;
+
+        li {
+            float: left;
+            list-style: none;
+        }
     }
 
-    a,
-    strong {
+    .letter {
         display: inline-block;
-        min-width: 1.4em;
+        height: 1.35em;
+        min-width: 1.35em;
         text-align: center;
 
-        &.initialbarall {
-            float: left;
-            width: 4em;
-            margin-bottom: 2px;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-        }
+        color: @linkColor;
+        background: @paginationBackground;
+        border-width: 1px;
+        border-color: @paginationBorder;
+        border-style: solid;
     }
-
-    strong {
-        background: @linkColor;
-        color: @bodyBackground;
+    .letter:hover,
+    .letter.active {
+        color: white;
+        background-color: @linkColor;
     }
 
 }
+
 /* Moodle Dialogue Settings (moodle-core-dialogue)  */
 .moodle-dialogue-base .moodle-dialogue-lightbox {
     background-color: #aaa;
index b4a44b0..719e704 100644 (file)
@@ -3610,10 +3610,54 @@ body#page-lib-editor-tinymce-plugins-moodlemedia-preview {
   white-space: nowrap;
   text-align: center;
 }
-.initialbar a,
-.initialbar strong {
-  padding-left: 3px;
-  padding-right: 3px;
+.initialbar {
+  overflow: auto;
+}
+.initialbar .initialbarlabel {
+  display: inline-block;
+  width: 6em;
+  float: left;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.initialbar .initialbarall {
+  float: left;
+  width: 4em;
+  margin-bottom: 2px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.initialbar .initialbargroups {
+  float: left;
+}
+.initialbar .initialbargroup {
+  float: left;
+  display: inline-block;
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+.initialbar .initialbargroup li {
+  float: left;
+  list-style: none;
+}
+.initialbar .letter {
+  display: inline-block;
+  height: 1.35em;
+  min-width: 1.35em;
+  text-align: center;
+  color: #0070a8;
+  background: #fff;
+  border-width: 1px;
+  border-color: #ddd;
+  border-style: solid;
+}
+.initialbar .letter:hover,
+.initialbar .letter.active {
+  color: white;
+  background-color: #0070a8;
 }
 /* Moodle Dialogue Settings (moodle-core-dialogue)  */
 .moodle-dialogue-base .moodle-dialogue-lightbox {
@@ -10290,7 +10334,6 @@ body.path-question-type .mform fieldset.hidden {
   }
 }
 /*!
-
  * Bootstrap v2.3.2
  *
  * Copyright 2013 Twitter, Inc
index 168ea2d..3a388a1 100644 (file)
@@ -567,44 +567,8 @@ if ($mode === MODE_USERDETAILS) {    // Print simple listing.
     } else {
         if ($totalcount > $perpage) {
 
-            $firstinitial = $table->get_initial_first();
-            $lastinitial  = $table->get_initial_last();
-            $strall = get_string('all');
-            $alpha  = explode(',', get_string('alphabet', 'langconfig'));
-
-            // Bar of first initials.
-
-            echo '<div class="initialbar firstinitial">'.get_string('firstname').' : ';
-            if (!empty($firstinitial)) {
-                echo '<a href="'.$baseurl->out().'&amp;sifirst=">'.$strall.'</a>';
-            } else {
-                echo '<strong>'.$strall.'</strong>';
-            }
-            foreach ($alpha as $letter) {
-                if ($letter == $firstinitial) {
-                    echo ' <strong>'.$letter.'</strong>';
-                } else {
-                    echo ' <a href="'.$baseurl->out().'&amp;sifirst='.$letter.'">'.$letter.'</a>';
-                }
-            }
-            echo '</div>';
-
-            // Bar of last initials.
-
-            echo '<div class="initialbar lastinitial">'.get_string('lastname').' : ';
-            if (!empty($lastinitial)) {
-                echo '<a href="'.$baseurl->out().'&amp;silast=">'.$strall.'</a>';
-            } else {
-                echo '<strong>'.$strall.'</strong>';
-            }
-            foreach ($alpha as $letter) {
-                if ($letter == $lastinitial) {
-                    echo ' <strong>'.$letter.'</strong>';
-                } else {
-                    echo ' <a href="'.$baseurl->out().'&amp;silast='.$letter.'">'.$letter.'</a>';
-                }
-            }
-            echo '</div>';
+            // Initials bar.
+            $table->print_initials_bar();
 
             $pagingbar = new paging_bar($matchcount, intval($table->get_page_start() / $perpage), $perpage, $baseurl);
             $pagingbar->pagevar = 'spage';
index c12f579..2f384fc 100644 (file)
@@ -106,8 +106,12 @@ class core_user_renderer extends plugin_renderer_base {
     public function user_search($url, $firstinitial, $lastinitial, $usercount, $totalcount, $heading = null) {
         global $OUTPUT;
 
-        $strall = get_string('all');
-        $alpha  = explode(',', get_string('alphabet', 'langconfig'));
+        if ($firstinitial !== 'all') {
+            set_user_preference('ifirst', $firstinitial);
+        }
+        if ($lastinitial !== 'all') {
+            set_user_preference('ilast', $lastinitial);
+        }
 
         if (!isset($heading)) {
             $heading = get_string('allparticipants');
@@ -119,43 +123,11 @@ class core_user_renderer extends plugin_renderer_base {
         // Search utility heading.
         $content .= $OUTPUT->heading($heading.get_string('labelsep', 'langconfig').$usercount.'/'.$totalcount, 3);
 
-        // Bar of first initials.
-        $content .= html_writer::start_tag('div', array('class' => 'initialbar firstinitial'));
-        $content .= html_writer::label(get_string('firstname').' : ', null);
-
-        if (!empty($firstinitial)) {
-            $content .= html_writer::link($url.'&sifirst=', $strall);
-        } else {
-            $content .= html_writer::tag('strong', $strall);
-        }
-
-        foreach ($alpha as $letter) {
-            if ($letter == $firstinitial) {
-                $content .= html_writer::tag('strong', $letter);
-            } else {
-                $content .= html_writer::link($url.'&sifirst='.$letter, $letter);
-            }
-        }
-        $content .= html_writer::end_tag('div');
-
-         // Bar of last initials.
-        $content .= html_writer::start_tag('div', array('class' => 'initialbar lastinitial'));
-        $content .= html_writer::label(get_string('lastname').' : ', null);
-
-        if (!empty($lastinitial)) {
-            $content .= html_writer::link($url.'&silast=', $strall);
-        } else {
-            $content .= html_writer::tag('strong', $strall);
-        }
-
-        foreach ($alpha as $letter) {
-            if ($letter == $lastinitial) {
-                $content .= html_writer::tag('strong', $letter);
-            } else {
-                $content .= html_writer::link($url.'&silast='.$letter, $letter);
-            }
-        }
-        $content .= html_writer::end_tag('div');
+        // Initials bar.
+        $prefixfirst = 'sifirst';
+        $prefixlast = 'silast';
+        $content .= $OUTPUT->initials_bar($firstinitial, 'firstinitial', get_string('firstname'), $prefixfirst, $url);
+        $content .= $OUTPUT->initials_bar($lastinitial, 'lastinitial', get_string('lastname'), $prefixlast, $url);
 
         $content .= html_writer::end_tag('div');
         $content .= html_writer::tag('div', '&nbsp;');