MDL-55941 output: Refactor and improve initialbar UX to use templates

This commit is contained in:
Ilya Tregubov
2017-03-24 20:31:03 +11:00
parent d2df110950
commit 8b844f702e
12 changed files with 858 additions and 195 deletions
+115
View 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.
*
+26
View 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.
*
+26 -33
View 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'));
echo html_writer::tag('strong', get_string('all'));
}
// 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::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() {
global $OUTPUT;
if ((!empty($this->prefs['i_last']) || !empty($this->prefs['i_first']) ||$this->use_initials)
&& isset($this->columns['fullname'])) {
&& isset($this->columns['fullname'])) {
$alpha = explode(',', get_string('alphabet', 'langconfig'));
// 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);
}
}
/**
+100
View File
@@ -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>
+380
View File
@@ -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"
+24 -30
View 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) {
+24 -30
View 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) {
+71 -4
View 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;
+31 -16
View 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;
a,
strong {
display: inline-block;
min-width: 1.4em;
text-align: center;
&.initialbarall {
li {
float: left;
width: 4em;
margin-bottom: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
list-style: none;
}
}
strong {
background: @linkColor;
color: @bodyBackground;
.letter {
display: inline-block;
height: 1.35em;
min-width: 1.35em;
text-align: center;
color: @linkColor;
background: @paginationBackground;
border-width: 1px;
border-color: @paginationBorder;
border-style: solid;
}
.letter:hover,
.letter.active {
color: white;
background-color: @linkColor;
}
}
/* Moodle Dialogue Settings (moodle-core-dialogue) */
.moodle-dialogue-base .moodle-dialogue-lightbox {
background-color: #aaa;
+48 -5
View 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
+2 -38
View 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';
+11 -39
View 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;');