diff --git a/lms/static/js/dashboard/track_events.js b/lms/static/js/dashboard/track_events.js index 4667b6b4bb..4218eb20ff 100644 --- a/lms/static/js/dashboard/track_events.js +++ b/lms/static/js/dashboard/track_events.js @@ -34,6 +34,9 @@ var edx = edx || {}; // Emit an event when the 'course title link' is clicked. edx.dashboard.trackCourseTitleClicked = function($courseTitleLink, properties){ var trackProperty = properties || edx.dashboard.generateTrackProperties; + if (!window.analytics) { + return; + } window.analytics.trackLink( $courseTitleLink, 'edx.bi.dashboard.course_title.clicked', @@ -102,6 +105,10 @@ var edx = edx || {}; }; edx.dashboard.xseriesTrackMessages = function() { + if (!window.analytics) { + return; + } + $('.xseries-action .btn').each(function(i, element) { var data = edx.dashboard.generateProgramProperties($(element)); diff --git a/lms/static/js/edxnotes/plugins/store_error_handler.js b/lms/static/js/edxnotes/plugins/store_error_handler.js new file mode 100644 index 0000000000..9c1d01ff7d --- /dev/null +++ b/lms/static/js/edxnotes/plugins/store_error_handler.js @@ -0,0 +1,33 @@ +(function (define, undefined) { + 'use strict'; + + define(['annotator_1.2.9'], function (Annotator) { + /** + * Modifies Annotator.Plugin.Store.prototype._onError to show custom error message + * if sent by server + */ + var originalErrorHandler = Annotator.Plugin.Store.prototype._onError; + Annotator.Plugin.Store.prototype._onError = function (xhr) { + var serverResponse; + + // Try to parse json + if (xhr.responseText) { + try { + serverResponse = JSON.parse(xhr.responseText); + } catch (exception) { + serverResponse = null; + } + } + + // if response includes an error message it will take precedence + if (serverResponse && serverResponse.error_msg) { + Annotator.showNotification(serverResponse.error_msg, Annotator.Notification.ERROR); + return console.error(Annotator._t("API request failed:") + (" '" + xhr.status + "'")); + } + + // Delegate to original error handler + originalErrorHandler(xhr); + }; + }); +}).call(this, define || RequireJS.define); + diff --git a/lms/static/js/edxnotes/views/notes_factory.js b/lms/static/js/edxnotes/views/notes_factory.js index 4b1d64811d..f1e091b3a9 100644 --- a/lms/static/js/edxnotes/views/notes_factory.js +++ b/lms/static/js/edxnotes/views/notes_factory.js @@ -4,7 +4,8 @@ define([ 'jquery', 'underscore', 'annotator_1.2.9', 'js/edxnotes/utils/logger', 'js/edxnotes/views/shim', 'js/edxnotes/plugins/scroller', 'js/edxnotes/plugins/events', 'js/edxnotes/plugins/accessibility', - 'js/edxnotes/plugins/caret_navigation' + 'js/edxnotes/plugins/caret_navigation', + 'js/edxnotes/plugins/store_error_handler' ], function ($, _, Annotator, NotesLogger) { var plugins = ['Auth', 'Store', 'Scroller', 'Events', 'Accessibility', 'CaretNavigation', 'Tags'], getOptions, setupPlugins, getAnnotator; diff --git a/lms/static/js/spec/edxnotes/plugins/store_error_handler_spec.js b/lms/static/js/spec/edxnotes/plugins/store_error_handler_spec.js new file mode 100644 index 0000000000..53bcce802d --- /dev/null +++ b/lms/static/js/spec/edxnotes/plugins/store_error_handler_spec.js @@ -0,0 +1,36 @@ +define([ + 'jquery', 'underscore', 'annotator_1.2.9', + 'common/js/spec_helpers/ajax_helpers', + 'js/spec/edxnotes/helpers', + 'js/edxnotes/views/notes_factory' +], function ($, _, Annotator, AjaxHelpers, Helpers, NotesFactory) { + 'use strict'; + describe('Store Error Handler Custom Message', function () { + beforeEach(function () { + spyOn(Annotator, 'showNotification'); + loadFixtures('js/fixtures/edxnotes/edxnotes_wrapper.html'); + this.wrapper = document.getElementById('edx-notes-wrapper-123'); + }); + + afterEach(function () { + _.invoke(Annotator._instances, 'destroy'); + }); + + it('can handle custom error if sent from server', function () { + var requests = AjaxHelpers.requests(this); + var token = Helpers.makeToken(); + NotesFactory.factory(this.wrapper, { + endpoint: '/test_endpoint', + user: 'a user', + usageId: 'an usage', + courseId: 'a course', + token: token, + tokenUrl: '/test_token_url' + }); + + var errorMsg = 'can\'t create more notes'; + AjaxHelpers.respondWithError(requests, 400, {error_msg: errorMsg}); + expect(Annotator.showNotification).toHaveBeenCalledWith(errorMsg, Annotator.Notification.ERROR); + }); + }); +}); diff --git a/lms/static/js/spec/main.js b/lms/static/js/spec/main.js index ba58c0a9e8..577f6c86e6 100644 --- a/lms/static/js/spec/main.js +++ b/lms/static/js/spec/main.js @@ -705,6 +705,7 @@ 'lms/include/js/spec/edxnotes/plugins/events_spec.js', 'lms/include/js/spec/edxnotes/plugins/scroller_spec.js', 'lms/include/js/spec/edxnotes/plugins/caret_navigation_spec.js', + 'lms/include/js/spec/edxnotes/plugins/store_error_handler_spec.js', 'lms/include/js/spec/edxnotes/collections/notes_spec.js', 'lms/include/js/spec/search/search_spec.js', 'lms/include/js/spec/navigation_spec.js',