// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Encapsules the behavior for creating a tool type from a cartridge URL
* in Moodle. Manages the UI while operations are occuring.
*
* See template: mod_lti/cartridge_registration_form
*
* @module mod_lti/cartridge_registration_form
* @copyright 2015 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 3.1
*/
define(['jquery', 'core/ajax', 'core/notification', 'mod_lti/tool_type', 'mod_lti/events', 'mod_lti/keys', 'core/str'],
function($, ajax, notification, toolType, ltiEvents, KEYS, str) {
var SELECTORS = {
CARTRIDGE_URL: '#cartridge-url',
CONSUMER_KEY: '#registration-key',
SHARED_SECRET: '#registration-secret',
REGISTRATION_FORM: '#cartridge-registration-form',
REGISTRATION_SUBMIT_BUTTON: '#cartridge-registration-submit',
REGISTRATION_CANCEL_BUTTON: '#cartridge-registration-cancel',
};
/**
* Return the URL the user entered for the cartridge.
*
* @method getCartridgeURL
* @private
* @return {String}
*/
var getCartridgeURL = function() {
return $(SELECTORS.REGISTRATION_FORM).attr('data-cartridge-url');
};
/**
* Return the submit button element.
*
* @method getSubmitButton
* @private
* @return {JQuery} jQuery object
*/
var getSubmitButton = function() {
return $(SELECTORS.REGISTRATION_SUBMIT_BUTTON);
};
/**
* Return the cancel button element.
*
* @method getCancelButton
* @private
* @return {JQuery} jQuery object
*/
var getCancelButton = function() {
return $(SELECTORS.REGISTRATION_CANCEL_BUTTON);
};
/**
* Return the value that the user entered for the consumer key.
*
* @method getConsumerKey
* @private
* @return {String} the value entered for consumer key.
*/
var getConsumerKey = function() {
return $(SELECTORS.CONSUMER_KEY).val();
};
/**
* Return the value that the user entered for the shared secret.
*
* @method getSharedSecret
* @private
* @return {String} the value entered for shared secret
*/
var getSharedSecret = function() {
return $(SELECTORS.SHARED_SECRET).val();
};
/**
* Trigger a visual loading indicator.
*
* @method startLoading
* @private
*/
var startLoading = function() {
getSubmitButton().addClass('loading');
};
/**
* Stop the visual loading indicator.
*
* @method stopLoading
* @private
*/
var stopLoading = function() {
getSubmitButton().removeClass('loading');
};
/**
* Check if the page is currently loading.
*
* @method isLoading
* @private
* @return {Boolean}
*/
var isLoading = function() {
return getSubmitButton().hasClass('loading');
};
/**
* Create a tool type from the cartridge URL that the user input. This will
* send an ajax request to the Moodle server to create the Type. The request will
* include the consumer key and secret, if any.
*
* On success the page will be re-rendered to take the user back to the original
* page with the list of tools and an alert notifying them of success.
*
* @method submitCartridgeURL
* @private
* @return {Promise} jQuery Deferred object
*/
var submitCartridgeURL = function() {
if (isLoading()) {
return false;
}
var url = getCartridgeURL();
// No URL? Do nothing.
if (url === "") {
return false;
}
startLoading();
var consumerKey = getConsumerKey();
var sharedSecret = getSharedSecret();
var promise = toolType.create({cartridgeurl: url, key: consumerKey, secret: sharedSecret});
promise.done(function() {
str.get_string('successfullycreatedtooltype', 'mod_lti').done(function(s) {
$(document).trigger(ltiEvents.NEW_TOOL_TYPE);
$(document).trigger(ltiEvents.STOP_CARTRIDGE_REGISTRATION);
$(document).trigger(ltiEvents.REGISTRATION_FEEDBACK, {
message: s
});
}).fail(notification.exception);
}).fail(function() {
str.get_string('failedtocreatetooltype', 'mod_lti').done(function(s) {
$(document).trigger(ltiEvents.NEW_TOOL_TYPE);
$(document).trigger(ltiEvents.STOP_CARTRIDGE_REGISTRATION);
$(document).trigger(ltiEvents.REGISTRATION_FEEDBACK, {
message: s,
error: true
});
}).fail(notification.exception);
}).always(function() {
stopLoading();
});
return promise;
};
/**
* Sets up the listeners for user interaction on the page.
*
* @method registerEventListeners
* @private
*/
var registerEventListeners = function() {
var form = $(SELECTORS.REGISTRATION_FORM);
form.submit(function(e) {
e.preventDefault();
submitCartridgeURL();
});
var cancelButton = getCancelButton();
cancelButton.click(function(e) {
e.preventDefault();
$(document).trigger(ltiEvents.STOP_CARTRIDGE_REGISTRATION);
});
cancelButton.keypress(function(e) {
if (!e.metaKey && !e.shiftKey && !e.altKey && !e.ctrlKey) {
if (e.keyCode == KEYS.ENTER || e.keyCode == KEYS.SPACE) {
e.preventDefault();
cancelButton.click();
}
}
});
};
return /** @alias module:mod_lti/cartridge_registration_form */ {
/**
* Initialise this module.
*/
init: function() {
registerEventListeners();
}
};
});