/** * Course import-related js. */ define( ["domReady", "jquery", "underscore", "gettext"], function(domReady, $, _, gettext) { "use strict"; /********** Private functions ************************************************/ /** * Toggle the spin on the progress cog. * @param {boolean} isSpinning Turns cog spin on if true, off otherwise. */ var updateCog = function (elem, isSpinning) { var cogI = elem.find('i.icon-cog'); if (isSpinning) { cogI.addClass("icon-spin");} else { cogI.removeClass("icon-spin");} }; /** * Manipulate the DOM to reflect current status of upload. * @param {int} stageNo Current stage. */ var updateStage = function (stageNo){ var all = $('ol.status-progress').children(); var prevList = all.slice(0, stageNo); _.map(prevList, function (elem){ $(elem). removeClass("is-not-started"). removeClass("is-started"). addClass("is-complete"); updateCog($(elem), false); }); var curList = all.eq(stageNo); curList.removeClass("is-not-started").addClass("is-started"); updateCog(curList, true); }; /** * Check for import status updates every `timeout` milliseconds, and update * the page accordingly. * @param {string} url Url to call for status updates. * @param {int} timeout Number of milliseconds to wait in between ajax calls * for new updates. * @param {int} stage Starting stage. */ var getStatus = function (url, timeout, stage) { var currentStage = stage || 0; if (CourseImport.stopGetStatus) { return ;} updateStage(currentStage); if (currentStage == 3 ) { return ;} var time = timeout || 1000; $.getJSON(url, function (data) { setTimeout(function () { getStatus(url, time, data.ImportStatus); }, time); } ); }; /********** Public functions *************************************************/ var CourseImport = { /** * Whether to stop sending AJAX requests for updates on the import * progress. */ stopGetStatus: false, /** * Update DOM to set all stages as not-started (for retrying an upload that * failed). */ clearImportDisplay: function () { var all = $('ol.status-progress').children(); _.map(all, function (elem){ $(elem).removeClass("is-complete"). removeClass("is-started"). removeClass("has-error"). addClass("is-not-started"); $(elem).find('p.error').remove(); // remove error messages $(elem).find('p.copy').show(); updateCog($(elem), false); }); this.stopGetStatus = false; }, /** * Update DOM to set all stages as complete, and stop asking for status * updates. */ displayFinishedImport: function () { this.stopGetStatus = true; var all = $('ol.status-progress').children(); _.map(all, function (elem){ $(elem). removeClass("is-not-started"). removeClass("is-started"). addClass("is-complete"); updateCog($(elem), false); }); }, /** * Entry point for server feedback. Makes status list visible and starts * sending requests to the server for status updates. * @param {string} url The url to send Ajax GET requests for updates. */ startServerFeedback: function (url){ this.stopGetStatus = false; $('div.wrapper-status').removeClass('is-hidden'); $('.status-info').show(); getStatus(url, 500, 0); }, /** * Give error message at the list element that corresponds to the stage * where the error occurred. * @param {int} stageNo Stage of import process at which error occured. * @param {string} msg Error message to display. */ stageError: function (stageNo, msg) { var all = $('ol.status-progress').children(); // Make all stages up to, and including, the error stage 'complete'. var prevList = all.slice(0, stageNo + 1); _.map(prevList, function (elem){ $(elem). removeClass("is-not-started"). removeClass("is-started"). addClass("is-complete"); updateCog($(elem), false); }); var message = msg || gettext("There was an error with the upload"); var elem = $('ol.status-progress').children().eq(stageNo); elem.removeClass('is-started').addClass('has-error'); elem.find('p.copy').hide().after("

" + message + "

"); } }; var showImportSubmit = function (e) { var filepath = $(this).val(); if (filepath.substr(filepath.length - 6, 6) == 'tar.gz') { $('.error-block').hide(); $('.file-name').html($(this).val().replace('C:\\fakepath\\', '')); $('.file-name-block').show(); $('.view-import .choose-file-button').hide(); $('.submit-button').show(); $('.progress').show(); } else { $('.error-block').html(gettext('File format not supported. Please upload a file with a tar.gz extension.')).show(); } }; domReady(function () { // import form setup $('.view-import .file-input').bind('change', showImportSubmit); $('.view-import .choose-file-button, .view-import .choose-file-button-inline').bind('click', function (e) { e.preventDefault(); $('.view-import .file-input').click(); }); }); return CourseImport; });