Current Path : C:/xampp/htdocs/moodle/mod/hvp/editor/scripts/ |
Current File : C:/xampp/htdocs/moodle/mod/hvp/editor/scripts/h5peditor-selector-hub.js |
/* global ns */ /** * @class * @alias H5PEditor.SelectorHub */ ns.SelectorHub = function (libraries, selectedLibrary, changeLibraryDialog) { var self = this; H5P.EventDispatcher.call(this); /** * Looks up content type object * * @param {string} machineName * @return {object} */ this.getContentType = function (machineName) { for (var i = 0; i < libraries.libraries.length; i++) { var contentType = libraries.libraries[i]; if (contentType.machineName === machineName) { return contentType; } } }; var state = { contentId: H5PEditor.contentId || 0, contentTypes: libraries, getAjaxUrl: H5PEditor.getAjaxUrl, expanded: true, canPaste: false, enableContentHub: H5PEditor.enableContentHub || false, }; if (selectedLibrary) { var contentType = this.getContentType(selectedLibrary.split(' ')[0]); state.title = contentType ? contentType.title || contentType.machineName : selectedLibrary.split(' ')[0]; state.expanded = false; } // Initialize hub client this.client = new H5P.HubClient(state, H5PEditor.language.core); // Default to nothing selected and empty params this.currentLibrary = selectedLibrary; // Listen for content type selection this.client.on('select', function (event) { var contentType = event; // Already selected library if (contentType.machineName === self.currentLibrary.split(' ')[0]) { return; } if (!self.currentLibrary) { self.currentLibrary = self.createContentTypeId(contentType, true); self.trigger('selected'); return; } self.currentLibrary = self.createContentTypeId(contentType, true); delete self.currentParams; delete self.currentMetadata; changeLibraryDialog.show(ns.$(self.getElement()).offset().top); }, this); // Listen for uploads this.client.on('upload', function (event) { libraries = event.contentTypes; var previousLibrary = self.currentLibrary; // Use version from event data const uploadedVersion = event.h5p.preloadedDependencies .filter(function (dependency) { return dependency.machineName === event.h5p.mainLibrary; })[0]; self.currentLibrary = self.createContentTypeId(uploadedVersion); self.currentParams = event.content; self.currentMetadata = { title: event.h5p.title, authors: event.h5p.authors, license: event.h5p.license, licenseVersion: event.h5p.licenseVersion, licenseExtras: event.h5p.licenseExtras, yearFrom: event.h5p.yearFrom, yearTo: event.h5p.yearTo, source: event.h5p.source, changes: event.h5p.changes, authorComments: event.h5p.authorComments, defaultLanguage: event.h5p.defaultLanguage }; /** * Change library immediately or show confirmation dialog * @private */ const selectLibrary = function () { if (!previousLibrary) { self.trigger('selected'); } else { changeLibraryDialog.show(ns.$(self.getElement()).offset().top); } }; /** * Use backend to filter parameter values according to semantics * * @private * @param {Object} library */ const filterParameters = function (library) { const libraryString = ns.ContentType.getNameVersionString(library); var formData = new FormData(); formData.append('libraryParameters', JSON.stringify({ library: libraryString, params: self.currentParams, metadata: self.currentMetadata })); var request = new XMLHttpRequest(); request.onload = function () { try { result = JSON.parse(request.responseText); self.currentLibrary = result.data.library; self.currentParams = result.data.params; self.currentMetadata = result.data.metadata; selectLibrary(); } catch (err) { H5P.error(err); } }; request.open('POST', H5PEditor.getAjaxUrl('filter'), true); request.send(formData); }; // Check if we have any newer versions const upgradeLibrary = ns.ContentType.getPossibleUpgrade(uploadedVersion, libraries.libraries); if (upgradeLibrary) { // We need to run content upgrade before showing the editor ns.upgradeContent(uploadedVersion, upgradeLibrary, {params: self.currentParams, metadata: self.currentMetadata}, function (err, result) { if (err) { // Reset the Hub var contentType = self.getContentType(self.currentLibrary.split(' ')[0]); self.client.setPanelTitle(contentType.title || contentType.machineName, true); } else { const content = JSON.parse(result); self.currentParams = content.params; self.currentMetadata = content.metadata; self.currentLibrary = self.createContentTypeId(upgradeLibrary, true); filterParameters(upgradeLibrary); } }) } else { filterParameters(uploadedVersion); } }, this); this.client.on('update', function (event) { // Handle update to the content type cache libraries = event; }); this.client.on('resize', function () { self.trigger('resize'); }); this.client.on('paste', function () { self.trigger('paste'); }); }; // Extends the event dispatcher ns.SelectorHub.prototype = Object.create(H5P.EventDispatcher.prototype); ns.SelectorHub.prototype.constructor = ns.SelectorHub; /** * Reset current library to the provided library. * * @param {string} library Full library name * @param {Object} params Library parameters * @param {Object} metadata Library metadata * @param {boolean} expanded Selector open */ ns.SelectorHub.prototype.resetSelection = function (library, params, metadata, expanded) { this.currentLibrary = library; this.currentParams = params; this.currentMetadata = metadata; var contentType = this.getContentType(library.split(' ')[0]); this.client.setPanelTitle(contentType.title || contentType.machineName, expanded); }; /** * Reset current library to the provided library. * * @param {boolean} canPaste * @param {string} [title] */ ns.SelectorHub.prototype.setCanPaste = function (canPaste, title) { this.client.setCanPaste(canPaste, title); }; /** * Get currently selected library * * @param {function} next Callback */ ns.SelectorHub.prototype.getSelectedLibrary = function (next) { var selected = { uberName: this.currentLibrary }; var contentType = this.getContentType(this.currentLibrary.split(' ')[0]); if (contentType) { selected.tutorialUrl = contentType.tutorial; selected.exampleUrl = contentType.example; } return next(selected); }; /** * Get params connected with the currently selected library * * @returns {object} Parameters connected to the selected library */ ns.SelectorHub.prototype.getParams = function () { return this.currentParams; }; /** * Get metadata connected with the currently selected library * * @returns {object} Metadata connected to the selected library */ ns.SelectorHub.prototype.getMetadata = function () { return this.currentMetadata; }; /** * Returns the html element for the hub * * @public * @return {HTMLElement} */ ns.SelectorHub.prototype.getElement = function () { return this.client.getElement(); }; /** * Takes a content type, and extracts the full id (ubername) * * @param {ContentType} contentType * @param {boolean} [useLocalVersion] Decides if we should use local version or cached version * * @private * @return {string} */ ns.SelectorHub.prototype.createContentTypeId = function (contentType, useLocalVersion) { var id = contentType.machineName; if (useLocalVersion) { id += ' ' + contentType.localMajorVersion + '.' + contentType.localMinorVersion; } else { id += ' ' + contentType.majorVersion + '.' + contentType.minorVersion; } return id; };