AutorÃa | Ultima modificación | Ver Log |
/* global ns *//*** Construct a library selector.** @param {Array} libraries* @param {String} defaultLibrary* @param {Object} defaultParams* @returns {ns.LibrarySelector}*/ns.LibrarySelector = function (libraries, defaultLibrary, defaultParams) {var that = this;this.libraries = libraries;H5P.EventDispatcher.call(this);try {this.defaultParams = JSON.parse(defaultParams);if (!(this.defaultParams instanceof Object)) {throw true;}}catch (event) {// Content parameters are broken. Reset. (This allows for broken content to be reused without deleting it)this.defaultParams = {};}this.defaultLibrary = this.currentLibrary = defaultLibrary;this.defaultLibraryParameterized = defaultLibrary ? defaultLibrary.replace('.', '-').toLowerCase() : undefined;//Add tutorial and example link:this.$tutorialUrl = ns.$('<a class="h5p-tutorial-url" target="_blank">' +'<span class="h5p-tutorial-url-label">' +ns.t('core', 'tutorial') +'</span>' +'</a>').hide();this.$exampleUrl = ns.$('<a class="h5p-example-url" target="_blank">' +'<span class="h5p-example-url-label">' +ns.t('core', 'example') +'</span>' +'</a>').hide();// Create confirm dialogvar changeLibraryDialog = new H5P.ConfirmationDialog({headerText: H5PEditor.t('core', 'changeLibrary'),dialogText: H5PEditor.t('core', 'confirmChangeLibrary')}).appendTo(document.body);if (H5PIntegration.hubIsEnabled) {this.selector = new ns.SelectorHub(libraries, defaultLibrary, changeLibraryDialog);}else {this.selector = new ns.SelectorLegacy(libraries, defaultLibrary, changeLibraryDialog);}this.$selector = ns.$(this.selector.getElement());/*** @private* @param {object} library*/var librarySelectHandler = function (library) {that.currentLibrary = library.uberName;that.loadSemantics(library.uberName, that.selector.getParams(), that.selector.getMetadata());that.$tutorialUrl.attr('href', library.tutorialUrl ? library.tutorialUrl : '#').toggle(!!library.tutorialUrl);that.$exampleUrl.attr('href', library.exampleUrl ? library.exampleUrl : '#').toggle(!!library.exampleUrl);};/*** Event handler for loading a new library editor* @private*/var loadLibrary = function () {that.trigger('editorload', that.selector.currentLibrary);that.selector.getSelectedLibrary(librarySelectHandler);};/*** Confirm replace if there is content selected** @param {number} top Offset* @param {function} next Next callback*/this.confirmPasteError = function (message, top, next) {// Confirm changing libraryvar confirmReplace = new H5P.ConfirmationDialog({headerText: H5PEditor.t('core', 'pasteError'),dialogText: message,cancelText: ' ',confirmText: H5PEditor.t('core', 'ok')}).appendTo(document.body);confirmReplace.on('confirmed', next);confirmReplace.show(top);};// Change library on confirmationchangeLibraryDialog.on('confirmed', loadLibrary);// Revert selector on cancelchangeLibraryDialog.on('canceled', function () {that.selector.resetSelection(that.currentLibrary, that.defaultParams, that.form.metadata, true);});// First time a library is selected in the editorthis.selector.on('selected', loadLibrary);this.selector.on('resize', function () {that.trigger('resize');});this.on('select', loadLibrary);H5P.externalDispatcher.on('datainclipboard', this.updateCopyPasteButtons.bind(this));this.selector.on('paste', this.pasteContent.bind(this));};// Extends the event dispatcherns.LibrarySelector.prototype = Object.create(H5P.EventDispatcher.prototype);ns.LibrarySelector.prototype.constructor = ns.LibrarySelector;/*** Sets the current library** @param {string} library*/ns.LibrarySelector.prototype.setLibrary = function (library) {this.trigger('select');};/*** Append the selector html to the given container.** @param {jQuery} $element* @returns {undefined}*/ns.LibrarySelector.prototype.appendTo = function ($element) {var self = this;this.$parent = $element;/*Start Moodle changeThis line is commented out to prevent display of the hub selector in Moodle.For more information see MDL-67814.*/// this.$selector.appendTo($element);/* End Moodle change */this.$tutorialUrl.appendTo($element);this.$exampleUrl.appendTo($element);if (window.localStorage) {var $buttons = ns.$(ns.createCopyPasteButtons()).appendTo($element);// Hide copy paste until library is selected:$buttons.addClass('hidden');self.on('editorloaded', function () {$buttons.removeClass('hidden');});this.$copyButton = $buttons.find('.h5peditor-copy-button').click(function () {H5P.clipboardify({library: self.getCurrentLibrary(),params: self.getParams(),metadata: self.getMetadata()});ns.attachToastTo(self.$copyButton.get(0),H5PEditor.t('core', 'copiedToClipboard'), {position: {horizontal: 'center',vertical: 'above',noOverflowX: true}});});this.$pasteButton = $buttons.find('.h5peditor-paste-button').click(self.pasteContent.bind(this));self.updateCopyPasteButtons();}};/*** Update state of copy and paste buttons dependent on what is currently in* the clipboard*/ns.LibrarySelector.prototype.updateCopyPasteButtons = function () {if (!window.localStorage) {return;}// Check if content type is supported hereconst pasteCheck = ns.canPastePlus(H5P.getClipboard(), this.libraries);const canPaste = pasteCheck.canPaste;this.$copyButton.prop('disabled', false).toggleClass('disabled', false);this.$pasteButton.text(ns.t('core', 'pasteAndReplaceButton')).attr('title', canPaste ? ns.t('core', 'pasteAndReplaceFromClipboard') : pasteCheck.description).toggleClass('disabled', !canPaste).prop('disabled', !canPaste);this.selector.setCanPaste && this.selector.setCanPaste(canPaste, !canPaste ? pasteCheck.description : undefined);};/*** Sets the current library** @param {string} library*/ns.LibrarySelector.prototype.pasteContent = function () {var self = this;var clipboard = H5P.getClipboard();ns.confirmReplace(self.getCurrentLibrary(), self.$parent.offset().top, function () {self.selector.resetSelection(clipboard.generic.library, clipboard.generic.params, clipboard.generic.metadata, false);self.setLibrary();});};/*** Display loading message and load library semantics.** @param {String} library* @param {Object} params Pass in params to semantics* @returns {unresolved}*/ns.LibrarySelector.prototype.loadSemantics = function (library, params, metadata) {var that = this;if (this.form !== undefined) {// Remove old form.this.form.remove();}if (library === '-') {// No library chosen.this.$parent.attr('class', 'h5peditor');return;}this.$parent.attr('class', 'h5peditor ' + library.split(' ')[0].toLowerCase().replace('.', '-') + '-editor');// Display loading messagevar $loading = ns.$('<div class="h5peditor-loading h5p-throbber">' + ns.t('core', 'loading') + '</div>').appendTo(this.$parent);this.$selector.attr('disabled', true);ns.resetLoadedLibraries();ns.loadLibrary(library, function (semantics) {if (!semantics) {that.form = ns.$('<div/>', {'class': 'h5p-errors',text: H5PEditor.t('core', 'noSemantics'),insertAfter: $loading});}else {var overrideParams = {};if (params) {overrideParams = params;that.defaultParams = overrideParams;}else if (library === that.defaultLibrary || library === that.defaultLibraryParameterized) {overrideParams = that.defaultParams;}if (!metadata) {metadata = overrideParams.metadata;}const defaultLanguage = metadata && metadata.defaultLanguage? metadata.defaultLanguage: null;that.form = new ns.Form(library,ns.libraryCache[library].languages,defaultLanguage);that.form.replace($loading);that.form.currentLibrary = library;that.form.processSemantics(semantics, overrideParams, metadata);that.updateCopyPasteButtons();}that.$selector.attr('disabled', false);$loading.remove();that.trigger('editorloaded', library);});};/*** Returns currently selected library** @returns {string} Currently selected library*/ns.LibrarySelector.prototype.getCurrentLibrary = function () {return this.currentLibrary;};/*** Return params needed to start library.*/ns.LibrarySelector.prototype.getParams = function () {if (this.form === undefined) {return;}// Only return if all fields has validated.//var valid = true;if (this.form.metadataForm.children !== undefined) {for (var i = 0; i < this.form.metadataForm.children.length; i++) {if (this.form.metadataForm.children[i].validate() === false) {//valid = false;}}}if (this.form.children !== undefined) {for (var i = 0; i < this.form.children.length; i++) {if (this.form.children[i].validate() === false) {//valid = false;}}}//return valid ? this.form.params : false;return this.form.params; // TODO: Switch to the line above when we are able to tell the user where the validation fails};/*** Get the metadata of the main form.** @return {object} Metadata object.*/ns.LibrarySelector.prototype.getMetadata = function () {if (this.form === undefined) {return;}return this.form.metadata;};/**** @param content* @param library* @returns {H5PEditor.Presave} Result after processing library and content*/ns.LibrarySelector.prototype.presave = function (content, library) {return (new ns.Presave).process(library, content);};