Merge branch 'MDL-60874-34-enrolautocomplete' of git://github.com/mudrd8mz/moodle into MOODLE_34_STABLE

This commit is contained in:
Eloy Lafuente (stronk7)
2018-07-24 19:06:37 +02:00
6 changed files with 228 additions and 42 deletions
+1 -1
View File
@@ -1 +1 @@
define(["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function(b,c){var d=[];return a.each(c,function(a,b){d.push({value:b.id,label:b._label})}),d},transport:function(d,e,f,g){var h,i=a(d).attr("courseid");"undefined"==typeof i&&(i="1");var j=a(d).attr("enrolid");"undefined"==typeof j&&(j=""),h=b.call([{methodname:"core_enrol_get_potential_users",args:{courseid:i,enrolid:j,search:e,searchanywhere:!0,page:0,perpage:30}}]),h[0].then(function(b){var d=[],e=0;return a.each(b,function(b,e){var f=e,g=[];a.each(["idnumber","email","phone1","phone2","department","institution"],function(a,b){"undefined"!=typeof e[b]&&""!==e[b]&&(f.hasidentity=!0,g.push(e[b]))}),f.identity=g.join(", "),d.push(c.render("enrol_manual/form-user-selector-suggestion",f))}),a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b,function(a,b){b._label=c[e],e++}),f(b)})}).fail(g)}}});
define(["jquery","core/ajax","core/templates","core/str"],function(a,b,c,d){var e=100;return{processResults:function(b,c){var d=[];return a.isArray(c)?(a.each(c,function(a,b){d.push({value:b.id,label:b._label})}),d):c},transport:function(f,g,h,i){var j,k=a(f).attr("courseid");"undefined"==typeof k&&(k="1");var l=a(f).attr("enrolid");"undefined"==typeof l&&(l=""),j=b.call([{methodname:"core_enrol_get_potential_users",args:{courseid:k,enrolid:l,search:g,searchanywhere:!0,page:0,perpage:e+1}}]),j[0].then(function(b){var f=[],g=0;return b.length<=e?(a.each(b,function(b,d){var e=d,g=[];a.each(["idnumber","email","phone1","phone2","department","institution"],function(a,b){"undefined"!=typeof d[b]&&""!==d[b]&&(e.hasidentity=!0,g.push(d[b]))}),e.identity=g.join(", "),f.push(c.render("enrol_manual/form-user-selector-suggestion",e))}),a.when.apply(a.when,f).then(function(){var c=arguments;a.each(b,function(a,b){b._label=c[g],g++}),h(b)})):d.get_string("toomanyuserstoshow","core",">"+e).then(function(a){h(a)})}).fail(i)}}});
@@ -23,19 +23,27 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {
define(['jquery', 'core/ajax', 'core/templates', 'core/str'], function($, Ajax, Templates, Str) {
/** @var {Number} Maximum number of users to show. */
var MAXUSERS = 100;
return /** @alias module:enrol_manual/form-potential-user-selector */ {
processResults: function(selector, results) {
var users = [];
$.each(results, function(index, user) {
users.push({
value: user.id,
label: user._label
if ($.isArray(results)) {
$.each(results, function(index, user) {
users.push({
value: user.id,
label: user._label
});
});
});
return users;
return users;
} else {
return results;
}
},
transport: function(selector, query, success, failure) {
@@ -57,7 +65,7 @@ define(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {
search: query,
searchanywhere: true,
page: 0,
perpage: 30
perpage: MAXUSERS + 1
}
}]);
@@ -65,30 +73,38 @@ define(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {
var promises = [],
i = 0;
// Render the label.
$.each(results, function(index, user) {
var ctx = user,
identity = [];
$.each(['idnumber', 'email', 'phone1', 'phone2', 'department', 'institution'], function(i, k) {
if (typeof user[k] !== 'undefined' && user[k] !== '') {
ctx.hasidentity = true;
identity.push(user[k]);
}
});
ctx.identity = identity.join(', ');
promises.push(Templates.render('enrol_manual/form-user-selector-suggestion', ctx));
});
// Apply the label to the results.
return $.when.apply($.when, promises).then(function() {
var args = arguments;
if (results.length <= MAXUSERS) {
// Render the label.
$.each(results, function(index, user) {
user._label = args[i];
i++;
var ctx = user,
identity = [];
$.each(['idnumber', 'email', 'phone1', 'phone2', 'department', 'institution'], function(i, k) {
if (typeof user[k] !== 'undefined' && user[k] !== '') {
ctx.hasidentity = true;
identity.push(user[k]);
}
});
ctx.identity = identity.join(', ');
promises.push(Templates.render('enrol_manual/form-user-selector-suggestion', ctx));
});
success(results);
return;
});
// Apply the label to the results.
return $.when.apply($.when, promises).then(function() {
var args = arguments;
$.each(results, function(index, user) {
user._label = args[i];
i++;
});
success(results);
return;
});
} else {
return Str.get_string('toomanyuserstoshow', 'core', '>' + MAXUSERS).then(function(toomanyuserstoshow) {
success(toomanyuserstoshow);
return;
});
}
}).fail(failure);
}
@@ -0,0 +1,155 @@
@enrol @enrol_manual
Feature: Teacher can search and enrol users one by one into the course
In order to quickly enrol particular students into my course
As a teacher
I can search for the students and enrol them into the course
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| teacher001 | Teacher | 001 | teacher001@example.com |
| student001 | Student | 001 | student001@example.com |
| student002 | Student | 002 | student002@example.com |
| student003 | Student | 003 | student003@example.com |
| student004 | Student | 004 | student004@example.com |
| student005 | Student | 005 | student005@example.com |
| student006 | Student | 006 | student006@example.com |
| student007 | Student | 007 | student007@example.com |
| student008 | Student | 008 | student008@example.com |
| student009 | Student | 009 | student009@example.com |
| student010 | Student | 010 | student010@example.com |
| student011 | Student | 011 | student011@example.com |
| student012 | Student | 012 | student012@example.com |
| student013 | Student | 013 | student013@example.com |
| student014 | Student | 014 | student014@example.com |
| student015 | Student | 015 | student015@example.com |
| student016 | Student | 016 | student016@example.com |
| student017 | Student | 017 | student017@example.com |
| student018 | Student | 018 | student018@example.com |
| student019 | Student | 019 | student019@example.com |
| student020 | Student | 020 | student020@example.com |
| student021 | Student | 021 | student021@example.com |
| student022 | Student | 022 | student022@example.com |
| student023 | Student | 023 | student023@example.com |
| student024 | Student | 024 | student024@example.com |
| student025 | Student | 025 | student025@example.com |
| student026 | Student | 026 | student026@example.com |
| student027 | Student | 027 | student027@example.com |
| student028 | Student | 028 | student028@example.com |
| student029 | Student | 029 | student029@example.com |
| student030 | Student | 030 | student030@example.com |
| student031 | Student | 031 | student031@example.com |
| student032 | Student | 032 | student032@example.com |
| student033 | Student | 033 | student033@example.com |
| student034 | Student | 034 | student034@example.com |
| student035 | Student | 035 | student035@example.com |
| student036 | Student | 036 | student036@example.com |
| student037 | Student | 037 | student037@example.com |
| student038 | Student | 038 | student038@example.com |
| student039 | Student | 039 | student039@example.com |
| student040 | Student | 040 | student040@example.com |
| student041 | Student | 041 | student041@example.com |
| student042 | Student | 042 | student042@example.com |
| student043 | Student | 043 | student043@example.com |
| student044 | Student | 044 | student044@example.com |
| student045 | Student | 045 | student045@example.com |
| student046 | Student | 046 | student046@example.com |
| student047 | Student | 047 | student047@example.com |
| student048 | Student | 048 | student048@example.com |
| student049 | Student | 049 | student049@example.com |
| student050 | Student | 050 | student050@example.com |
| student051 | Student | 051 | student051@example.com |
| student052 | Student | 052 | student052@example.com |
| student053 | Student | 053 | student053@example.com |
| student054 | Student | 054 | student054@example.com |
| student055 | Student | 055 | student055@example.com |
| student056 | Student | 056 | student056@example.com |
| student057 | Student | 057 | student057@example.com |
| student058 | Student | 058 | student058@example.com |
| student059 | Student | 059 | student059@example.com |
| student060 | Student | 060 | student060@example.com |
| student061 | Student | 061 | student061@example.com |
| student062 | Student | 062 | student062@example.com |
| student063 | Student | 063 | student063@example.com |
| student064 | Student | 064 | student064@example.com |
| student065 | Student | 065 | student065@example.com |
| student066 | Student | 066 | student066@example.com |
| student067 | Student | 067 | student067@example.com |
| student068 | Student | 068 | student068@example.com |
| student069 | Student | 069 | student069@example.com |
| student070 | Student | 070 | student070@example.com |
| student071 | Student | 071 | student071@example.com |
| student072 | Student | 072 | student072@example.com |
| student073 | Student | 073 | student073@example.com |
| student074 | Student | 074 | student074@example.com |
| student075 | Student | 075 | student075@example.com |
| student076 | Student | 076 | student076@example.com |
| student077 | Student | 077 | student077@example.com |
| student078 | Student | 078 | student078@example.com |
| student079 | Student | 079 | student079@example.com |
| student080 | Student | 080 | student080@example.com |
| student081 | Student | 081 | student081@example.com |
| student082 | Student | 082 | student082@example.com |
| student083 | Student | 083 | student083@example.com |
| student084 | Student | 084 | student084@example.com |
| student085 | Student | 085 | student085@example.com |
| student086 | Student | 086 | student086@example.com |
| student087 | Student | 087 | student087@example.com |
| student088 | Student | 088 | student088@example.com |
| student089 | Student | 089 | student089@example.com |
| student090 | Student | 090 | student090@example.com |
| student091 | Student | 091 | student091@example.com |
| student092 | Student | 092 | student092@example.com |
| student093 | Student | 093 | student093@example.com |
| student094 | Student | 094 | student094@example.com |
| student095 | Student | 095 | student095@example.com |
| student096 | Student | 096 | student096@example.com |
| student097 | Student | 097 | student097@example.com |
| student098 | Student | 098 | student098@example.com |
| student099 | Student | 099 | student099@example.com |
And the following "courses" exist:
| fullname | shortname |
| Course 001 | C001 |
And the following "course enrolments" exist:
| user | course | role |
| teacher001 | C001 | editingteacher |
And I log in as "teacher001"
And I am on "Course 001" course homepage
@javascript
Scenario: Teacher can search and enrol one particular student
Given I navigate to course participants
And I press "Enrol users"
When I set the field "Select users" to "student001"
And I should see "Student 001"
And I click on "Enrol users" "button" in the "Enrol users" "dialogue"
Then I should see "Active" in the "Student 001" "table_row"
@javascript
Scenario: Searching for a non-existing user
Given I navigate to course participants
And I press "Enrol users"
And I set the field "Select users" to "qwertyuiop"
And I click on ".form-autocomplete-downarrow" "css_element" in the "Select users" "form_row"
Then I should see "No suggestions"
@javascript
Scenario: If there are less than 100 matching users, all are displayed for selection
Given I navigate to course participants
And I press "Enrol users"
When I set the field "Select users" to "example.com"
And I click on ".form-autocomplete-downarrow" "css_element" in the "Select users" "form_row"
And I click on "Student 099" item in the autocomplete list
Then I should see "Student 099"
@javascript
Scenario: If there are more than 100 matching users, inform there are too many.
Given the following "users" exist:
| username | firstname | lastname | email |
| student100 | Student | 100 | student100@example.com |
| student101 | Student | 101 | student101@example.com |
And I navigate to course participants
And I press "Enrol users"
When I set the field "Select users" to "example.com"
And I click on ".form-autocomplete-downarrow" "css_element" in the "Select users" "form_row"
Then I should see "Too many users (>100) to show"
File diff suppressed because one or more lines are too long
+19 -10
View File
@@ -349,7 +349,10 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
});
// If we found any matches, show the list.
inputElement.attr('aria-expanded', true);
if (matchingElements) {
if (originalSelect.attr('data-notice')) {
// Display a notice rather than actual suggestions.
suggestionsElement.html(originalSelect.attr('data-notice'));
} else if (matchingElements) {
// We only activate the first item in the list if tags is false,
// because otherwise "Enter" would select the first item, instead of
// creating a new tag.
@@ -506,15 +509,21 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
var option = $('<option>');
originalSelect.append(option);
}
// And add all the new ones returned from ajax.
$.each(processedResults, function(resultIndex, result) {
if (existingValues.indexOf(String(result.value)) === -1) {
var option = $('<option>');
option.append(result.label);
option.attr('value', result.value);
originalSelect.append(option);
}
});
if ($.isArray(processedResults)) {
// Add all the new ones returned from ajax.
$.each(processedResults, function(resultIndex, result) {
if (existingValues.indexOf(String(result.value)) === -1) {
var option = $('<option>');
option.append(result.label);
option.attr('value', result.value);
originalSelect.append(option);
}
});
originalSelect.attr('data-notice', '');
} else {
// The AJAX handler returned a string instead of the array.
originalSelect.attr('data-notice', processedResults);
}
// Update the list of suggestions now from the new values in the select list.
updateSuggestions(options, state, '', originalSelect);
M.util.js_complete(pendingKey);
+6
View File
@@ -1,6 +1,12 @@
This files describes API changes in core libraries and APIs,
information provided here is intended especially for developers.
=== 3.4.5 ===
* Custom AJAX handlers for the form autocomplete fields can now optionally return string in their processResults()
callback. If a string is returned, it is displayed instead of the list if suggested items. This can be used, for
example, to inform the user that there are too many items matching the current search criteria.
=== 3.4.3 ===
* There is a new privacy API that every subsystem and plugin has to implement so that the site can become GDPR