AutorÃa | Ultima modificación | Ver Log |
// 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/>./*** A module to handle Share operations of the MoodleNet.** @module core/moodlenet/send_resource* @copyright 2023 Huong Nguyen <huongnv13@gmail.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later* @since 4.2*/import Config from 'core/config';import {addNotification, exception as displayException} from 'core/notification';import {getString} from 'core/str';import Prefetch from "core/prefetch";import * as Templates from 'core/templates';import {publish} from 'core/pubsub';import * as MoodleNetService from 'core/moodlenet/service';import SendActivityModal from 'core/moodlenet/send_activity_modal';import * as MoodleNetAuthorize from 'core/moodlenet/authorize';import MoodleNetEvents from 'core/moodlenet/events';const TYPE_ACTIVITY = "activity";const TYPE_COURSE = "course";const TYPE_PARTIAL_COURSE = "partial";let listenersRegistered = false;let currentModal;let siteSupportUrl;let issuerId;let courseId;let resourceId;let shareFormat;let type;let selectedCmIds;/*** Handle send to MoodleNet.** @param {int} issuerId The OAuth 2 issuer ID.* @param {int} resourceId The resource ID, it can be a course or an activity.* @param {int} shareFormat The share format.*/export const sendToMoodleNet = (issuerId, resourceId, shareFormat) => {const $modal = currentModal.getModal();const modal = $modal[0];modal.querySelector('.modal-header').classList.remove('no-border');modal.querySelector('.modal-header').classList.add('no-header-text');currentModal.setBody(Templates.render('core/moodlenet/send_activity_modal_packaging', {}));currentModal.hideFooter();let infoPromise;if (type === TYPE_ACTIVITY) {infoPromise = MoodleNetService.sendActivity(issuerId, resourceId, shareFormat);} else if (type === TYPE_COURSE) {infoPromise = MoodleNetService.sendCourse(issuerId, resourceId, shareFormat);} else if (type === TYPE_PARTIAL_COURSE) {if (selectedCmIds.length > 1) {infoPromise = MoodleNetService.sendPartialCourse(issuerId, resourceId, selectedCmIds, shareFormat);} else {infoPromise = MoodleNetService.sendActivity(issuerId, selectedCmIds[0], shareFormat);}}infoPromise.then(async(data) => {const status = data.status;const resourceUrl = data.resourceurl;return responseFromMoodleNet(status, resourceUrl);}).catch(displayException);};/*** Handle response from MoodleNet.** @param {boolean} status Response status. True if successful.* @param {String} resourceUrl Resource URL.*/const responseFromMoodleNet = (status, resourceUrl = '') => {const $modal = currentModal.getModal();const modal = $modal[0];modal.querySelector('.modal-header').classList.add('no-border');currentModal.setBody(Templates.render('core/moodlenet/send_activity_modal_done', {success: status,sitesupporturl: siteSupportUrl,}));if (status) {currentModal.setFooter(Templates.render('core/moodlenet/send_activity_modal_footer_view', {resourceurl: resourceUrl,}));currentModal.showFooter();}};/*** Render the modal to send resource to MoodleNet.** @param {object} data The data of the resource to be shared.* @param {array} selectedActivities Selected activities.*/const renderModal = async(data, selectedActivities) => {if (data.status) {siteSupportUrl = data.supportpageurl;issuerId = data.issuerid;let modalConfig = {templateContext: {'activitytype': data.type,'activityname': data.name,'server': data.server,}};if (selectedActivities.length > 0) {selectedCmIds = selectedActivities;}if (selectedActivities.length > 1) {modalConfig.templateContext.fullsharing = false;modalConfig.templateContext.selectedactivitiesnotice = await getString('moodlenet:sharenoticepartialactivitynumber','moodle', selectedActivities.length);modalConfig.templateContext.sharenotice = await getString('moodlenet:sharenoticepartial', 'moodle');} else {modalConfig.templateContext.fullsharing = true;if (type === TYPE_ACTIVITY || (type === TYPE_PARTIAL_COURSE && selectedActivities.length == 1)) {modalConfig.templateContext.sharenotice = await getString('moodlenet:sharenoticeactivity', 'moodle');} else {modalConfig.templateContext.sharenotice = await getString('moodlenet:sharenoticecourse', 'moodle');}}return SendActivityModal.create(modalConfig);} else {return addNotification({message: data.warnings[0].message,type: 'error'});}};/*** Handle modal.* @param {string} shareActionType Share action type.* @param {array} selectedActivities Selected activities.*/export const handleModal = (shareActionType, selectedActivities = []) => {const resourceId = Config.contextInstanceId;type = shareActionType;Promise.resolve(type).then((type) => {if (type === TYPE_ACTIVITY) {return MoodleNetService.getActivityInformation(resourceId);} else if (type === TYPE_COURSE) {return MoodleNetService.getCourseInformation(resourceId);} else if (type === TYPE_PARTIAL_COURSE) {if (selectedActivities.length > 1) {// Selected more than one activity.return MoodleNetService.getCourseInformation(resourceId);} else {// Select only one activity. Switch to activity mode.return MoodleNetService.getActivityInformation(selectedActivities[0]);}}throw new Error(`Unknown type ${type}`);}).then((data) => {return renderModal(data, selectedActivities);}).then((modal) => {currentModal = modal;return currentModal;}).catch(displayException);};/*** Register events.*/const registerEventListeners = () => {document.addEventListener('click', (e) => {const shareAction = e.target.closest('[data-action="sendtomoodlenet"]');const sendAction = e.target.closest('.moodlenet-action-buttons [data-action="share"]');if (shareAction) {e.preventDefault();type = shareAction.getAttribute('data-type');handleModal(shareAction.getAttribute('data-type'));}if (sendAction) {e.preventDefault();publish(MoodleNetEvents.MOODLENET_SHARE_STARTED, {});courseId = Config.courseId;resourceId = Config.contextInstanceId;shareFormat = 0;MoodleNetAuthorize.handleAuthorization(issuerId, courseId, resourceId, shareFormat);}});};/*** Initialize.*/export const init = () => {if (!listenersRegistered) {Prefetch.prefetchTemplates(['core/moodlenet/send_activity_modal_base','core/moodlenet/send_activity_modal_packaging','core/moodlenet/send_activity_modal_done','core/moodlenet/send_activity_modal_footer_view','core/moodlenet/send_activity_modal_footer_share',]);registerEventListeners();listenersRegistered = true;}};