%PDF- %PDF-
Direktori : /home/vacivi36/ava/mod/lti/amd/src/ |
Current File : /home/vacivi36/ava/mod/lti/amd/src/tool_configure_controller.js |
// 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/>. /** * Standard Ajax wrapper for Moodle. It calls the central Ajax script, * which can call any existing webservice using the current session. * In addition, it can batch multiple requests and return multiple responses. * * @module mod_lti/tool_configure_controller * @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/paged_content_factory', 'core/notification', 'core/templates', 'mod_lti/events', 'mod_lti/keys', 'mod_lti/tool_types_and_proxies', 'mod_lti/tool_type', 'mod_lti/tool_proxy', 'core/str', 'core/config'], function($, ajax, pagedContentFactory, notification, templates, ltiEvents, KEYS, toolTypesAndProxies, toolType, toolProxy, str, config) { var SELECTORS = { EXTERNAL_REGISTRATION_CONTAINER: '#external-registration-container', EXTERNAL_REGISTRATION_PAGE_CONTAINER: '#external-registration-page-container', EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER: '#external-registration-template-container', CARTRIDGE_REGISTRATION_CONTAINER: '#cartridge-registration-container', CARTRIDGE_REGISTRATION_FORM: '#cartridge-registration-form', ADD_TOOL_FORM: '#add-tool-form', TOOL_CARD_CONTAINER: '#tool-card-container', TOOL_LIST_CONTAINER: '#tool-list-container', TOOL_CREATE_BUTTON: '#tool-create-button', TOOL_CREATE_LTILEGACY_BUTTON: '#tool-createltilegacy-button', REGISTRATION_CHOICE_CONTAINER: '#registration-choice-container', TOOL_URL: '#tool-url' }; /** * Get the tool list container element. * * @method getToolListContainer * @private * @return {Object} jQuery object */ var getToolListContainer = function() { return $(SELECTORS.TOOL_LIST_CONTAINER); }; /** * Get the tool card container element. * * @method getToolCardContainer * @private * @return {Object} jQuery object */ const getToolCardContainer = function() { return $(SELECTORS.TOOL_CARD_CONTAINER); }; /** * Get the external registration container element. * * @method getExternalRegistrationContainer * @private * @return {Object} jQuery object */ var getExternalRegistrationContainer = function() { return $(SELECTORS.EXTERNAL_REGISTRATION_CONTAINER); }; /** * Get the cartridge registration container element. * * @method getCartridgeRegistrationContainer * @private * @return {Object} jQuery object */ var getCartridgeRegistrationContainer = function() { return $(SELECTORS.CARTRIDGE_REGISTRATION_CONTAINER); }; /** * Get the registration choice container element. * * @method getRegistrationChoiceContainer * @private * @return {Object} jQuery object */ var getRegistrationChoiceContainer = function() { return $(SELECTORS.REGISTRATION_CHOICE_CONTAINER); }; /** * Close the LTI Advantage Registration IFrame. * * @private * @param {Object} e post message event sent from the registration frame. */ var closeLTIAdvRegistration = function(e) { if (e.data && 'org.imsglobal.lti.close' === e.data.subject) { $(SELECTORS.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER).empty(); hideExternalRegistration(); showRegistrationChoices(); showToolList(); showRegistrationChoices(); reloadToolList(); } }; /** * Load the external registration template and render it in the DOM and display it. * * @method initiateRegistration * @private * @param {String} url where to send the registration request */ var initiateRegistration = function(url) { // Show the external registration page in an iframe. $(SELECTORS.EXTERNAL_REGISTRATION_PAGE_CONTAINER).removeClass('hidden'); var container = $(SELECTORS.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER); container.append($("<iframe src='startltiadvregistration.php?url=" + encodeURIComponent(url) + "&sesskey=" + config.sesskey + "'></iframe>")); showExternalRegistration(); window.addEventListener("message", closeLTIAdvRegistration, false); }; /** * Get the tool type URL. * * @method getToolURL * @private * @return {String} the tool type url */ var getToolURL = function() { return $(SELECTORS.TOOL_URL).val(); }; /** * Hide the external registration container. * * @method hideExternalRegistration * @private */ var hideExternalRegistration = function() { getExternalRegistrationContainer().addClass('hidden'); }; /** * Hide the cartridge registration container. * * @method hideCartridgeRegistration * @private */ var hideCartridgeRegistration = function() { getCartridgeRegistrationContainer().addClass('hidden'); }; /** * Hide the registration choice container. * * @method hideRegistrationChoices * @private */ var hideRegistrationChoices = function() { getRegistrationChoiceContainer().addClass('hidden'); }; /** * Display the external registration panel and hides the other * panels. * * @method showExternalRegistration * @private */ var showExternalRegistration = function() { hideCartridgeRegistration(); hideRegistrationChoices(); getExternalRegistrationContainer().removeClass('hidden'); screenReaderAnnounce(getExternalRegistrationContainer()); }; /** * Display the cartridge registration panel and hides the other * panels. * * @method showCartridgeRegistration * @param {String} url * @private */ var showCartridgeRegistration = function(url) { hideExternalRegistration(); hideRegistrationChoices(); // Don't save the key and secret from the last tool. var container = getCartridgeRegistrationContainer(); container.find('input').val(''); container.removeClass('hidden'); container.find(SELECTORS.CARTRIDGE_REGISTRATION_FORM).attr('data-cartridge-url', url); screenReaderAnnounce(container); }; /** * Display the registration choices panel and hides the other * panels. * * @method showRegistrationChoices * @private */ var showRegistrationChoices = function() { hideExternalRegistration(); hideCartridgeRegistration(); getRegistrationChoiceContainer().removeClass('hidden'); screenReaderAnnounce(getRegistrationChoiceContainer()); }; /** * JAWS does not notice visibility changes with aria-live. * Remove and add the content back to force it to read it out. * This function can be removed once JAWS supports visibility. * * @method screenReaderAnnounce * @param {Object} element * @private */ var screenReaderAnnounce = function(element) { var children = element.children().detach(); children.appendTo(element); }; /** * Hides the list of tool types. * * @method hideToolList * @private */ var hideToolList = function() { getToolListContainer().addClass('hidden'); }; /** * Display the list of tool types. * * @method hideToolList * @private */ var showToolList = function() { getToolListContainer().removeClass('hidden'); }; /** * Display the registration feedback alert and hide the other panels. * * @method showRegistrationFeedback * @param {Object} data * @private */ var showRegistrationFeedback = function(data) { var type = data.error ? 'error' : 'success'; notification.addNotification({ message: data.message, type: type }); }; /** * Show the loading animation * * @method startLoading * @private * @param {Object} element jQuery object */ var startLoading = function(element) { element.addClass("loading"); }; /** * Hide the loading animation * * @method stopLoading * @private * @param {Object} element jQuery object */ var stopLoading = function(element) { element.removeClass("loading"); }; /** * Refresh the list of tool types and render the new ones. * * @method reloadToolList * @private */ var reloadToolList = function() { // Behat tests should wait for the tool list to load. M.util.js_pending('reloadToolList'); const cardContainer = getToolCardContainer(); const listContainer = getToolListContainer(); const limit = 60; // Get initial data with zero limit and offset. fetchToolCount().done(function(data) { pagedContentFactory.createWithTotalAndLimit( data.count, limit, function(pagesData) { return pagesData.map(function(pageData) { return fetchToolData(pageData.limit, pageData.offset) .then(function(data) { return renderToolData(data); }); }); }, { 'showFirstLast': true }) .done(function(html, js) { // Add the paged content into the page. templates.replaceNodeContents(cardContainer, html, js); }) .always(function() { stopLoading(listContainer); M.util.js_complete('reloadToolList'); }); }); startLoading(listContainer); }; /** * Fetch the count of tool type and proxy datasets. * * @return {*|void} */ const fetchToolCount = function() { return toolTypesAndProxies.count({'orphanedonly': true}) .done(function(data) { return data; }).catch(function(error) { // Add debug message, then return empty data. notification.exception(error); return { 'count': 0 }; }); }; /** * Fetch the data for tool type and proxy cards. * * @param {number} limit Maximum number of datasets to get. * @param {number} offset Offset count for fetching the data. * @return {*|void} */ const fetchToolData = function(limit, offset) { const args = {'orphanedonly': true}; // Only add limit and offset to args if they are integers and not null, otherwise defaults will be used. if (limit !== null && !Number.isNaN(limit)) { args.limit = limit; } if (offset !== null && !Number.isNaN(offset)) { args.offset = offset; } return toolTypesAndProxies.query(args) .done(function(data) { return data; }).catch(function(error) { // Add debug message, then return empty data. notification.exception(error); return { 'types': [], 'proxies': [], 'limit': limit, 'offset': offset }; }); }; /** * Render Tool and Proxy cards from data. * * @param {Object} data Contains arrays of data objects to populate cards. * @return {*} */ const renderToolData = function(data) { const context = { tools: data.types, proxies: data.proxies, }; return templates.render('mod_lti/tool_list', context) .done(function(html, js) { return {html, js}; } ); }; /** * Start the LTI Advantage registration. * * @method addLTIAdvTool * @private */ var addLTIAdvTool = function() { var url = getToolURL().trim(); if (url) { $(SELECTORS.TOOL_URL).val(''); hideToolList(); initiateRegistration(url); } }; /** * Trigger appropriate registration process process for the user input * URL. It can either be a cartridge or a registration url. * * @method addLTILegacyTool * @private * @return {Promise} jQuery Deferred object */ var addLTILegacyTool = function() { var url = getToolURL().trim(); if (url === "") { return $.Deferred().resolve(); } var toolButton = $(SELECTORS.TOOL_CREATE_LTILEGACY_BUTTON); startLoading(toolButton); var promise = toolType.isCartridge(url); promise.always(function() { stopLoading(toolButton); }); promise.done(function(result) { if (result.iscartridge) { $(SELECTORS.TOOL_URL).val(''); $(document).trigger(ltiEvents.START_CARTRIDGE_REGISTRATION, url); } else { $(document).trigger(ltiEvents.START_EXTERNAL_REGISTRATION, {url: url}); } }); promise.fail(function() { str.get_string('errorbadurl', 'mod_lti') .done(function(s) { $(document).trigger(ltiEvents.REGISTRATION_FEEDBACK, { message: s, error: true }); }) .fail(notification.exception); }); return promise; }; /** * Sets up the listeners for user interaction on the page. * * @method registerEventListeners * @private */ var registerEventListeners = function() { // These are events fired by the registration processes. Either // the cartridge registration or the external registration url. $(document).on(ltiEvents.NEW_TOOL_TYPE, function() { reloadToolList(); }); $(document).on(ltiEvents.START_EXTERNAL_REGISTRATION, function() { showExternalRegistration(); $(SELECTORS.TOOL_URL).val(''); hideToolList(); }); $(document).on(ltiEvents.STOP_EXTERNAL_REGISTRATION, function() { showToolList(); showRegistrationChoices(); }); $(document).on(ltiEvents.START_CARTRIDGE_REGISTRATION, function(event, url) { showCartridgeRegistration(url); }); $(document).on(ltiEvents.STOP_CARTRIDGE_REGISTRATION, function() { getCartridgeRegistrationContainer().find(SELECTORS.CARTRIDGE_REGISTRATION_FORM).removeAttr('data-cartridge-url'); showRegistrationChoices(); }); $(document).on(ltiEvents.REGISTRATION_FEEDBACK, function(event, data) { showRegistrationFeedback(data); }); var addLegacyButton = $(SELECTORS.TOOL_CREATE_LTILEGACY_BUTTON); addLegacyButton.click(function(e) { e.preventDefault(); addLTILegacyTool(); }); var addLTIButton = $(SELECTORS.TOOL_CREATE_BUTTON); addLTIButton.click(function(e) { e.preventDefault(); addLTIAdvTool(); }); }; return /** @alias module:mod_lti/cartridge_registration_form */ { /** * Initialise this module. */ init: function() { registerEventListeners(); reloadToolList(); } }; });