diff --git a/lms/static/js/fixtures/instructor_dashboard/membership.html b/lms/static/js/fixtures/instructor_dashboard/membership.html
new file mode 100644
index 0000000000..058845c4e3
--- /dev/null
+++ b/lms/static/js/fixtures/instructor_dashboard/membership.html
@@ -0,0 +1,135 @@
+
+
Membership
+
+
+
Course Team Management
+
+
+
+
+
+
+
+
+
+
+
Staff
+
+
+ Course team members with the Staff role help you manage your course. Staff can enroll and unenroll learners,
+ as well as modify their grades and access all course data. Staff also have access to your course in Studio and
+ Insights. You can only give course team roles to enrolled users.
+
+
+
+
+
+
Username
+
Email
+
Revoke access
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Group Community TA
+
+
+ Group Community TAs are members of the community who help course teams moderate discussions. Group Community
+ TAs see only posts by learners in their assigned group. They can edit or delete posts, clear flags, close and
+ re-open threads, and endorse responses, but only for posts by learners in their group.
+
+
+
+
+
+
Username
+
Email
+
Group
+
Revoke access
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Discussion Community TA
+
+
+ Community TAs are members of the community who help course teams moderate discussions. They can see posts by
+ all learners, and can edit or delete posts, clear flags, close or re-open threads, and endorse responses.
+ Their posts are marked as 'Community TA'. Only enrolled users can be added as Community TAs.
+
+
+
+
+
+
Username
+
Email
+
Revoke access
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lms/static/js/instructor_dashboard/membership.js b/lms/static/js/instructor_dashboard/membership.js
index 12fc79240e..45870df249 100644
--- a/lms/static/js/instructor_dashboard/membership.js
+++ b/lms/static/js/instructor_dashboard/membership.js
@@ -8,11 +8,14 @@ wrap in (-> ... apply) to defer evaluation
such that the value can be defined later than this assignment (file load order).
*/
-
(function() {
'use strict';
- var AuthListWidget, BatchEnrollment, BetaTesterBulkAddition,
- MemberListWidget, Membership, emailStudents, plantTimeout, statusAjaxError, enableAddButton,
+ var AuthListWidget,
+ Membership,
+ BatchEnrollment,
+ BetaTesterBulkAddition,
+ MemberListWidget,
+ emailStudents, plantTimeout, statusAjaxError, enableAddButton,
/* eslint-disable */
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
@@ -223,7 +226,7 @@ such that the value can be defined later than this assignment (file load order).
AuthListWidget.prototype.get_member_list = function(cb) {
var authlistwidgetgetmemberlist = this;
- return $.ajax({
+ $.ajax({
type: 'POST',
dataType: 'json',
url: this.list_endpoint,
@@ -1004,7 +1007,6 @@ such that the value can be defined later than this assignment (file load order).
this.$list_selector.change(function() {
var $opt, j, len1, ref1;
$opt = thismembership.$list_selector.children('option:selected');
-
if (!($opt.length > 0)) {
return;
}
diff --git a/lms/static/js/spec/instructor_dashboard/membership_auth_spec.js b/lms/static/js/spec/instructor_dashboard/membership_auth_spec.js
new file mode 100644
index 0000000000..9da5b13ef8
--- /dev/null
+++ b/lms/static/js/spec/instructor_dashboard/membership_auth_spec.js
@@ -0,0 +1,97 @@
+/* global define, Membership */
+define(['jquery',
+ 'edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers',
+ 'js/instructor_dashboard/membership'],
+ function($, AjaxHelpers) {
+ 'use strict';
+ describe('Membership.AuthListWidget', function() {
+ var membership, // eslint-disable-line no-unused-vars
+ changeSelectedList;
+
+ changeSelectedList = function(listName) {
+ var i, options;
+ options = document.getElementById('member-lists-selector').options;
+ for (i = 0; i < options.length; i++) {
+ if (options[i].value === listName) {
+ document.getElementById('member-lists-selector').selectedIndex = i;
+ $('select#member-lists-selector').trigger('change');
+ break;
+ }
+ }
+ };
+
+ beforeEach(function() {
+ var membershipMain, membershipTpl;
+ membershipMain = readFixtures('js/fixtures/instructor_dashboard/membership.html');
+ membershipTpl = readFixtures(
+ 'templates/instructor/instructor_dashboard_2/membership-list-widget.underscore'
+ );
+ appendSetFixtures(
+ "' +
+ membershipMain
+ );
+ membership = new window.InstructorDashboard.sections.Membership($('#membership'));
+ });
+
+ it('binds the ajax call and the result will be success for Group Moderator', function() {
+ var requests = AjaxHelpers.requests(this),
+ data,
+ url = '/courses/course-v1:edx+ed202+2017_T3/instructor/api/list_forum_members';
+
+ data = {
+ course_id: 'course-v1:edx+ed202+2017_T3',
+ 'Group Moderator': [{
+ email: 'verified@example.com',
+ first_name: '',
+ group_name: 'Verified',
+ last_name: '',
+ username: 'verified'
+ }],
+ division_scheme: 'enrollment_track'
+ };
+ changeSelectedList('Group Moderator');
+
+ AjaxHelpers.expectPostRequest(requests, url, 'rolename=Group+Moderator');
+ AjaxHelpers.respondWithJson(requests, data);
+
+ expect($('.auth-list-container.active').data('rolename')).toEqual('Group Moderator');
+
+ expect($('.request-response-error').text()).toEqual('');
+
+ // Both buttons should be enabled
+ expect($('.auth-list-container.active .add').attr('disabled')).toBe(undefined);
+ expect($('.auth-list-container.active .add-field').attr('disabled')).toBe(undefined);
+ });
+
+ it('When no discussions division scheme is selected error is shown and inputs are disabled', function() {
+ var requests = AjaxHelpers.requests(this),
+ data,
+ url = '/courses/course-v1:edx+ed202+2017_T3/instructor/api/list_forum_members';
+
+ data = {
+ course_id: 'course-v1:edx+ed202+2017_T3',
+ 'Group Moderator': [{
+ email: 'verified@example.com',
+ first_name: '',
+ group_name: 'Verified',
+ last_name: '',
+ username: 'verified'
+ }],
+ division_scheme: 'none'
+ };
+ changeSelectedList('Group Moderator');
+
+ AjaxHelpers.expectPostRequest(requests, url, 'rolename=Group+Moderator');
+ AjaxHelpers.respondWithJson(requests, data);
+
+ expect($('.auth-list-container.active').data('rolename')).toEqual('Group Moderator');
+
+ // Error message is shown.
+ expect($('.request-response-error').text()).toEqual('This role requires a divided discussions scheme.');
+
+ // Both buttons should be disabled
+ expect($('.auth-list-container.active .add').attr('disabled')).toBe('disabled');
+ expect($('.auth-list-container.active .add-field').attr('disabled')).toBe('disabled');
+ });
+ });
+ });
diff --git a/lms/static/lms/js/spec/main.js b/lms/static/lms/js/spec/main.js
index 4395917af6..a139fdf294 100644
--- a/lms/static/lms/js/spec/main.js
+++ b/lms/static/lms/js/spec/main.js
@@ -306,6 +306,21 @@
exports: 'js/instructor_dashboard/certificates',
deps: ['jquery', 'gettext', 'underscore']
},
+ 'js/instructor_dashboard/membership': {
+ exports: 'js/instructor_dashboard/membership',
+ deps: ['jquery', 'underscore'],
+ init: function() {
+ // Set global variables that the util code is expecting to be defined
+ require([ // eslint-disable-line global-require
+ 'edx-ui-toolkit/js/utils/html-utils',
+ 'edx-ui-toolkit/js/utils/string-utils'
+ ], function(HtmlUtils, StringUtils) {
+ window.edx = window.edx || {};
+ window.edx.HtmlUtils = HtmlUtils;
+ window.edx.StringUtils = StringUtils;
+ });
+ }
+ },
// LMS class loaded explicitly until they are converted to use RequireJS
'js/student_account/account': {
exports: 'js/student_account/account',
@@ -341,6 +356,7 @@
exports: 'edx.instructor_dashboard.ecommerce.ExpiryCouponView',
deps: ['backbone', 'jquery', 'underscore']
},
+
'js/models/notification': {
exports: 'NotificationModel',
deps: ['backbone']
@@ -738,6 +754,7 @@
'js/spec/instructor_dashboard/certificates_invalidation_spec.js',
'js/spec/instructor_dashboard/certificates_spec.js',
'js/spec/instructor_dashboard/ecommerce_spec.js',
+ 'js/spec/instructor_dashboard/membership_auth_spec.js',
'js/spec/instructor_dashboard/student_admin_spec.js',
'js/spec/learner_dashboard/collection_list_view_spec.js',
'js/spec/learner_dashboard/program_card_view_spec.js',