Files
edx-platform/lms/static/js/edxnotes/utils/notes_collector.js
2016-11-09 01:28:13 +05:00

114 lines
4.3 KiB
JavaScript

(function(define) {
'use strict';
define(['jquery', 'underscore', 'annotator_1.2.9'], function($, _, Annotator) {
var cleanup,
renderNotes,
fetchNotesWhenReady,
storeNotesRequestData,
searchRequestsData = [];
/**
* Clears the searchRequestsData.
*/
cleanup = function() {
searchRequestsData = [];
};
/**
* Store requests data for each annotatable component and fetch
* notes for them when request for each component is stored.
*
* @param {object} data Request data for each annotatable component
* @param {Number} totalNotesWrappers Total number of edx notes wrappers present
*/
storeNotesRequestData = function(data, totalNotesWrappers) {
searchRequestsData.push(data);
fetchNotesWhenReady(totalNotesWrappers);
};
/**
* Fetch notes for annotatable components only when desired
* number of requests are stored.
*
* @param {Number} totalNotesWrappers Total number of edx notes wrappers present
*/
fetchNotesWhenReady = function(totalNotesWrappers) {
var settings,
usageIds,
searchEndpoint;
if (totalNotesWrappers !== searchRequestsData.length) {
return;
}
// `user` and `course_id` values are same for every annotatable
// component so we pick these from first `searchRequestsData` item
settings = {
data: {
user: searchRequestsData[0].params.user,
course_id: searchRequestsData[0].params.courseId
},
type: 'GET',
dataType: 'json',
headers: {'x-annotator-auth-token': searchRequestsData[0].params.token}
};
searchEndpoint = searchRequestsData[0].params.endpoint + 'search/?';
usageIds = _.map(searchRequestsData, function(item) {
return 'usage_id=' + encodeURIComponent(item.params.usageId);
});
// Search endpoint expects the below format for query params
// /api/v1/search/?course_id={course_id}&user={user_id}&usage_id={usage_id}&usage_id={usage_id} ...
searchEndpoint += usageIds.join('&');
$.ajax(searchEndpoint, settings)
.done(function(jqXHR) {
renderNotes(jqXHR);
})
.fail(function(jqXHR) {
// `_action` is used by AnnotatorJS to construct error message
jqXHR._action = 'search'; // eslint-disable-line no-underscore-dangle, no-param-reassign
Annotator.Plugin.Store.prototype._onError(jqXHR); // eslint-disable-line no-underscore-dangle
})
.always(function() {
cleanup();
});
};
/**
* Pass notes to AnnotatorJS for rendering
*
* @param {Array} notes Notes data received from server
*/
renderNotes = function(notes) {
var edxNotes = {};
// AnnotatorJS expects notes to be present in an array named as `rows`
_.each(searchRequestsData, function(item) {
edxNotes[item.params.usageId] = {rows: []};
});
// Place the received notes in the format below
// edxNotes = {
// 'usage_id1': [noteObject, noteObject, noteObject],
// 'usage_id2': [noteObject, noteObject]
// }
_.each(notes, function(note) {
edxNotes[note.usage_id].rows.push(note);
});
// Render the notes for each annotatable component using its associated AnnotatorJS instance
_.each(searchRequestsData, function(item) {
item.annotator.plugins.Store._onLoadAnnotationsFromSearch( // eslint-disable-line no-underscore-dangle
edxNotes[item.params.usageId]
);
});
};
return {
storeNotesRequestData: storeNotesRequestData,
cleanup: cleanup
};
});
}).call(this, define || RequireJS.define);