Files
edx-platform/lms/static/js/instructor_dashboard/send_email.js
2017-01-13 11:27:23 -05:00

265 lines
12 KiB
JavaScript

/* globals _, SendEmail */
(function() {
'use strict';
var KeywordValidator, PendingInstructorTasks,
createEmailContentTable, createEmailMessageViews, createTaskListTable,
plantTimeout, statusAjaxError;
plantTimeout = function() {
return window.InstructorDashboard.util.plantTimeout.apply(this, arguments);
};
statusAjaxError = function() {
return window.InstructorDashboard.util.statusAjaxError.apply(this, arguments);
};
PendingInstructorTasks = function() {
return window.InstructorDashboard.util.PendingInstructorTasks;
};
createTaskListTable = function() {
return window.InstructorDashboard.util.createTaskListTable.apply(this, arguments);
};
createEmailContentTable = function() {
return window.InstructorDashboard.util.createEmailContentTable.apply(this, arguments);
};
createEmailMessageViews = function() {
return window.InstructorDashboard.util.createEmailMessageViews.apply(this, arguments);
};
KeywordValidator = function() {
return window.InstructorDashboard.util.KeywordValidator;
};
this.SendEmail = (function() {
function SendEmail($container) {
var sendemail = this;
this.$container = $container;
this.$emailEditor = XBlock.initializeBlock($('.xblock-studio_view'));
this.$send_to = this.$container.find("input[name='send_to']");
this.$cohort_targets = this.$send_to.filter('[value^="cohort:"]');
this.$course_mode_targets = this.$send_to.filter('[value^="track:"]');
this.$subject = this.$container.find("input[name='subject']");
this.$btn_send = this.$container.find("input[name='send']");
this.$task_response = this.$container.find('.request-response');
this.$request_response_error = this.$container.find('.request-response-error');
this.$content_request_response_error = this.$container.find('.content-request-response-error');
this.$history_request_response_error = this.$container.find('.history-request-response-error');
this.$btn_task_history_email = this.$container.find("input[name='task-history-email']");
this.$btn_task_history_email_content = this.$container.find("input[name='task-history-email-content']");
this.$table_task_history_email = this.$container.find('.task-history-email-table');
this.$table_email_content_history = this.$container.find('.content-history-email-table');
this.$email_content_table_inner = this.$container.find('.content-history-table-inner');
this.$email_messages_wrapper = this.$container.find('.email-messages-wrapper');
this.$btn_send.click(function() {
var body, confirmMessage, displayTarget, fullConfirmMessage, message,
sendData, subject, successMessage, target, targets, validation, i, len;
subject = sendemail.$subject.val();
body = sendemail.$emailEditor.save().data;
targets = [];
sendemail.$send_to.filter(':checked').each(function() {
return targets.push(this.value);
});
if (subject === '') {
return alert(gettext('Your message must have a subject.')); // eslint-disable-line no-alert
} else if (body === '') {
return alert(gettext('Your message cannot be blank.')); // eslint-disable-line no-alert
} else if (targets.length === 0) {
return alert(gettext( // eslint-disable-line no-alert
'Your message must have at least one target.'));
} else {
validation = KeywordValidator().validate_string(body);
if (!validation.isValid) {
message = gettext(
'There are invalid keywords in your email. Check the following keywords and try again.');
message += '\n' + validation.invalidKeywords.join('\n');
alert(message); // eslint-disable-line no-alert
return false;
}
displayTarget = function(value) {
if (value === 'myself') {
return gettext('Yourself');
} else if (value === 'staff') {
return gettext('Everyone who has staff privileges in this course');
} else if (value === 'learners') {
return gettext('All learners who are enrolled in this course');
} else if (value.startsWith('cohort')) {
return gettext('All learners in the {cohort_name} cohort')
.replace('{cohort_name}', value.slice(value.indexOf(':') + 1));
} else if (value.startsWith('track')) {
return gettext('All learners in the {track_name} track')
.replace('{track_name}', value.slice(value.indexOf(':') + 1));
}
};
successMessage = gettext('Your email message was successfully queued for sending. In courses with a large number of learners, email messages to learners might take up to an hour to be sent.'); // eslint-disable-line max-len
confirmMessage = gettext(
'You are sending an email message with the subject {subject} to the following recipients.');
for (i = 0, len = targets.length; i < len; i++) {
target = targets[i];
confirmMessage += '\n-' + displayTarget(target);
}
confirmMessage += '\n\n' + gettext('Is this OK?');
fullConfirmMessage = confirmMessage.replace('{subject}', subject);
if (confirm(fullConfirmMessage)) { // eslint-disable-line no-alert
sendData = {
action: 'send',
send_to: JSON.stringify(targets),
subject: subject,
message: body
};
return $.ajax({
type: 'POST',
dataType: 'json',
url: sendemail.$btn_send.data('endpoint'),
data: sendData,
success: function() {
return sendemail.display_response(successMessage);
},
error: statusAjaxError(function() {
return sendemail.fail_with_error(gettext('Error sending email.'));
})
});
} else {
sendemail.task_response.empty();
return sendemail.$request_response_error.empty();
}
}
});
this.$btn_task_history_email.click(function() {
var url = sendemail.$btn_task_history_email.data('endpoint');
return $.ajax({
type: 'POST',
dataType: 'json',
url: url,
success: function(data) {
if (data.tasks.length) {
return createTaskListTable(sendemail.$table_task_history_email, data.tasks);
} else {
sendemail.$history_request_response_error.text(
gettext('There is no email history for this course.')
);
return sendemail.$history_request_response_error.css({
display: 'block'
});
}
},
error: statusAjaxError(function() {
return sendemail.$history_request_response_error.text(
gettext('There was an error obtaining email task history for this course.')
);
})
});
});
this.$btn_task_history_email_content.click(function() {
var url = sendemail.$btn_task_history_email_content.data('endpoint');
return $.ajax({
type: 'POST',
dataType: 'json',
url: url,
success: function(data) {
if (data.emails.length) {
createEmailContentTable(sendemail.$table_email_content_history,
sendemail.$email_content_table_inner, data.emails
);
return createEmailMessageViews(sendemail.$email_messages_wrapper, data.emails);
} else {
sendemail.$content_request_response_error.text(
gettext('There is no email history for this course.')
);
return sendemail.$content_request_response_error.css({
display: 'block'
});
}
},
error: statusAjaxError(function() {
return sendemail.$content_request_response_error.text(
gettext('There was an error obtaining email content history for this course.')
);
})
});
});
this.$send_to.change(function() {
var targets;
var inputDisable = function() {
this.checked = false;
this.disabled = true;
return true;
};
var inputEnable = function() {
this.disabled = false;
return true;
};
if ($('input#target_learners:checked').length) {
sendemail.$cohort_targets.each(inputDisable);
sendemail.$course_mode_targets.each(inputDisable);
} else {
sendemail.$cohort_targets.each(inputEnable);
sendemail.$course_mode_targets.each(inputEnable);
}
targets = [];
$('input[name="send_to"]:checked+label').each(function() {
return targets.push(this.innerText.replace(/\s*\n.*/g, ''));
});
return $('.send_to_list').text(gettext('Send to:') + ' ' + targets.join(', '));
});
}
SendEmail.prototype.fail_with_error = function(msg) {
this.$task_response.empty();
this.$request_response_error.empty();
this.$request_response_error.text(msg);
return $('.msg-confirm').css({
display: 'none'
});
};
SendEmail.prototype.display_response = function(dataFromServer) {
this.$task_response.empty();
this.$request_response_error.empty();
this.$task_response.text(dataFromServer);
return $('.msg-confirm').css({
display: 'block'
});
};
return SendEmail;
}());
this.Email = (function() {
function email($section) {
var eml = this;
this.$section = $section;
this.$section.data('wrapper', this);
plantTimeout(0, function() {
return new SendEmail(eml.$section.find('.send-email'));
});
this.instructor_tasks = new (PendingInstructorTasks())(this.$section);
}
email.prototype.onClickTitle = function() {
return this.instructor_tasks.task_poller.start();
};
email.prototype.onExit = function() {
return this.instructor_tasks.task_poller.stop();
};
return email;
}());
_.defaults(window, {
InstructorDashboard: {}
});
_.defaults(window.InstructorDashboard, {
sections: {}
});
_.defaults(window.InstructorDashboard.sections, {
Email: this.Email
});
}).call(this);