diff --git a/h5p.classes.php b/h5p.classes.php index dabca7d..3276151 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -1676,7 +1676,7 @@ class H5PCore { public static $coreApi = array( 'majorVersion' => 1, - 'minorVersion' => 10 + 'minorVersion' => 11 ); public static $styles = array( 'styles/h5p.css', @@ -3056,7 +3056,9 @@ class H5PContentValidator { $function = null; $field = null; - if (count($semantics->fields) == 1 && $flatten) { + $isSubContent = isset($semantics->isSubContent) && $semantics->isSubContent === TRUE; + + if (count($semantics->fields) == 1 && $flatten && !$isSubContent) { $field = $semantics->fields[0]; $function = $this->typeMap[$field->type]; $this->$function($group, $field); @@ -3064,7 +3066,7 @@ class H5PContentValidator { else { foreach ($group as $key => &$value) { // If subContentId is set, keep value - if($key == 'subContentId' && $value == TRUE){ + if($isSubContent && ($key == 'subContentId')){ continue; } diff --git a/js/h5p-content-upgrade-process.js b/js/h5p-content-upgrade-process.js index 1d886cc..e54dbb7 100644 --- a/js/h5p-content-upgrade-process.js +++ b/js/h5p-content-upgrade-process.js @@ -182,7 +182,7 @@ H5P.ContentUpgradeProcess = (function (Version) { break; case 'group': - if (field.fields.length === 1) { + if (field.fields.length === 1 && field.isSubContent !== true) { // Single field to process, wrapper will be skipped self.processField(field.fields[0], params, function (err, upgradedParams) { if (upgradedParams) { diff --git a/js/h5p.js b/js/h5p.js index 77f9f0e..41fb562 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -477,6 +477,19 @@ H5P.communicator = (function () { return (window.postMessage && window.addEventListener ? new Communicator() : undefined); })(); +/** + * Enter semi fullscreen for the given H5P instance + * + * @method semiFullScreen + * @param {H5P.jQuery} $element Content container. + * @param {Object} instance + * @param {function} exitCallback Callback function called when user exits fullscreen. + * @param {H5P.jQuery} $body For internal use. Gives the body of the iframe. + */ +H5P.semiFullScreen = function ($element, instance, exitCallback, body) { + H5P.fullScreen($element, instance, exitCallback, body, true); +}; + /** * Enter fullscreen for the given H5P instance. * @@ -484,15 +497,16 @@ H5P.communicator = (function () { * @param {Object} instance * @param {function} exitCallback Callback function called when user exits fullscreen. * @param {H5P.jQuery} $body For internal use. Gives the body of the iframe. + * @param {Boolean} forceSemiFullScreen */ -H5P.fullScreen = function ($element, instance, exitCallback, body) { +H5P.fullScreen = function ($element, instance, exitCallback, body, forceSemiFullScreen) { if (H5P.exitFullScreen !== undefined) { return; // Cannot enter new fullscreen until previous is over } if (H5P.isFramed && H5P.externalEmbed === false) { // Trigger resize on wrapper in parent window. - window.parent.H5P.fullScreen($element, instance, exitCallback, H5P.$body.get()); + window.parent.H5P.fullScreen($element, instance, exitCallback, H5P.$body.get(), forceSemiFullScreen); H5P.isFullscreen = true; H5P.exitFullScreen = function () { window.parent.H5P.exitFullScreen(); @@ -572,7 +586,7 @@ H5P.fullScreen = function ($element, instance, exitCallback, body) { }; H5P.isFullscreen = true; - if (H5P.fullScreenBrowserPrefix === undefined) { + if (H5P.fullScreenBrowserPrefix === undefined || forceSemiFullScreen === true) { // Create semi fullscreen. if (H5P.isFramed) {