From 057a61be7aaf4d70eab33031c87f55c1b1aafdbf Mon Sep 17 00:00:00 2001 From: Andrew Shapiro Date: Tue, 8 Sep 2020 13:17:42 +0300 Subject: [PATCH 01/26] Feature/NEX-1689/Use test previewer registry service --- scripts/install/RegisterTestPreviewer.php | 73 ++++++++++++----------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/scripts/install/RegisterTestPreviewer.php b/scripts/install/RegisterTestPreviewer.php index 533cee65..a3d8ac64 100644 --- a/scripts/install/RegisterTestPreviewer.php +++ b/scripts/install/RegisterTestPreviewer.php @@ -1,68 +1,71 @@ register( - 'taoTests/previewer/factory', array( - 'previewers' => array( - 'taoQtiTestPreviewer/previewer/adapter/test/qtiTest' => array( - 'id' => 'qtiTest', - 'module' => 'taoQtiTestPreviewer/previewer/adapter/test/qtiTest', - 'bundle' => 'taoQtiTestPreviewer/loader/qtiPreviewer.min', - 'position' => null, - 'name' => 'QTI Test Previewer', - 'description' => 'QTI implementation of the test previewer', - 'category' => 'previewer', - 'active' => true, - 'tags' => array( - 'core', - 'qti', - 'previewer' - ) - ) - ) - ) - ); + /** @var TestPreviewerRegistryService $testPreviewerService */ + $testPreviewerService = $this->getServiceManager()->get(TestPreviewerRegistryService::SERVICE_ID); + $testPreviewerService->registerAdapter(DynamicModule::fromArray([ + 'id' => 'qtiTest', + 'module' => 'taoQtiTestPreviewer/previewer/adapter/test/qtiTest', + 'bundle' => 'taoQtiTestPreviewer/loader/qtiPreviewer.min', + 'position' => null, + 'name' => 'QTI Test Previewer', + 'description' => 'QTI implementation of the test previewer', + 'category' => 'previewer', + 'active' => true, + 'tags' => [ + 'core', + 'qti', + 'previewer', + ], + ])); - return new \common_report_Report(\common_report_Report::TYPE_SUCCESS, 'The QTI Test Previewer is registered'); + return Report::createSuccess('The QTI Test Previewer is registered'); } -} \ No newline at end of file +} From 1e10eb8039337f1054a56081891180cec71ee473 Mon Sep 17 00:00:00 2001 From: Andrew Shapiro Date: Tue, 8 Sep 2020 13:18:17 +0300 Subject: [PATCH 02/26] Feature/NEX-1689/Bump versions --- manifest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.php b/manifest.php index 3c64eea2..6c9db489 100755 --- a/manifest.php +++ b/manifest.php @@ -28,12 +28,12 @@ 'label' => 'extension-tao-testqti-previewer', 'description' => 'extension that provides QTI test previewer', 'license' => 'GPL-2.0', - 'version' => '2.19.1', + 'version' => '2.20.0', 'author' => 'Open Assessment Technologies SA', 'requires' => [ 'generis' => '>=12.15.0', 'tao' => '>=45.2.0', - 'taoTests' => '>=12.0.0', + 'taoTests' => '>=14.5.0', 'taoItems' => '>=10.2.0', 'taoQtiTest' => '>=29.0.0', 'taoQtiItem' => '>=23.1.0', From 33f3c3981ca10e20f60d9bf44f8908b1dcdf1251 Mon Sep 17 00:00:00 2001 From: Andrew Shapiro Date: Wed, 9 Sep 2020 14:22:47 +0300 Subject: [PATCH 03/26] Feature/NEX-1689/Use the right services --- scripts/install/RegisterPreviewers.php | 45 ++++++++++++++++------- scripts/install/RegisterTestPreviewer.php | 10 +++-- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/scripts/install/RegisterPreviewers.php b/scripts/install/RegisterPreviewers.php index 5cf3a79f..c91bf209 100644 --- a/scripts/install/RegisterPreviewers.php +++ b/scripts/install/RegisterPreviewers.php @@ -15,16 +15,21 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * Copyright (c) 2018 (original work) Open Assessment Technologies SA; + * Copyright (c) 2018-2020 (original work) Open Assessment Technologies SA; */ +declare(strict_types=1); + namespace oat\taoQtiTestPreviewer\scripts\install; +use common_Exception as Exception; use common_report_Report as Report; use oat\oatbox\extension\InstallAction; use oat\tao\model\modules\DynamicModule; -use oat\taoItems\model\preview\ItemPreviewerService; use oat\taoOutcomeUi\model\ResultsViewerService; +use oat\oatbox\service\exception\InvalidServiceManagerException; +use common_exception_InconsistentData as InconsistentDataException; +use oat\taoItems\model\preview\ItemPreviewerRegistryServiceInterface; /** * Installation action that registers the test runner providers @@ -33,8 +38,7 @@ */ class RegisterPreviewers extends InstallAction { - - public static $providers = [ + private const PROVIDERS = [ 'previewer' => [ [ 'id' => 'qtiItem', @@ -44,29 +48,42 @@ class RegisterPreviewers extends InstallAction 'description' => 'QTI implementation of the item previewer', 'category' => 'previewer', 'active' => true, - 'tags' => [ 'core', 'qti', 'previewer' ] - ] - ] + 'tags' => ['core', 'qti', 'previewer'], + ], + ], ]; + /** + * @param array $params + * + * @throws Exception + * @throws InconsistentDataException + * @throws InvalidServiceManagerException + * + * @return Report + */ public function __invoke($params) { - $registry = $this->getServiceLocator()->get(ItemPreviewerService::SERVICE_ID); - + $serviceManager = $this->getServiceManager(); + + /** @var ItemPreviewerRegistryServiceInterface $registry */ + $registry = $serviceManager->get(ItemPreviewerRegistryServiceInterface::SERVICE_ID); + $count = 0; - foreach (self::$providers as $categoryProviders) { + foreach (self::PROVIDERS as $categoryProviders) { foreach ($categoryProviders as $providerData) { if ($registry->registerAdapter(DynamicModule::fromArray($providerData))) { - $count++; + ++$count; } } } - $service = $this->getServiceManager()->get(ResultsViewerService::SERVICE_ID); + /** @var ResultsViewerService $service */ + $service = $serviceManager->get(ResultsViewerService::SERVICE_ID); $service->setDefaultItemType('qtiItem'); - $this->getServiceManager()->register(ResultsViewerService::SERVICE_ID, $service); + $serviceManager->register(ResultsViewerService::SERVICE_ID, $service); - return new Report(Report::TYPE_SUCCESS, $count . ' providers registered.'); + return Report::createSuccess($count . ' providers registered.'); } } diff --git a/scripts/install/RegisterTestPreviewer.php b/scripts/install/RegisterTestPreviewer.php index a3d8ac64..3fd5f8b3 100644 --- a/scripts/install/RegisterTestPreviewer.php +++ b/scripts/install/RegisterTestPreviewer.php @@ -26,9 +26,9 @@ use common_report_Report as Report; use oat\oatbox\extension\InstallAction; use oat\tao\model\modules\DynamicModule; -use oat\taoTests\models\preview\TestPreviewerRegistryService; use common_exception_InconsistentData as InconsistentData; use oat\oatbox\service\exception\InvalidServiceManagerException; +use oat\taoTests\models\preview\TestPreviewerRegistryServiceInterface; /** * Class RegisterTestPreviewer @@ -38,7 +38,7 @@ class RegisterTestPreviewer extends InstallAction { /** - * @param $params + * @param array $params * * @throws InconsistentData * @throws InvalidServiceManagerException @@ -48,8 +48,10 @@ class RegisterTestPreviewer extends InstallAction */ public function __invoke($params) { - /** @var TestPreviewerRegistryService $testPreviewerService */ - $testPreviewerService = $this->getServiceManager()->get(TestPreviewerRegistryService::SERVICE_ID); + /** @var TestPreviewerRegistryServiceInterface $testPreviewerService */ + $testPreviewerService = $this->getServiceManager()->get( + TestPreviewerRegistryServiceInterface::SERVICE_ID + ); $testPreviewerService->registerAdapter(DynamicModule::fromArray([ 'id' => 'qtiTest', 'module' => 'taoQtiTestPreviewer/previewer/adapter/test/qtiTest', From 702ed1aa54cadef148376526b27d783bbfb580df Mon Sep 17 00:00:00 2001 From: Andrew Shapiro Date: Wed, 9 Sep 2020 14:30:11 +0300 Subject: [PATCH 04/26] Feature/NEX-1689/Bump taoItems and taoTests versions --- manifest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.php b/manifest.php index 6c9db489..0cf03ebd 100755 --- a/manifest.php +++ b/manifest.php @@ -34,7 +34,7 @@ 'generis' => '>=12.15.0', 'tao' => '>=45.2.0', 'taoTests' => '>=14.5.0', - 'taoItems' => '>=10.2.0', + 'taoItems' => '>=10.12.0', 'taoQtiTest' => '>=29.0.0', 'taoQtiItem' => '>=23.1.0', 'taoOutcomeUi' => '>=6.0.0' From 4ac6064326746a2c0b18351c97e65dec6d7eefcc Mon Sep 17 00:00:00 2001 From: Hanna Dzmitryieva Date: Thu, 17 Sep 2020 12:00:25 +0300 Subject: [PATCH 05/26] add itemIdentifier to getItem response --- views/js/previewer/proxy/test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/views/js/previewer/proxy/test.js b/views/js/previewer/proxy/test.js index 3c8ae751..ebbf8e6d 100644 --- a/views/js/previewer/proxy/test.js +++ b/views/js/previewer/proxy/test.js @@ -136,6 +136,7 @@ define([ }) .then(data => { data.itemData = data.content; + data.itemIdentifier = data.content.data.identifier; return data; }); }, From 24258fb4eb00cbdc7c31cb85ef82bdfab017e512 Mon Sep 17 00:00:00 2001 From: Hanna Dzmitryieva Date: Thu, 17 Sep 2020 12:01:22 +0300 Subject: [PATCH 06/26] bump version --- manifest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.php b/manifest.php index 0cf03ebd..3ff96d23 100755 --- a/manifest.php +++ b/manifest.php @@ -28,7 +28,7 @@ 'label' => 'extension-tao-testqti-previewer', 'description' => 'extension that provides QTI test previewer', 'license' => 'GPL-2.0', - 'version' => '2.20.0', + 'version' => '2.21.0', 'author' => 'Open Assessment Technologies SA', 'requires' => [ 'generis' => '>=12.15.0', From 3575a76dd32b606ff2fa9edd8d993a7e6e47b7de Mon Sep 17 00:00:00 2001 From: Hanna Dzmitryieva Date: Thu, 17 Sep 2020 16:20:41 +0300 Subject: [PATCH 07/26] fix unit test --- views/js/test/previewer/proxy/test/test.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/views/js/test/previewer/proxy/test/test.js b/views/js/test/previewer/proxy/test/test.js index 5d2b519d..7d5b2605 100644 --- a/views/js/test/previewer/proxy/test/test.js +++ b/views/js/test/previewer/proxy/test/test.js @@ -248,6 +248,9 @@ define([ receiveToken: '4567', response: { content: { + data: { + identifier: 'item-1' + }, interactions: [{}] }, itemState: { From d24b35b26c667a25dbbbcece9d967fb87d3b6084 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 17:40:16 +0200 Subject: [PATCH 08/26] UNO-636 fix: allow limitless test-item submissions in a test-preview mode --- models/test/mapper/TestPreviewMapper.php | 2 +- test/unit/models/test/mapper/TestPreviewMapperTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/models/test/mapper/TestPreviewMapper.php b/models/test/mapper/TestPreviewMapper.php index f9e93b2c..b8d111d9 100644 --- a/models/test/mapper/TestPreviewMapper.php +++ b/models/test/mapper/TestPreviewMapper.php @@ -98,7 +98,7 @@ public function map(AssessmentTest $test, Route $route, TestPreviewConfig $confi 'label' => $this->getItemLabel($itemUri), 'position' => $offset, 'occurrence' => $occurrence, - 'remainingAttempts' => 0, + 'remainingAttempts' => -1, 'answered' => 0, 'flagged' => false, 'viewed' => false, diff --git a/test/unit/models/test/mapper/TestPreviewMapperTest.php b/test/unit/models/test/mapper/TestPreviewMapperTest.php index 85e4b534..67c8c170 100644 --- a/test/unit/models/test/mapper/TestPreviewMapperTest.php +++ b/test/unit/models/test/mapper/TestPreviewMapperTest.php @@ -108,7 +108,7 @@ public function testMapFullTest(): void 'label' => 'testLabel', 'position' => 0, 'occurrence' => null, - 'remainingAttempts' => 0, + 'remainingAttempts' => -1, 'answered' => 0, 'flagged' => false, 'viewed' => false, From 50adf5b6b22bc5118dd553292311e259968a64df Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 17:40:43 +0200 Subject: [PATCH 09/26] UNO-636 chore(version): bump a fix one --- manifest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.php b/manifest.php index 0cf03ebd..b97270c9 100755 --- a/manifest.php +++ b/manifest.php @@ -28,7 +28,7 @@ 'label' => 'extension-tao-testqti-previewer', 'description' => 'extension that provides QTI test previewer', 'license' => 'GPL-2.0', - 'version' => '2.20.0', + 'version' => '2.20.1', 'author' => 'Open Assessment Technologies SA', 'requires' => [ 'generis' => '>=12.15.0', From f8cad3d9aa068247c886952054d33de25de5a4a7 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 13:49:01 +0200 Subject: [PATCH 10/26] UNO-631 fix(dependency): explicitly require `qtism/qtism` as its classes are being used directly by the extension --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index f9cf7be8..0b44c8b4 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,8 @@ }, "minimum-stability": "dev", "require": { - "oat-sa/oatbox-extension-installer": "~1.1||dev-master" + "oat-sa/oatbox-extension-installer": "~1.1||dev-master", + "qtism/qtism": "~0" }, "autoload": { "psr-4": { @@ -35,4 +36,3 @@ } } } - From c4081cf645c64a4483bac7ec3ca631c391b76aef Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 13:55:00 +0200 Subject: [PATCH 11/26] UNO-631 chore: use a null-coalescing operator instead of the ternary one in `TestPreviewMapper::map()` in order to retrieve a `review.displaySubsectionTitle` --- models/test/mapper/TestPreviewMapper.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/models/test/mapper/TestPreviewMapper.php b/models/test/mapper/TestPreviewMapper.php index b8d111d9..62d552be 100644 --- a/models/test/mapper/TestPreviewMapper.php +++ b/models/test/mapper/TestPreviewMapper.php @@ -46,9 +46,7 @@ public function map(AssessmentTest $test, Route $route, TestPreviewConfig $confi $routeItems = $route->getAllRouteItems(); $checkInformational = $config->get(TestPreviewConfig::CHECK_INFORMATIONAL); $forceInformationalTitles = $config->get(TestPreviewConfig::REVIEW_FORCE_INFORMATION_TITLE); - $displaySubsectionTitle = $config->get(TestPreviewConfig::REVIEW_DISPLAY_SUBSECTION_TITLE) === null - ? true - : $config->get(TestPreviewConfig::REVIEW_DISPLAY_SUBSECTION_TITLE); + $displaySubsectionTitle = $config->get(TestPreviewConfig::REVIEW_DISPLAY_SUBSECTION_TITLE) ?? true; $map['title'] = $test->getTitle(); $map['identifier'] = $test->getIdentifier(); From 312542b82245c32ff8bf9eed5081936d33c34289 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 13:56:52 +0200 Subject: [PATCH 12/26] UNO-631 chore: inline `TestPreviewMapper::getRouteItemAssessmentItemRefs()` call and add a docblock to it, specifying return-array elements' type --- models/test/mapper/TestPreviewMapper.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/models/test/mapper/TestPreviewMapper.php b/models/test/mapper/TestPreviewMapper.php index 62d552be..9f87d4ef 100644 --- a/models/test/mapper/TestPreviewMapper.php +++ b/models/test/mapper/TestPreviewMapper.php @@ -26,8 +26,8 @@ use oat\oatbox\service\ConfigurableService; use oat\taoQtiTestPreviewer\models\test\TestPreviewConfig; use oat\taoQtiTestPreviewer\models\test\TestPreviewMap; +use qtism\data\AssessmentItemRef; use qtism\data\AssessmentTest; -use qtism\data\IAssessmentItem; use qtism\data\NavigationMode; use qtism\runtime\tests\Route; use qtism\runtime\tests\RouteItem; @@ -61,10 +61,7 @@ public function map(AssessmentTest $test, Route $route, TestPreviewConfig $confi /** @var RouteItem $routeItem */ foreach ($routeItems as $routeItem) { - $itemRefs = $this->getRouteItemAssessmentItemRefs($routeItem); - - /** @var IAssessmentItem $itemRef */ - foreach ($itemRefs as $itemRef) { + foreach ($this->getRouteItemAssessmentItemRefs($routeItem) as $itemRef) { $occurrence = $routeItem->getOccurence(); $isItemInformational = true; //@TODO Implement this as a feature @@ -186,6 +183,11 @@ private function updateStats(array &$target, array $itemInfos): void $target['stats']['total']++; } + /** + * @param RouteItem $routeItem + * + * @return AssessmentItemRef[] + */ private function getRouteItemAssessmentItemRefs(RouteItem $routeItem): array { return [ From 8596e38a4df59adae0219d56a7f13ee20c0ed98d Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 13:57:25 +0200 Subject: [PATCH 13/26] UNO-631 fix(code style): use a strict comparison in `TestPreviewMapper::map()` when comparing section IDs --- models/test/mapper/TestPreviewMapper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/test/mapper/TestPreviewMapper.php b/models/test/mapper/TestPreviewMapper.php index 9f87d4ef..9a97956a 100644 --- a/models/test/mapper/TestPreviewMapper.php +++ b/models/test/mapper/TestPreviewMapper.php @@ -80,7 +80,7 @@ public function map(AssessmentTest $test, Route $route, TestPreviewConfig $confi $sectionId = $section->getIdentifier(); $itemId = $itemRef->getIdentifier(); - if ($lastSection != $sectionId) { + if ($lastSection !== $sectionId) { $offsetSection = 0; $lastSection = $sectionId; } From cbda77be651c4d99c09f3bb36419d78cb90ef648 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 13:59:07 +0200 Subject: [PATCH 14/26] UNO-631 fix(code style): static references to static test case methods in `TestPreviewMapperTest` --- test/unit/models/test/mapper/TestPreviewMapperTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/models/test/mapper/TestPreviewMapperTest.php b/test/unit/models/test/mapper/TestPreviewMapperTest.php index 67c8c170..d9018af6 100644 --- a/test/unit/models/test/mapper/TestPreviewMapperTest.php +++ b/test/unit/models/test/mapper/TestPreviewMapperTest.php @@ -59,7 +59,7 @@ protected function setUp(): void public function testMapEmptyTest(): void { - $this->assertEquals( + static::assertEquals( new TestPreviewMap( [ 'scope' => 'test', @@ -85,7 +85,7 @@ public function testMapFullTest(): void $this->expectsItemResource('itemUri', 'testLabel'); - $this->assertEquals( + static::assertEquals( new TestPreviewMap( [ 'scope' => 'test', From cd7a3df388bc7daad27fbff299b7c0d98dc31bd7 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 14:02:59 +0200 Subject: [PATCH 15/26] UNO-631 feat: provide actual item categories as a result of `TestPreviewMapper::map()` --- models/test/mapper/TestPreviewMapper.php | 2 +- .../test/mapper/TestPreviewMapperTest.php | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/models/test/mapper/TestPreviewMapper.php b/models/test/mapper/TestPreviewMapper.php index 9a97956a..e798915f 100644 --- a/models/test/mapper/TestPreviewMapper.php +++ b/models/test/mapper/TestPreviewMapper.php @@ -97,7 +97,7 @@ public function map(AssessmentTest $test, Route $route, TestPreviewConfig $confi 'answered' => 0, 'flagged' => false, 'viewed' => false, - 'categories' => [], + 'categories' => $itemRef->getCategories()->getArrayCopy(), ]; if ($checkInformational) { diff --git a/test/unit/models/test/mapper/TestPreviewMapperTest.php b/test/unit/models/test/mapper/TestPreviewMapperTest.php index d9018af6..e6ef63c5 100644 --- a/test/unit/models/test/mapper/TestPreviewMapperTest.php +++ b/test/unit/models/test/mapper/TestPreviewMapperTest.php @@ -29,6 +29,7 @@ use oat\taoQtiTestPreviewer\models\test\TestPreviewConfig; use oat\taoQtiTestPreviewer\models\test\TestPreviewMap; use PHPUnit\Framework\MockObject\MockObject; +use qtism\common\collections\StringCollection; use qtism\data\AssessmentItemRef; use qtism\data\AssessmentSection; use qtism\data\AssessmentTest; @@ -78,9 +79,15 @@ public function testMapEmptyTest(): void public function testMapFullTest(): void { - $testPart = $this->expectsTestPart('partId'); - $section = $this->expectSection('sectionId', 'sectionTitle'); - $itemRef = $this->expectsItemRef('itemUri', 'itemId'); + $itemId = 'itemId'; + $sectionTitle = 'sectionTitle'; + $categories = [ + 'x-tao-test', + ]; + + $testPart = $this->expectsTestPart('partId'); + $section = $this->expectSection('sectionId', $sectionTitle); + $itemRef = $this->expectsItemRef('itemUri', $itemId, $categories); $routeItem = $this->expectRouteItem($itemRef, $testPart, $section); $this->expectsItemResource('itemUri', 'testLabel'); @@ -98,12 +105,12 @@ public function testMapFullTest(): void 'sections' => [ 'sectionId' => [ 'id' => 'sectionId', - 'label' => 'sectionTitle', + 'label' => $sectionTitle, 'isCatAdaptive' => false, 'position' => 0, 'items' => [ 'itemId' => [ - 'id' => 'itemId', + 'id' => $itemId, 'uri' => 'itemUri', 'label' => 'testLabel', 'position' => 0, @@ -112,7 +119,7 @@ public function testMapFullTest(): void 'answered' => 0, 'flagged' => false, 'viewed' => false, - 'categories' => [], + 'categories' => $categories, ], ], 'stats' => [ @@ -170,7 +177,7 @@ private function expectsItemResource(string $itemUri, string $label): core_kerne return $itemResource; } - private function expectsItemRef(string $itemUri, string $itemId): AssessmentItemRef + private function expectsItemRef(string $itemUri, string $itemId, array $categories): AssessmentItemRef { $itemRef = $this->createMock(AssessmentItemRef::class); @@ -180,6 +187,11 @@ private function expectsItemRef(string $itemUri, string $itemId): AssessmentItem $itemRef->method('getIdentifier') ->willReturn($itemId); + $itemRef->method('getCategories') + ->willReturn( + new StringCollection($categories) + ); + return $itemRef; } From fc7c572b99dc8f5140dc023b0a02920dbe1d9932 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Tue, 22 Sep 2020 17:18:48 +0200 Subject: [PATCH 16/26] UNO-631 chore(version): bump a fix one --- manifest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.php b/manifest.php index b97270c9..db156e7a 100755 --- a/manifest.php +++ b/manifest.php @@ -28,7 +28,7 @@ 'label' => 'extension-tao-testqti-previewer', 'description' => 'extension that provides QTI test previewer', 'license' => 'GPL-2.0', - 'version' => '2.20.1', + 'version' => '2.20.2', 'author' => 'Open Assessment Technologies SA', 'requires' => [ 'generis' => '>=12.15.0', From 8b65b5179eaac675b44f525e2bb0ec808210eb9c Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 18:12:32 +0200 Subject: [PATCH 17/26] NEX-1520 fix: return type of `qtiTest.qtiTestPreviewerFactory()` --- views/js/previewer/component/test/qtiTest.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/views/js/previewer/component/test/qtiTest.js b/views/js/previewer/component/test/qtiTest.js index 3ede5eb6..cab55f4b 100644 --- a/views/js/previewer/component/test/qtiTest.js +++ b/views/js/previewer/component/test/qtiTest.js @@ -36,7 +36,8 @@ define([ * @param {Object[]} [config.plugins] - Additional plugins to load * @param {String} [config.fullPage] - Force the previewer to occupy the full window. * @param {String} [config.readOnly] - Do not allow to modify the previewed item. - * @returns {previewer} + * + * @returns {runner} */ return function qtiTestPreviewerFactory(container, config = {}) { const testRunnerConfig = { From de5e9adccd29e4d6fb9cc4fd13af0fee523bc519 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Mon, 21 Sep 2020 18:30:26 +0200 Subject: [PATCH 18/26] NEX-1520 feat: initialize a `promiseQueue` in `previewer/adapter/qtiTest` to ensure requests order when a `TestPreviewer/configuration` request will be added --- views/js/previewer/adapter/test/qtiTest.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/views/js/previewer/adapter/test/qtiTest.js b/views/js/previewer/adapter/test/qtiTest.js index c4a3bb56..fcf9013f 100644 --- a/views/js/previewer/adapter/test/qtiTest.js +++ b/views/js/previewer/adapter/test/qtiTest.js @@ -18,8 +18,15 @@ /** * @author Hanna Dzmitryieva */ -define(['lodash', 'core/logger', 'taoQtiTestPreviewer/previewer/component/test/qtiTest', 'ui/feedback'], function ( +define([ + 'lodash', + 'core/promiseQueue', + 'core/logger', + 'taoQtiTestPreviewer/previewer/component/test/qtiTest', + 'ui/feedback' +], function ( _, + promiseQueue, loggerFactory, qtiTestPreviewerFactory, feedback @@ -61,6 +68,10 @@ define(['lodash', 'core/logger', 'taoQtiTestPreviewer/previewer/component/test/q return { name: 'qtiTest', + install() { + this.queue = promiseQueue(); + }, + /** * Builds and shows the test previewer * @@ -80,6 +91,12 @@ define(['lodash', 'core/logger', 'taoQtiTestPreviewer/previewer/component/test/q } logger.error(err); }); - } + }, + + destroy() { + this.queue = null; + + return Promise.resolve(); + }, }; }); From 569e8f12196f547014ece5faff98336f84d3964c Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Tue, 22 Sep 2020 11:16:04 +0200 Subject: [PATCH 19/26] NEX-1520 fix: add a missing `@return` annotation to `TestPreviewerConfigurationMapper::map()`'s docblock --- .../mapper/TestPreviewerConfigurationMapper.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php b/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php index 26ee3e7d..b18e5cc2 100644 --- a/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php +++ b/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php @@ -32,9 +32,10 @@ class TestPreviewerConfigurationMapper extends ConfigurableService { /** * @param ProviderModule[] $providerModules - * @param PluginModule[] $plugins - * @param mixed[] $options + * @param PluginModule[] $plugins + * @param mixed[] $options * + * @return TestPreviewerConfig */ public function map(array $providerModules, array $plugins, array $options): TestPreviewerConfig { From b5e5aaf8cae32412801d87d4df20c3b1f1e66547 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Tue, 22 Sep 2020 11:16:33 +0200 Subject: [PATCH 20/26] NEX-1520 chore: remove a redundant conditional statement from `TestPreviewerConfigurationMapper::getActiveProviders()` --- .../mapper/TestPreviewerConfigurationMapper.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php b/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php index b18e5cc2..229ca510 100644 --- a/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php +++ b/models/testConfiguration/mapper/TestPreviewerConfigurationMapper.php @@ -56,10 +56,6 @@ private function getActiveProviders(array $providerModules, array $plugins): arr if ($provider->isActive()) { $category = $provider->getCategory(); - if (!isset($providers[$category])) { - $providers[$category] = []; - } - $providers[$category][] = $provider; } } From 423ed3b86f4cacde4158573f2eab4b8fb430cc83 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Tue, 22 Sep 2020 11:29:15 +0200 Subject: [PATCH 21/26] NEX-1520 feat: use server-side test preview configuration, acquired from `TestPreviewer/configuration` when initializing `qtiTestPreviewerFactory` --- views/js/previewer/adapter/test/qtiTest.js | 40 +- views/js/previewer/component/test/qtiTest.js | 51 +- .../js/test/previewer/adapter/qtiTest/test.js | 21 +- .../test/previewer/component/qtiTest/test.js | 51 +- views/js/test/samples/json/configuration.json | 664 ++++++++++++++++++ 5 files changed, 738 insertions(+), 89 deletions(-) create mode 100644 views/js/test/samples/json/configuration.json diff --git a/views/js/previewer/adapter/test/qtiTest.js b/views/js/previewer/adapter/test/qtiTest.js index fcf9013f..1dcce1df 100644 --- a/views/js/previewer/adapter/test/qtiTest.js +++ b/views/js/previewer/adapter/test/qtiTest.js @@ -21,18 +21,26 @@ define([ 'lodash', 'core/promiseQueue', + 'core/request', + 'util/url', 'core/logger', 'taoQtiTestPreviewer/previewer/component/test/qtiTest', 'ui/feedback' ], function ( _, promiseQueue, + request, + urlUtil, loggerFactory, qtiTestPreviewerFactory, feedback ) { 'use strict'; + const taoExtension = 'taoQtiTestPreviewer'; + + const testPreviewerController = 'TestPreviewer'; + const logger = loggerFactory('taoQtiTestPreviewer/previewer'); /** @@ -62,6 +70,23 @@ define([ } ]; + const transformConfiguration = config => { + const plugins = Array.isArray(config.plugins) ? config.plugins : []; + const {view, readOnly, fullPage, hideActionBars} = config; + const options = _.omit({view, readOnly, fullPage, hideActionBars}, _.isUndefined); + + return request({ + url: urlUtil.route('configuration', testPreviewerController, taoExtension), + }).then(response => { + const configuration = response.data; + + configuration.providers.plugins = (configuration.providers.plugins || defaultPlugins).concat(plugins); + _.assign(configuration.options, options); + + return configuration; + }); + }; + /** * Wraps the test previewer in order to be loaded by the taoItems previewer factory */ @@ -83,13 +108,14 @@ define([ * @returns {Object} */ init(testUri, config = {}) { - config.testUri = testUri; - config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins; - return qtiTestPreviewerFactory(window.document.body, config).on('error', function (err) { - if (!_.isUndefined(err.message)) { - feedback().error(err.message); - } - logger.error(err); + return transformConfiguration(config).then(config => { + config.options.testUri = testUri; + return qtiTestPreviewerFactory(window.document.body, config).on('error', function (err) { + if (!_.isUndefined(err.message)) { + feedback().error(err.message); + } + logger.error(err); + }); }); }, diff --git a/views/js/previewer/component/test/qtiTest.js b/views/js/previewer/component/test/qtiTest.js index cab55f4b..69631939 100644 --- a/views/js/previewer/component/test/qtiTest.js +++ b/views/js/previewer/component/test/qtiTest.js @@ -32,51 +32,26 @@ define([ * Builds a test runner to preview test * @param {jQuery|HTMLElement|String} container - The container in which renders the component * @param {Object} [config] - The testRunner options - * @param {String} [config.testUri] - The test URI - * @param {Object[]} [config.plugins] - Additional plugins to load - * @param {String} [config.fullPage] - Force the previewer to occupy the full window. - * @param {String} [config.readOnly] - Do not allow to modify the previewed item. * * @returns {runner} */ return function qtiTestPreviewerFactory(container, config = {}) { const testRunnerConfig = { - testDefinition: 'test-container', - serviceCallId: 'previewer', - providers: { - runner: { - id: 'qti', - module: 'taoQtiTest/runner/provider/qti', - bundle: 'taoQtiTest/loader/taoQtiTestRunner.min', - category: 'runner' - }, - proxy: { - id: 'qtiTestPreviewerProxy', - module: 'taoQtiTestPreviewer/previewer/proxy/test', - bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min', - category: 'proxy' - }, - communicator: { - id: 'request', - module: 'core/communicator/request', - bundle: 'loader/vendor.min', - category: 'communicator' - }, - plugins: config.plugins || [] - }, - options: { - view: config.view, - readOnly: config.readOnly, - fullPage: config.fullPage, - plugins: config.plugins, - hideActionBars: config.hideActionBars, - testUri: config.testUri - }, - proxyProvider: 'qtiTestPreviewerProxy' + ...config, + ...{ + testDefinition: 'test-container', + serviceCallId: 'previewer', + proxyProvider: 'qtiTestPreviewerProxy', + loadFromBundle: !!context.bundle, + } }; - //extra context config - testRunnerConfig.loadFromBundle = !!context.bundle; + testRunnerConfig.providers.proxy = [{ + id: 'qtiTestPreviewerProxy', + module: 'taoQtiTestPreviewer/previewer/proxy/test', + bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min', + category: 'proxy' + }]; return runnerComponentFactory(container, testRunnerConfig, runnerTpl) .on('render', function() { diff --git a/views/js/test/previewer/adapter/qtiTest/test.js b/views/js/test/previewer/adapter/qtiTest/test.js index 8a9ad985..f5a5051e 100644 --- a/views/js/test/previewer/adapter/qtiTest/test.js +++ b/views/js/test/previewer/adapter/qtiTest/test.js @@ -23,10 +23,11 @@ define([ 'jquery', 'taoQtiTestPreviewer/previewer/adapter/test/qtiTest', + 'json!taoQtiTestPreviewer/test/samples/json/configuration.json', 'json!taoQtiTestPreviewer/test/samples/json/initTestPreview.json', 'json!taoQtiTestPreviewer/test/samples/json/itemData.json', 'lib/jquery.mockjax/jquery.mockjax' -], function($, previewerAdapter, initTestPreview, itemData) { +], function($, previewerAdapter, configuration, initTestPreview, itemData) { 'use strict'; QUnit.module('API'); @@ -64,6 +65,11 @@ define([ function displayPreviewer(config) { $.mockjax.clear(); + $.mockjax({ + url: '*/configuration', + responseText: configuration + }); + $.mockjax({ url: '*/init', responseText: initTestPreview @@ -80,12 +86,13 @@ define([ assert.expect(1); displayPreviewer(configReadOnly) - .before('ready', function(e, runner) { - runner.after('renderitem.runnerComponent', function() { - assert.ok(true, 'The previewer has been rendered'); - ready(); - }); - }); + .then(displayPreviewer => + displayPreviewer.before('ready', function (e, runner) { + runner.after('renderitem.runnerComponent', function () { + assert.ok(true, 'The previewer has been rendered'); + ready(); + }); + })); $('#show-interactive').on('click', function(e) { e.preventDefault(); diff --git a/views/js/test/previewer/component/qtiTest/test.js b/views/js/test/previewer/component/qtiTest/test.js index 7b529826..9f25444e 100644 --- a/views/js/test/previewer/component/qtiTest/test.js +++ b/views/js/test/previewer/component/qtiTest/test.js @@ -23,10 +23,11 @@ define([ 'jquery', 'lodash', 'taoQtiTestPreviewer/previewer/component/test/qtiTest', + 'json!taoQtiTestPreviewer/test/samples/json/configuration.json', 'json!taoQtiTestPreviewer/test/samples/json/initTestPreview.json', 'json!taoQtiTestPreviewer/test/samples/json/itemData.json', 'lib/jquery.mockjax/jquery.mockjax' -], function($, _, qtiTestPreviewerFactory, initTestPreview, itemData) { +], function($, _, qtiTestPreviewerFactory, configuration, initTestPreview, itemData) { 'use strict'; QUnit.module('API'); @@ -40,31 +41,11 @@ define([ $.mockjax.clear(); }); - const plugins = [ - { - module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher', - bundle: 'taoQtiTest/loader/testPlugins.min', - category: 'tools' - }, - { - module: 'taoQtiTest/runner/plugins/navigation/previous', - bundle: 'taoQtiTest/loader/testPlugins.min', - category: 'navigation' - }, - { - module: 'taoQtiTest/runner/plugins/navigation/next', - bundle: 'taoQtiTest/loader/testPlugins.min', - category: 'navigation' - } - ]; QUnit.test('module', assert => { const ready = assert.async(); - const config = { - plugins - }; - const previewer1 = qtiTestPreviewerFactory('#fixture-api', config); - const previewer2 = qtiTestPreviewerFactory('#fixture-api', config); + const previewer1 = qtiTestPreviewerFactory('#fixture-api', configuration.data); + const previewer2 = qtiTestPreviewerFactory('#fixture-api', configuration.data); assert.expect(4); $.mockjax({ @@ -104,15 +85,12 @@ define([ }]).test('render test ', (data, assert) => { const ready = assert.async(); const $container = $('#fixture-render'); - const config = { - plugins - }; assert.expect(1); $.mockjax(data.mock); - qtiTestPreviewerFactory($container, config) + qtiTestPreviewerFactory($container, configuration.data) .on('error', function(err) { assert.ok(false, 'An error has occurred'); assert.pushResult({ @@ -131,16 +109,17 @@ define([ QUnit.test('config', assert => { const ready = assert.async(); - const config = { + const config = configuration.data; + + _.assign(config.options, { view: 'scorer', readOnly: true, fullPage: true, hideActionBars: true, - plugins - }; + }); const previewerWithOptions = qtiTestPreviewerFactory('#fixture-api', config); - const previewerWithoutOptions = qtiTestPreviewerFactory('#fixture-api', { plugins }); + const previewerWithoutOptions = qtiTestPreviewerFactory('#fixture-api', configuration.data); assert.expect(2); $.mockjax({ @@ -164,12 +143,12 @@ define([ }).then(([runnerWithOptions, runnerWithoutOptions]) => { assert.deepEqual( runnerWithOptions.getConfig().options, - { view: 'scorer', readOnly: true, fullPage: true, plugins: plugins, hideActionBars: true, testUri: undefined }, + config.options, 'The previewer factory set options using config' ); assert.deepEqual( runnerWithoutOptions.getConfig().options, - { view: undefined,readOnly: undefined, fullPage: undefined, plugins: plugins, hideActionBars: undefined, testUri: undefined }, + configuration.data.options, 'The previewer factory leave options undefined if config empty' ); @@ -180,7 +159,6 @@ define([ QUnit.test('destroy', assert => { const ready = assert.async(); const $container = $('#fixture-destroy'); - const config = { plugins }; assert.expect(2); @@ -194,7 +172,7 @@ define([ responseText: itemData }); - qtiTestPreviewerFactory($container, config) + qtiTestPreviewerFactory($container, configuration.data) .on('error', function(err) { assert.ok(false, 'An error has occurred'); assert.pushResult({ @@ -218,7 +196,6 @@ define([ QUnit.test('Visual test', function (assert) { const ready = assert.async(); const $container = $('#visual-test'); - const config = { plugins }; assert.expect(1); @@ -232,7 +209,7 @@ define([ responseText: itemData }); - qtiTestPreviewerFactory($container, config) + qtiTestPreviewerFactory($container, configuration.data) .on('error', function(err) { assert.ok(false, 'An error has occurred'); assert.pushResult({ diff --git a/views/js/test/samples/json/configuration.json b/views/js/test/samples/json/configuration.json new file mode 100644 index 00000000..9c46ea45 --- /dev/null +++ b/views/js/test/samples/json/configuration.json @@ -0,0 +1,664 @@ + { + "success": true, + "data": { + "providers": { + "runner": [ + { + "id": "qti", + "module": "taoQtiTest\/runner\/provider\/qti", + "bundle": "taoQtiTest\/loader\/taoQtiTestRunner.min", + "position": null, + "name": "QTI runner", + "description": "QTI implementation of the test runner", + "category": "runner", + "active": true, + "tags": [ + "core", + "qti", + "runner" + ] + } + ], + "communicator": [ + { + "id": "request", + "module": "core\/communicator\/request", + "bundle": null, + "position": null, + "name": "request communicator", + "description": "", + "category": "communicator", + "active": true, + "tags": [] + }, + { + "id": "poll", + "module": "core\/communicator\/poll", + "bundle": null, + "position": null, + "name": "poll communicator", + "description": "", + "category": "communicator", + "active": true, + "tags": [] + } + ], + "proxy": [ + { + "id": "qtiServiceProxy", + "module": "taoQtiTest\/runner\/proxy\/qtiServiceProxy", + "bundle": "taoQtiTest\/loader\/taoQtiTestRunner.min", + "position": null, + "name": "", + "description": "", + "category": "proxy", + "active": true, + "tags": [] + } + ], + "plugins": [ + { + "id": "rubricBlock", + "module": "taoQtiTest\/runner\/plugins\/content\/rubricBlock\/rubricBlock", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Rubric Block", + "description": "Display test rubric blocks", + "category": "content", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "overlay", + "module": "taoQtiTest\/runner\/plugins\/content\/overlay\/overlay", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Overlay", + "description": "Add an overlay over items when disabled", + "category": "content", + "active": true, + "tags": [ + "core", + "technical", + "required" + ] + }, + { + "id": "dialog", + "module": "taoQtiTest\/runner\/plugins\/content\/dialog\/dialog", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Dialog", + "description": "Display popups that require user interactions", + "category": "content", + "active": true, + "tags": [ + "core", + "technical", + "required" + ] + }, + { + "id": "feedback", + "module": "taoQtiTest\/runner\/plugins\/content\/feedback\/feedback", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Feedback", + "description": "Display notifications into feedback popups", + "category": "content", + "active": true, + "tags": [ + "core", + "technical", + "required" + ] + }, + { + "id": "exitMessages", + "module": "taoQtiTest\/runner\/plugins\/content\/dialog\/exitMessages", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Exit Messages", + "description": "Display messages when a test taker leaves the test", + "category": "content", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "loading", + "module": "taoQtiTest\/runner\/plugins\/content\/loading\/loading", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Loading bar", + "description": "Show a loading bar when the test is loading", + "category": "content", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "title", + "module": "taoQtiTest\/runner\/plugins\/controls\/title\/title", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Title indicator", + "description": "Display the title of current test element", + "category": "controls", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "modalFeedback", + "module": "taoQtiTest\/runner\/plugins\/content\/modalFeedback\/modalFeedback", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "QTI modal feedbacks", + "description": "Display Qti modalFeedback element", + "category": "content", + "active": true, + "tags": [ + "core", + "qti", + "required" + ] + }, + { + "id": "keyNavigation", + "module": "taoQtiTest\/runner\/plugins\/content\/accessibility\/keyNavigation\/plugin", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Keyboard Navigation", + "description": "Provide a way to navigate within the test runner with the keyboard", + "category": "content", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "collapser", + "module": "taoQtiTest\/runner\/plugins\/content\/responsiveness\/collapser", + "bundle": null, + "position": null, + "name": "Collapser", + "description": "Reduce the size of the tools when the available space is not enough", + "category": "content", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "focusOnFirstField", + "module": "taoQtiTest\/runner\/plugins\/content\/accessibility\/focusOnFirstField", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Focus on first form field", + "description": "Sets focus on first form field", + "category": "content", + "active": true, + "tags": [] + }, + { + "id": "timer", + "module": "taoQtiTest\/runner\/plugins\/controls\/timer\/plugin", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Timer indicator", + "description": "Add countdown when remaining time", + "category": "controls", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "progressbar", + "module": "taoQtiTest\/runner\/plugins\/controls\/progressbar\/progressbar", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Progress indicator", + "description": "Display the current progression within the test", + "category": "controls", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "duration", + "module": "taoQtiTest\/runner\/plugins\/controls\/duration\/duration", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Duration record", + "description": "Record accurately time spent by the test taker", + "category": "controls", + "active": true, + "tags": [ + "core", + "technical", + "required" + ] + }, + { + "id": "connectivity", + "module": "taoQtiTest\/runner\/plugins\/controls\/connectivity\/connectivity", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Connectivity check", + "description": "Pause the test when the network loose the connection", + "category": "controls", + "active": true, + "tags": [ + "core", + "technical" + ] + }, + { + "id": "testState", + "module": "taoQtiTest\/runner\/plugins\/controls\/testState\/testState", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Test state", + "description": "Manage test state", + "category": "controls", + "active": true, + "tags": [ + "core", + "technical", + "required" + ] + }, + { + "id": "review", + "module": "taoQtiTest\/runner\/plugins\/navigation\/review\/review", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Navigation and review panel", + "description": "Enable a panel to handle navigation and item reviews", + "category": "navigation", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "previous", + "module": "taoQtiTest\/runner\/plugins\/navigation\/previous", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Previous button", + "description": "Enable to move backward", + "category": "navigation", + "active": true, + "tags": [ + "core", + "qti", + "required" + ] + }, + { + "id": "next", + "module": "taoQtiTest\/runner\/plugins\/navigation\/next", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Next button", + "description": "Enable to move forward", + "category": "navigation", + "active": true, + "tags": [ + "core", + "qti", + "required" + ] + }, + { + "id": "nextSection", + "module": "taoQtiTest\/runner\/plugins\/navigation\/nextSection", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Next section button", + "description": "Enable to move to the next available section", + "category": "navigation", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "skip", + "module": "taoQtiTest\/runner\/plugins\/navigation\/skip", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Skip button", + "description": "Skip the current item", + "category": "navigation", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "allowSkipping", + "module": "taoQtiTest\/runner\/plugins\/navigation\/allowSkipping", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Allow Skipping", + "description": "Prevent submission of default\/null responses", + "category": "navigation", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "validateResponses", + "module": "taoQtiTest\/runner\/plugins\/navigation\/validateResponses", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Validate Responses", + "description": "Prevent submission of invalid responses", + "category": "navigation", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "comment", + "module": "taoQtiTest\/runner\/plugins\/tools\/comment\/comment", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Comment tool", + "description": "Allow test taker to comment an item", + "category": "tools", + "active": true, + "tags": [ + "core", + "qti" + ] + }, + { + "id": "calculator", + "module": "taoQtiTest\/runner\/plugins\/tools\/calculator", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Caculator tool", + "description": "Gives the student access to a basic calculator", + "category": "tools", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "zoom", + "module": "taoQtiTest\/runner\/plugins\/tools\/zoom", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Zoom", + "description": "Zoom in and out the item content", + "category": "tools", + "active": true, + "tags": [ + "core" + ] + }, + { + "id": "highlighter", + "module": "taoQtiTest\/runner\/plugins\/tools\/highlighter\/plugin", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Text Highlighter", + "description": "Allows the test taker to highlight text", + "category": "tools", + "active": true, + "tags": [] + }, + { + "id": "magnifier", + "module": "taoQtiTest\/runner\/plugins\/tools\/magnifier\/magnifier", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Magnifier", + "description": "Gives student access to a magnification tool", + "category": "tools", + "active": true, + "tags": [] + }, + { + "id": "lineReader", + "module": "taoQtiTest\/runner\/plugins\/tools\/lineReader\/plugin", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Line Reader", + "description": "Display a customisable mask with a customisable hole in it!", + "category": "tools", + "active": true, + "tags": [] + }, + { + "id": "answerMasking", + "module": "taoQtiTest\/runner\/plugins\/tools\/answerMasking\/plugin", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Answer Masking", + "description": "Hide all answers of a choice interaction and allow revealing them", + "category": "tools", + "active": true, + "tags": [] + }, + { + "id": "eliminator", + "module": "taoQtiTest\/runner\/plugins\/tools\/answerElimination\/eliminator", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Eliminate choices", + "description": "Allows student to eliminate choices", + "category": "tools", + "active": true, + "tags": [] + }, + { + "id": "area-masking", + "module": "taoQtiTest\/runner\/plugins\/tools\/areaMasking\/areaMasking", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "Area Masking", + "description": "Mask areas of the item", + "category": "tools", + "active": true, + "tags": [] + }, + { + "id": "apiptts", + "module": "taoQtiTest\/runner\/plugins\/tools\/apipTextToSpeech\/plugin", + "bundle": "taoQtiTest\/loader\/testPlugins.min", + "position": null, + "name": "APIP Text To Speech", + "description": "Allow Test-taker to playback media files associated according to APIP protocol to item content.", + "category": "tools", + "active": true, + "tags": [] + } + ] + }, + "options": { + "timerWarning": { + "assessmentItemRef": null, + "assessmentSection": null, + "testPart": null, + "assessmentTest": null + }, + "timerWarningForScreenreader": null, + "catEngineWarning": null, + "progressIndicator": { + "type": "percentage", + "renderer": "percentage", + "scope": "test", + "forced": false, + "showLabel": true, + "showTotal": true, + "categories": [] + }, + "review": { + "enabled": true, + "scope": "test", + "useTitle": true, + "forceTitle": false, + "forceInformationalTitle": false, + "showLegend": true, + "defaultOpen": true, + "itemTitle": "Item %d", + "informationalItemTitle": "Instructions", + "preventsUnseen": true, + "canCollapse": false, + "displaySubsectionTitle": true, + "allowSkipahead": false + }, + "exitButton": false, + "nextSection": false, + "plugins": { + "answer-masking": { + "restoreStateOnToggle": true, + "restoreStateOnMove": true + }, + "validateResponses": { + "validateOnPreviousMove": true + }, + "overlay": { + "full": false + }, + "collapser": { + "collapseTools": true, + "collapseNavigation": false, + "collapseInOrder": false, + "hover": false, + "collapseOrder": [] + }, + "magnifier": { + "zoomMin": 2, + "zoomMax": 8, + "zoomStep": 0.5 + }, + "calculator": { + "template": "", + "degree": true + }, + "dialog": { + "alert": { + "focus": "navigable-modal-body" + }, + "confirm": { + "focus": "navigable-modal-body" + } + }, + "keyNavigation": { + "contentNavigatorType": "default" + }, + "answerCache": { + "allAttempts": false + }, + "sessionHeartbeat": { + "interval": "900", + "action": "up" + } + }, + "security": { + "csrfToken": true + }, + "timer": { + "target": "server", + "resetAfterResume": false, + "keepUpToTimeout": false, + "restoreTimerFromClient": false + }, + "enableAllowSkipping": true, + "enableValidateResponses": true, + "checkInformational": true, + "enableUnansweredItemsWarning": true, + "allowShortcuts": true, + "shortcuts": { + "calculator": { + "toggle": "C" + }, + "zoom": { + "in": "I", + "out": "O" + }, + "comment": { + "toggle": "A" + }, + "itemThemeSwitcher": { + "toggle": "T" + }, + "review": { + "toggle": "R", + "flag": "M" + }, + "keyNavigation": { + "previous": "Shift+Tab", + "next": "Tab" + }, + "next": { + "trigger": "J", + "triggerAccessibility": "Alt+Shift+N" + }, + "previous": { + "trigger": "K", + "triggerAccessibility": "Alt+Shift+P" + }, + "dialog": [], + "magnifier": { + "toggle": "L", + "in": "Shift+I", + "out": "Shift+O", + "close": "esc" + }, + "highlighter": { + "toggle": "Shift+U" + }, + "area-masking": { + "toggle": "Y" + }, + "line-reader": { + "toggle": "G" + }, + "answer-masking": { + "toggle": "D" + }, + "apiptts": { + "enterTogglePlayback": "Enter", + "togglePlayback": "P", + "spaceTogglePlayback": "Space" + }, + "jumplinks": { + "goToQuestion": "Alt+Shift+Q", + "goToTop": "Alt+Shift+T" + } + }, + "itemCaching": { + "enabled": false, + "amount": 3 + }, + "guidedNavigation": false, + "toolStateServerStorage": [], + "forceEnableLinearNextItemWarning": false, + "enableLinearNextItemWarningCheckbox": true + } + } + } From 3dc21cb1d121d7571d045616c97b5b82c98899e5 Mon Sep 17 00:00:00 2001 From: Hanna Dzmitryieva Date: Tue, 22 Sep 2020 16:02:32 +0300 Subject: [PATCH 22/26] remove defaultplugins --- views/js/previewer/adapter/test/qtiTest.js | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/views/js/previewer/adapter/test/qtiTest.js b/views/js/previewer/adapter/test/qtiTest.js index 1dcce1df..67451b03 100644 --- a/views/js/previewer/adapter/test/qtiTest.js +++ b/views/js/previewer/adapter/test/qtiTest.js @@ -48,21 +48,6 @@ define([ * @type {Object[]} */ const defaultPlugins = [ - { - module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher', - bundle: 'taoQtiTest/loader/testPlugins.min', - category: 'tools' - }, - { - module: 'taoQtiTest/runner/plugins/navigation/previous', - bundle: 'taoQtiTest/loader/testPlugins.min', - category: 'navigation' - }, - { - module: 'taoQtiTest/runner/plugins/navigation/next', - bundle: 'taoQtiTest/loader/testPlugins.min', - category: 'navigation' - }, { module: 'taoQtiTestPreviewer/previewer/plugins/content/cloneLogoInTestPreview', bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min', @@ -71,7 +56,7 @@ define([ ]; const transformConfiguration = config => { - const plugins = Array.isArray(config.plugins) ? config.plugins : []; + const plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins; const {view, readOnly, fullPage, hideActionBars} = config; const options = _.omit({view, readOnly, fullPage, hideActionBars}, _.isUndefined); @@ -80,7 +65,7 @@ define([ }).then(response => { const configuration = response.data; - configuration.providers.plugins = (configuration.providers.plugins || defaultPlugins).concat(plugins); + configuration.providers.plugins = [...configuration.providers.plugins, ...plugins]; _.assign(configuration.options, options); return configuration; From cb42224b20dfff9d2e321a3667cfd12c155b6d41 Mon Sep 17 00:00:00 2001 From: Hanna Dzmitryieva Date: Tue, 22 Sep 2020 16:02:50 +0300 Subject: [PATCH 23/26] fix loading-bar --- views/js/previewer/component/test/qtiTest.js | 21 ++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/views/js/previewer/component/test/qtiTest.js b/views/js/previewer/component/test/qtiTest.js index 69631939..d0e1f2de 100644 --- a/views/js/previewer/component/test/qtiTest.js +++ b/views/js/previewer/component/test/qtiTest.js @@ -20,12 +20,13 @@ */ define([ 'context', - 'jquery', + 'lodash', + 'layout/loading-bar', 'taoTests/runner/runnerComponent', 'tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest', 'css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest', 'css!taoQtiTestCss/new-test-runner' -], function (context, $, runnerComponentFactory, runnerTpl) { +], function (context, __, loadingBar, runnerComponentFactory, runnerTpl) { 'use strict'; /** @@ -36,15 +37,15 @@ define([ * @returns {runner} */ return function qtiTestPreviewerFactory(container, config = {}) { - const testRunnerConfig = { - ...config, - ...{ + const testRunnerConfig = __.defaults( + { testDefinition: 'test-container', serviceCallId: 'previewer', proxyProvider: 'qtiTestPreviewerProxy', loadFromBundle: !!context.bundle, - } - }; + }, + config + ); testRunnerConfig.providers.proxy = [{ id: 'qtiTestPreviewerProxy', @@ -61,7 +62,11 @@ define([ this.setState('hideactionbars', hideActionBars); }) .on('ready', function(runner) { - runner.on('destroy', () => this.destroy()); + runner.on('destroy', () => { + // stop loading bar - started in plugin loading + loadingBar.stop(); + this.destroy(); + }); }); }; }); From 4a8abd877d64480b9efd9d2dca422b9eae6600ef Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Tue, 22 Sep 2020 15:08:11 +0200 Subject: [PATCH 24/26] NEX-1520 chore(version): bump a minor one --- manifest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.php b/manifest.php index db156e7a..3ff96d23 100755 --- a/manifest.php +++ b/manifest.php @@ -28,7 +28,7 @@ 'label' => 'extension-tao-testqti-previewer', 'description' => 'extension that provides QTI test previewer', 'license' => 'GPL-2.0', - 'version' => '2.20.2', + 'version' => '2.21.0', 'author' => 'Open Assessment Technologies SA', 'requires' => [ 'generis' => '>=12.15.0', From e08e5ccdc4b947a8e90592828f5efbdffbc50562 Mon Sep 17 00:00:00 2001 From: Hanna Dzmitryieva Date: Wed, 23 Sep 2020 15:10:10 +0300 Subject: [PATCH 25/26] bump version --- manifest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.php b/manifest.php index 3ff96d23..c3dbbfa5 100755 --- a/manifest.php +++ b/manifest.php @@ -28,7 +28,7 @@ 'label' => 'extension-tao-testqti-previewer', 'description' => 'extension that provides QTI test previewer', 'license' => 'GPL-2.0', - 'version' => '2.21.0', + 'version' => '2.22.0', 'author' => 'Open Assessment Technologies SA', 'requires' => [ 'generis' => '>=12.15.0', From 0cce902a30d286f893260252b7db3cc751a10c65 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Fri, 25 Sep 2020 10:21:47 +0200 Subject: [PATCH 26/26] bundle assets --- views/js/loader/qtiPreviewer.min.js | 2 +- views/js/loader/qtiPreviewer.min.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/js/loader/qtiPreviewer.min.js b/views/js/loader/qtiPreviewer.min.js index b926c2fc..9249a64b 100644 --- a/views/js/loader/qtiPreviewer.min.js +++ b/views/js/loader/qtiPreviewer.min.js @@ -1,2 +1,2 @@ -function _typeof(obj){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(o,minLen){if(o){if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(o):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(iter))return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
"})}),define("taoQtiTestPreviewer/previewer/runner",["taoTests/runner/runnerComponent","tpl!taoQtiTestPreviewer/previewer/runner"],function(runnerComponentFactory,runnerTpl){'use strict';return function(container){var config=1= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
\n
    \n
    "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
  • ",(helper=helpers.time)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.time,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.type)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.type,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),(stack1||0===stack1)&&(buffer+=stack1),buffer+="
  • ",buffer})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="",buffer})}),define("taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit",["jquery","lodash","i18n","moment","ui/hider","ui/autoscroll","util/strPad","taoTests/runner/plugin","taoQtiItem/qtiCommonRenderer/helpers/PciResponse","tpl!taoQtiTest/runner/plugins/templates/button","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer"],function($,_,__,moment,hider,autoscroll,strPad,pluginFactory,pciResponse,buttonTpl,consoleTpl,consoleLineTpl,consoleCloserTpl){'use strict';var defaults={submitTitle:__("Submit and show the result"),submitText:__("Submit"),submitIcon:"forward"};return pluginFactory({name:"submit",init:function init(){var _this2=this,testRunner=this.getTestRunner(),pluginConfig=_.defaults(this.getConfig(),defaults),isPluginAllowed=function(){var config=testRunner.getConfig();return!config.options.readOnly},showConsole=function(){hider.show(_this2.controls.$console),hider.show(_this2.controls.$consoleBody),hider.show(_this2.controls.$consoleCloser),autoscroll(_this2.controls.$consoleBody.children().last(),_this2.controls.$consoleBody)},hideConsole=function(){hider.hide(_this2.controls.$console),hider.hide(_this2.controls.$consoleCloser)},addConsoleLine=function(type,message){var data={time:strPad(moment().format("HH:mm:ss"),12," "),type:strPad(type||"",18," "),message:strPad(message||"",18," ")};_this2.controls.$consoleBody.append($(consoleLineTpl(data)))},showResponses=function(type,responses){_.forEach(responses,function(response,identifier){addConsoleLine(type,strPad("".concat(identifier,": "),15," ")+_.escape(pciResponse.prettyPrint(response)))})};this.controls={$button:$(buttonTpl({control:"submit",title:pluginConfig.submitTitle,icon:pluginConfig.submitIcon,text:pluginConfig.submitText})),$console:$(consoleTpl()),$consoleCloser:$(consoleCloserTpl())},this.controls.$consoleBody=this.controls.$console.find(".preview-console-body"),this.controls.$button.on("click",function(e){e.preventDefault(),!1!==_this2.getState("enabled")&&(_this2.disable(),testRunner.trigger("submititem"))}),this.controls.$consoleCloser.on("click",function(e){e.preventDefault(),hideConsole()}),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?_this2.show():_this2.hide()}).on("submitresponse",function(responses){showResponses(__("Submitted data"),responses),showConsole()}).on("scoreitem",function(responses){responses.itemSession&&(showResponses(__("Output data"),responses.itemSession),showConsole())}).on("enablenav",function(){_this2.enable()}).on("disablenav",function(){_this2.disable()})},render:function render(){var $container=this.getAreaBroker().getContainer(),$navigation=this.getAreaBroker().getNavigationArea();$navigation.append(this.controls.$button),$navigation.append(this.controls.$consoleCloser),$container.append(this.controls.$console)},destroy:function destroy(){_.forEach(this.controls,function($el){return $el.remove()}),this.controls=null},enable:function enable(){this.controls.$button.prop("disabled",!1).removeClass("disabled")},disable:function disable(){this.controls.$button.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.controls.$button)},hide:function hide(){_.forEach(this.controls,hider.hide)}})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    ",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer",["jquery","lodash","i18n","ui/component","ui/transformer","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css"],function($,_,__,componentFactory,transformer,devicesPreviewerTpl){'use strict';var _Mathmin=Math.min,defaults={deviceType:"standard",deviceWith:0,deviceHeight:0,deviceOrientation:null};return function(container,config){var controls=null,resetScale=function(){controls&&(controls.$previewContent.removeAttr("style"),controls.$previewContainer.removeAttr("style"))},devicesPreviewer=componentFactory({getDeviceWidth:function(){return this.getConfig().deviceWidth},setDeviceWidth:function(width){var componentConfig=this.getConfig();return componentConfig.deviceWidth=parseInt(width,10)||0,this.trigger("devicewidthchange",componentConfig.deviceWidth),this},getDeviceHeight:function(){return this.getConfig().deviceHeight},setDeviceHeight:function(height){var componentConfig=this.getConfig();return componentConfig.deviceHeight=parseInt(height,10)||0,this.trigger("deviceheightchange",componentConfig.deviceHeight),this},getDeviceOrientation:function(){return this.getConfig().deviceOrientation},setDeviceOrientation:function(orientation){var componentConfig=this.getConfig();return componentConfig.deviceOrientation=orientation,this.is("rendered")&&this.getElement().attr("data-orientation",componentConfig.deviceOrientation),this.trigger("deviceorientationchange",componentConfig.deviceOrientation),this},isDeviceMode:function(){return"standard"!==this.getDeviceType()},getDeviceType:function(){return this.getConfig().deviceType},setDeviceType:function(type){var componentConfig=this.getConfig();return componentConfig.deviceType=type,this.is("rendered")&&this.getElement().attr("data-type",componentConfig.deviceType),this.trigger("devicetypechange",componentConfig.deviceType),this},previewDevice:function(){var width,height;return this.is("rendered")&&(this.is("disabled")||"standard"===this.getDeviceType()?this.clearScale():("portrait"===this.getDeviceOrientation()?(width=this.getDeviceHeight(),height=this.getDeviceWidth()):(width=this.getDeviceWidth(),height=this.getDeviceHeight()),this.applyScale(width,height)),this.trigger("devicepreview")),this},clearScale:function(){return this.is("rendered")&&(resetScale(),this.trigger("scaleclear")),this},applyScale:function(width,height){var frameSize,frameMargins,scaleFactor;return this.is("rendered")&&(resetScale(),frameSize=this.getFrameSize(),frameMargins=this.getFrameMargins(),scaleFactor=this.getScaleFactor(width,height),controls.$previewContent.width(width).height(height),controls.$previewContainer.css("left",(frameSize.width-(width+frameMargins.width)*scaleFactor)/2).width(width+frameMargins.width).height(height+frameMargins.height),transformer.setTransformOrigin(controls.$previewContainer,0,0),transformer.scale(controls.$previewContainer,scaleFactor),this.trigger("scalechange")),this},getFrameMargins:function(){var margins={width:0,height:0};return this.is("rendered")&&(margins.width=controls.$previewContainer.outerWidth()-controls.$previewContent.width(),margins.height=controls.$previewContainer.outerHeight()-controls.$previewContent.height()),margins},getFrameSize:function(){var size={width:0,height:0};return this.is("rendered")&&(size.width=this.getContainer().innerWidth(),size.height=this.getContainer().innerHeight()),size},getScaleFactor:function(width,height){var margins,frameSize,scaleFactor={x:1,y:1};return this.is("rendered")&&this.isDeviceMode()&&(frameSize=this.getFrameSize(),margins=this.getFrameMargins(),width+=margins.width,height+=margins.height,width>frameSize.width&&(scaleFactor.x=frameSize.width/width),height>frameSize.height&&(scaleFactor.y=frameSize.height/height)),_Mathmin(scaleFactor.x,scaleFactor.y)},wrap:function(element){return this.is("rendered")&&(this.unwrap(),controls.$wrappedElement=$(element),controls.$wrappedElementContainer=controls.$wrappedElement.parent(),controls.$previewContent.append(controls.$wrappedElement),this.trigger("wrap",controls.$wrappedElement)),this},unwrap:function(){var $wasWrappedElement;return this.is("rendered")&&controls.$wrappedElement&&($wasWrappedElement=controls.$wrappedElement,controls.$wrappedElementContainer.append(controls.$wrappedElement),controls.$wrappedElement=null,controls.$wrappedElementContainer=null,this.trigger("unwrap",$wasWrappedElement)),this}},defaults).setTemplate(devicesPreviewerTpl).on("init",function(){var componentConfig=this.getConfig();this.setDeviceType(componentConfig.deviceType),this.setDeviceWidth(componentConfig.deviceWidth),this.setDeviceHeight(componentConfig.deviceHeight),this.setDeviceOrientation(componentConfig.deviceOrientation),_.defer(function(){devicesPreviewer.render(container)})}).on("render",function(){var $element=this.getElement();controls={$previewContainer:$element.find(".preview-container"),$previewFrame:$element.find(".preview-frame"),$previewContent:$element.find(".preview-content"),$wrappedElement:null,$wrappedElementContainer:null},this.trigger("ready")}).on("disable enable",function(){var self=this;this.is("rendered")&&_.defer(function(){self.previewDevice()})}).on("destroy",function(){this.unwrap(),controls=null});return _.defer(function(){devicesPreviewer.init(config)}),devicesPreviewer}}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
    \n
    \n
    \n
    \n
    \n
    "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n \n ",buffer}function program2(){return"selected=\"selected\""}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression,self=this;return buffer+="",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector",["jquery","lodash","i18n","ui/component","ui/selecter","taoQtiTestPreviewer/previewer/helpers/devices","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css"],function($,_,__,componentFactory,lookupSelecter,devicesHelper,devicesSelectorTpl,selectorTpl){'use strict';function getSelectorData(selected,list){return selected&&_.size(list)?_.find(list,{value:selected})||null:null}function getValidIdentifier(identifier,list){return list&&list.length?_.find(list,{value:identifier})?identifier:_.first(list).value:null}function updateSelect2($selector,value){var current=$selector.val();return current!==value&&($selector.val(value),$selector.trigger("change")),$selector}function removeSelect2($selector){return $selector.hasClass("select2-offscreen")&&$selector.select2("destroy"),$selector}var defaults={type:"standard",device:null,orientation:"landscape"},deviceTypesList=[{value:"standard",label:__("Actual size"),devicesList:!1,orientation:!1},{value:"desktop",label:__("Desktop preview"),devicesList:!0,orientation:!1},{value:"mobile",label:__("Mobile preview"),devicesList:!0,orientation:!0}],deviceOrientationsList=[{value:"landscape",label:__("Landscape")},{value:"portrait",label:__("Portrait")}],callbackMap={type:"setType",device:"setDevice",mobile:"setDevice",desktop:"setDevice",orientation:"setOrientation"};return function(container,config){var selected={type:null,device:null,orientation:null,desktop:null,mobile:null},devicesList=[],typeData=null,controls=null,setControlsProp=function(property,value){_.forEach(controls,function($selector){$selector.prop(property,value)})},devicesSelector=componentFactory({isDeviceMode:function(){return"standard"!==selected.type},updateMode:function(){return this.is("rendered")&&this.getElement().attr("data-type",selected.type),this},getType:function(){return selected.type},getOrientation:function(){return typeData&&typeData.orientation?selected.orientation:null},getDevice:function(){return typeData&&typeData.devicesList?selected.device:null},getDeviceData:function(){return getSelectorData(this.getDevice(),devicesList)},setType:function(identifier){return identifier=getValidIdentifier(identifier,deviceTypesList),identifier!==selected.type&&(selected.type=identifier,selected.device=null,devicesList=devicesHelper.getDevicesByType(selected.type),typeData=getSelectorData(selected.type,deviceTypesList),this.is("rendered")&&(updateSelect2(controls.$typeSelector,selected.type),this.updateMode()),this.trigger("typechange",selected.type),typeData.devicesList&&this.setDevice(selected[selected.type])),this},setOrientation:function(identifier){return identifier=getValidIdentifier(identifier,deviceOrientationsList),identifier!==selected.orientation&&(selected.orientation=identifier,this.is("rendered")&&updateSelect2(controls.$orientationSelector,selected.orientation),this.trigger("orientationchange",selected.orientation)),this},setDevice:function(identifier){var $selector;return identifier=getValidIdentifier(identifier,devicesList),identifier!==selected.device&&(selected.device=identifier,selected[selected.type]=identifier,this.is("rendered")&&this.isDeviceMode()&&($selector=controls["$"+selected.type+"Selector"],$selector&&updateSelect2($selector,selected.device)),this.trigger("devicechange",selected.device,this.getDeviceData())),this},select:function(name,value){var setterName=callbackMap[name];return setterName&&_.isFunction(this[setterName])&&this[setterName](value),this},reset:function(){var componentConfig=this.getConfig();return this.setType(componentConfig.type),this.setDevice(componentConfig.device),this.setOrientation(componentConfig.orientation),this}},defaults).setTemplate(devicesSelectorTpl).on("init",function(){this.reset(),_.defer(function(){devicesSelector.render(container)})}).on("render",function(){function renderSelector(name,list,selectedValue,category){var $selector=$(selectorTpl({name:name,category:category||name,items:_.map(list,function(item){return{value:item.value,label:item.label,selected:selectedValue===item.value}})}));return self.getElement().find("."+name+"-selector").html($selector),$selector}var self=this;controls={$typeSelector:renderSelector("type",deviceTypesList,selected.type),$desktopSelector:renderSelector("desktop",devicesHelper.getDesktopDevices(),selected.device,"device"),$mobileSelector:renderSelector("mobile",devicesHelper.getMobileDevices(),selected.device,"device"),$orientationSelector:renderSelector("orientation",deviceOrientationsList,selected.orientation)},lookupSelecter(this.getElement()),this.getElement().on("change",".selector",function(e){var $selector=$(e.target).closest("select");self.select($selector.attr("name"),$selector.val())}),this.updateMode(),this.trigger("ready")}).on("disable",function(){this.is("rendered")&&setControlsProp("disabled",!0)}).on("enable",function(){this.is("rendered")&&setControlsProp("disabled",!1)}).on("destroy",function(){_.forEach(controls,removeSelect2),controls=null,selected=null,typeData=null,devicesList=null});return _.defer(function(){devicesSelector.init(config)}),devicesSelector}}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/scale",["jquery","lodash","lib/uuid","util/namespace","taoTests/runner/plugin","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector"],function($,_,uuid,namespaceHelper,pluginFactory,devicesPreviewerFactory,devicesSelectorFactory){'use strict';return pluginFactory({name:"scale",init:function(){function isPluginAllowed(){var config=testRunner.getConfig();return!config.options.readOnly}var self=this,testRunner=this.getTestRunner();this.nsId=this.getName()+uuid(6),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?self.show():self.hide()}).on("resizeitem",function(size,orientation,type){self.devicesPreviewer&&self.devicesPreviewer.setDeviceType(type).setDeviceOrientation(orientation).setDeviceWidth(size&&size.width).setDeviceHeight(size&&size.height).previewDevice()}).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()})},render:function(){function resizeItem(){self.devicesSelector&&self.getState("enabled")&&testRunner.trigger("resizeitem",self.devicesSelector.getDeviceData(),self.devicesSelector.getOrientation(),self.devicesSelector.getType())}var self=this,testRunner=this.getTestRunner(),areaBroker=this.getAreaBroker();return $(window).on(namespaceHelper.namespaceAll("resize orientationchange",this.nsId),_.throttle(function(){self.devicesSelector&&self.devicesSelector.isDeviceMode()&&resizeItem()},50)),Promise.all([new Promise(function(resolve){self.devicesSelector=devicesSelectorFactory(areaBroker.getHeaderArea()).on("ready",function(){self.getState("enabled")||this.disable(),this.on("typechange",function(){this.isDeviceMode()||resizeItem()}),this.on("devicechange orientationchange",function(){resizeItem()}),resolve()})}),new Promise(function(resolve){self.devicesPreviewer=devicesPreviewerFactory(areaBroker.getArea("contentWrapper")).on("ready",function(){this.wrap(areaBroker.getContentArea()),resolve()})})])},destroy:function(){this.nsId&&$(window).off("."+this.nsId),this.devicesSelector&&this.devicesSelector.destroy(),this.devicesPreviewer&&this.devicesPreviewer.destroy(),this.devicesSelector=null,this.devicesPreviewer=null},enable:function(){this.devicesSelector&&this.devicesSelector.enable()},disable:function(){this.devicesSelector&&this.devicesSelector.disable()},show:function(){this.devicesSelector&&this.devicesSelector.show()},hide:function(){this.devicesSelector&&this.devicesSelector.hide()}})}),define("tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
    \n
    \n
    \n
    \n
    \n
      \n
      \n
      \n
      \n\n
      \n\n \n\n
      \n
      \n
      \n
      \n\n \n\n
      "})}),define("taoQtiTestPreviewer/previewer/provider/item/item",["jquery","lodash","i18n","ui/feedback","taoTests/runner/areaBroker","taoTests/runner/testStore","taoTests/runner/proxy","taoQtiTest/runner/ui/toolbox/toolbox","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","taoItems/assets/strategies","taoQtiItem/qtiCommonRenderer/helpers/container","tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item"],function($,_,__,feedback,areaBrokerFactory,testStoreFactory,proxyFactory,toolboxFactory,qtiItemRunner,assetManagerFactory,assetStrategies,containerHelper,layoutTpl){'use strict';function setContext($context){_$previousContext=containerHelper.getContext(),containerHelper.setContext($context)}function restoreContext(){containerHelper.setContext(_$previousContext),_$previousContext=null}var assetManager=assetManagerFactory();assetManager.prependStrategy(assetStrategies.taomedia);var _$previousContext=null;return{name:"qtiItemPreviewer",loadAreaBroker:function loadAreaBroker(){var $layout=$(layoutTpl());return areaBrokerFactory($layout,{contentWrapper:$(".content-wrapper",$layout),content:$("#qti-content",$layout),toolbox:$(".bottom-action-bar .tools-box",$layout),navigation:$(".bottom-action-bar .navi-box-list",$layout),control:$(".top-action-bar .control-box",$layout),actionsBar:$(".bottom-action-bar .control-box",$layout),panel:$(".test-sidebar-left",$layout),header:$(".top-action-bar .tools-box",$layout),context:$(".top-action-bar .navi-box-list",$layout)})},loadProxy:function loadProxy(){var _this$getConfig=this.getConfig(),proxyProvider=_this$getConfig.proxyProvider,serviceCallId=_this$getConfig.serviceCallId,bootstrap=_this$getConfig.bootstrap,timeout=_this$getConfig.timeout;return proxyFactory(proxyProvider||"qtiItemPreviewerProxy",{serviceCallId:serviceCallId,bootstrap:bootstrap,timeout:timeout})},loadTestStore:function loadTestStore(){var config=this.getConfig(),identifier=config.serviceCallId||"test-".concat(Date.now());return testStoreFactory(identifier)},install:function install(){var plugins=this.getConfig().options.plugins;plugins&&_.forEach(this.getPlugins(),function(plugin){if(_.isPlainObject(plugin)&&_.isFunction(plugin.setConfig)){var config=plugins[plugin.getName()];_.isPlainObject(config)&&plugin.setConfig(config)}})},init:function init(){var _this3=this,dataHolder=this.getDataHolder(),areaBroker=this.getAreaBroker();return areaBroker.setComponent("toolbox",toolboxFactory()),areaBroker.getToolbox().init(),this.on("submititem",function(){var itemState=_this3.itemRunner.getState(),itemResponses=_this3.itemRunner.getResponses();return _this3.trigger("disabletools disablenav"),_this3.trigger("submitresponse",itemResponses,itemState),_this3.getProxy().submitItem(dataHolder.get("itemIdentifier"),itemState,itemResponses).then(function(response){_this3.trigger("scoreitem",response),_this3.trigger("enabletools enablenav resumeitem")}).catch(function(err){_this3.trigger("enabletools enablenav"),200===err.code&&_this3.trigger("alert.submitError",err.message||__("An error occurred during results submission. Please retry."),function(){return _this3.trigger("resumeitem")})})}).on("ready",function(){var itemIdentifier=dataHolder.get("itemIdentifier"),itemData=dataHolder.get("itemData");itemIdentifier&&(itemData?_this3.renderItem(itemIdentifier,itemData):_this3.loadItem(itemIdentifier))}).on("loaditem",function(itemRef,itemData){dataHolder.set("itemIdentifier",itemRef),dataHolder.set("itemData",itemData)}).on("renderitem",function(){_this3.trigger("enabletools enablenav")}).on("resumeitem",function(){_this3.trigger("enableitem enablenav")}).on("disableitem",function(){_this3.trigger("disabletools")}).on("enableitem",function(){_this3.trigger("enabletools")}).on("error",function(){_this3.trigger("disabletools enablenav")}).on("finish leave",function(){_this3.trigger("disablenav disabletools"),_this3.flush()}).on("flush",function(){_this3.destroy()}),this.getProxy().init().then(function(data){dataHolder.set("itemIdentifier",data.itemIdentifier),dataHolder.set("itemData",data.itemData)})},render:function render(){var config=this.getConfig(),areaBroker=this.getAreaBroker();config.renderTo.append(areaBroker.getContainer()),areaBroker.getToolbox().render(areaBroker.getToolboxArea())},loadItem:function loadItem(itemIdentifier){return this.getProxy().getItem(itemIdentifier)},renderItem:function renderItem(itemIdentifier,itemData){var _this4=this,areaBroker=this.getAreaBroker(),options=this.getConfig().options,changeState=function(){_this4.setItemState(itemIdentifier,"changed",!0)};return setContext(areaBroker.getContentArea()),new Promise(function(resolve,reject){assetManager.setData("baseUrl",itemData.baseUrl),itemData.content=itemData.content||{},_this4.itemRunner=qtiItemRunner(itemData.content.type,itemData.content.data,Object.assign({assetManager:assetManager},options)).on("error",function(err){_this4.trigger("enablenav"),reject(err),feedback().error(__("It seems that there is an error during item preview loading. Please, try again."))}).on("init",function(){var state=itemData.state,portableElements=itemData.portableElements;this.render(areaBroker.getContentArea(),{state:state,portableElements:portableElements})}).on("render",function(){this.on("responsechange",changeState),this.on("statechange",changeState),resolve()}).init()})},unloadItem:function unloadItem(){var _this5=this;return this.trigger("beforeunloaditem disablenav disabletools"),this.itemRunner?new Promise(function(resolve){_this5.itemRunner.on("clear",resolve).clear()}):Promise.resolve()},destroy:function destroy(){var areaBroker=this.getAreaBroker();this.itemRunner&&this.itemRunner.on("clear",restoreContext).clear(),this.itemRunner=null,areaBroker&&areaBroker.getToolbox().destroy()}}}),define("taoQtiTestPreviewer/previewer/proxy/item",["jquery","lodash","i18n","core/promiseQueue","core/request","taoQtiTestPreviewer/previewer/config/item"],function($,_,__,promiseQueue,coreRequest,configFactory){'use strict';return{name:"qtiItemPreviewerProxy",install:function(){var self=this;this.queue=promiseQueue(),this.prepareParams=function(actionParams){var stringifyParams=["itemState","itemResponse"];return _.isPlainObject(actionParams)?_.mapValues(actionParams,function(value,key){return _.contains(stringifyParams,key)?JSON.stringify(value):value}):actionParams},this.request=function(url,reqParams,contentType,noToken){return coreRequest({url:url,data:self.prepareParams(reqParams),method:reqParams?"POST":"GET",contentType:contentType,noToken:noToken,background:!1,sequential:!0,timeout:self.configStorage.getTimeout()}).then(function(response){return self.setOnline(),response&&response.success?Promise.resolve(response):Promise.reject(response)}).catch(function(error){return error.data&&self.isConnectivityError(error.data)&&self.setOffline("request"),Promise.reject(error)})}},init:function(config,params){return this.configStorage=configFactory(config||{}),this.request(this.configStorage.getTestActionUrl("init"),params,void 0,!0)},destroy:function(){return this.configStorage=null,this.queue=null,Promise.resolve()},callTestAction:function(action,params){return this.request(this.configStorage.getTestActionUrl(action),params)},callItemAction:function(itemIdentifier,action,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,action),params)},getItem:function(itemIdentifier,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params,void 0,!0)},submitItem:function(itemIdentifier,state,response,params){var body=_.merge({itemState:state,itemResponse:response},params||{});return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"submitItem"),body,void 0,!0)}}}),define("taoQtiTestPreviewer/previewer/proxy/test",["core/promiseQueue","core/request","util/url","taoQtiTest/runner/helpers/map"],function(promiseQueue,request,urlUtil,mapHelper){'use strict';var _Mathmin2=Math.min;function findIds(testMap,position){var item=mapHelper.getJump(testMap,position);return item?{testPartId:item.part,sectionId:item.section,itemIdentifier:item.identifier}:{}}var serviceExtension="taoQtiTestPreviewer",testSessionStates=Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4});return{name:"qtiTestPreviewerProxy",install:function install(){this.queue=promiseQueue()},init:function init(configs){var _this6=this;return request({url:urlUtil.route("init","TestPreviewer",serviceExtension),data:{testUri:configs.options.testUri}}).then(function(response){var data=response.data;_this6.builtTestMap=mapHelper.reindex(data.testMap);var firstItem=_this6.builtTestMap.jumps[0]||{};return data.testContext={itemIdentifier:firstItem.identifier,itemPosition:0,testPartId:firstItem.part,sectionId:firstItem.section,canMoveBackward:!0,state:testSessionStates.initial},data})},destroy:function destroy(){return this.queue=null,Promise.resolve()},getItem:function getItem(itemIdentifier){var _ref=mapHelper.getItem(this.builtTestMap,itemIdentifier)||{},uri=_ref.uri;if(!uri)throw new Error("There is no item ".concat(itemIdentifier," in the testMap!"));return request({url:urlUtil.route("getItem","Previewer",serviceExtension),data:{serviceCallId:"previewer",itemUri:uri},noToken:!0}).then(function(data){return data.itemData=data.content,data})},callItemAction:function callItemAction(itemIdentifier,action){var params=2testPartPosition}).sort(function(a,b){return a.position-b.position});0===nextPartsSorted.length?testContext.state=testSessionStates.closed:testContext.itemPosition=_Mathmin2(testMap.stats.total-1,nextPartsSorted[0].position)}else testContext.itemPosition+1>=testMap.stats.total?testContext.state=testSessionStates.closed:testContext.itemPosition=_Mathmin2(testMap.stats.total-1,testContext.itemPosition+1);"previous"===params.direction&&(testContext.itemPosition=_Mathmax(0,testContext.itemPosition-1)),"jump"===params.direction&&0<=params.ref&&(testContext.itemPosition=params.ref);var ids=findIds(testMap,testContext.itemPosition);return testContext.testPartId=ids.testPartId,testContext.sectionId=ids.sectionId,testContext.itemIdentifier=ids.itemIdentifier,{testContext:testContext,testMap:testMap}},flagItem:function flagItem(){return Promise.resolve()}};if(actions.skip=actions.move,"function"==typeof actions[action])return actions[action]()},callTestAction:function callTestAction(){return Promise.resolve()}}}),define("tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="",buffer})}),define("css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest",[],function(){}),define("taoQtiTestPreviewer/previewer/component/test/qtiTest",["context","jquery","taoTests/runner/runnerComponent","tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest","css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest","css!taoQtiTestCss/new-test-runner"],function(context,$,runnerComponentFactory,runnerTpl){'use strict';return function(container){var config=1.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\" \";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\"btn-\"],.section-container .content-block [class*=\" btn-\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 0px)}.item-previewer-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:' ';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\"Andale Mono WT\",\"Andale Mono\",\"Lucida Console\",\"Lucida Sans Typewriter\",\"DejaVu Sans Mono\",\"Bitstream Vera Sans Mono\",\"Liberation Mono\",\"Nimbus Mono L\",Monaco,\"Courier New\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,0.3);border-radius:0px;display:inline-block;height:inherit}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\"btn-\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\" btn-\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\"desktop\"],.devices-previewer:not(.disabled)[data-type=\"mobile\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame{border-radius:5px;padding:30px}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\"standard\"] .desktop-selector,.devices-selector[data-type=\"standard\"] .mobile-selector,.devices-selector[data-type=\"standard\"] .orientation-selector{display:none}.devices-selector[data-type=\"desktop\"] .mobile-selector,.devices-selector[data-type=\"desktop\"] .orientation-selector{display:none}.devices-selector[data-type=\"mobile\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */.previewer-test-component{background:inherit}.previewer-test-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:64px;z-index:100000}.previewer-test-component.fullpage .item-previewer-scope{height:100vh}.previewer-test-component.readonly .qti-item::before{content:' ';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-test-component.hideactionbars .test-sidebar{height:100%}.previewer-test-component.hideactionbars .action-bar{display:none}.previewer-test-component #preview-logo{margin:6px 30px 6px 30px;display:block;max-width:200px;height:52px;background:transparent}.previewer-test-component footer{z-index:10000;position:relative;font-size:11px;padding:10px;border-top:1px #ddd solid}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/component/test/css/qtiTest.css.map */"),define("taoQtiTestPreviewer/loader/qtiPreviewer.bundle",function(){}),define("taoQtiTestPreviewer/loader/qtiPreviewer.min",["taoItems/loader/taoItemsRunner.min","taoTests/loader/taoTestsRunner.min","taoQtiItem/loader/taoQtiItemRunner.min","taoQtiTest/loader/taoQtiTestRunner.min","taoQtiTest/loader/testPlugins.min"],function(){}); +function _typeof(obj){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(o,minLen){if(o){if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(o):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(iter))return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
      "})}),define("taoQtiTestPreviewer/previewer/runner",["taoTests/runner/runnerComponent","tpl!taoQtiTestPreviewer/previewer/runner"],function(runnerComponentFactory,runnerTpl){'use strict';return function(container){var config=1= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
      \n
        \n
        "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
      • ",(helper=helpers.time)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.time,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.type)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.type,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),(stack1||0===stack1)&&(buffer+=stack1),buffer+="
      • ",buffer})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="",buffer})}),define("taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit",["jquery","lodash","i18n","moment","ui/hider","ui/autoscroll","util/strPad","taoTests/runner/plugin","taoQtiItem/qtiCommonRenderer/helpers/PciResponse","tpl!taoQtiTest/runner/plugins/templates/button","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer"],function($,_,__,moment,hider,autoscroll,strPad,pluginFactory,pciResponse,buttonTpl,consoleTpl,consoleLineTpl,consoleCloserTpl){'use strict';var defaults={submitTitle:__("Submit and show the result"),submitText:__("Submit"),submitIcon:"forward"};return pluginFactory({name:"submit",init:function init(){var _this2=this,testRunner=this.getTestRunner(),pluginConfig=_.defaults(this.getConfig(),defaults),isPluginAllowed=function(){var config=testRunner.getConfig();return!config.options.readOnly},showConsole=function(){hider.show(_this2.controls.$console),hider.show(_this2.controls.$consoleBody),hider.show(_this2.controls.$consoleCloser),autoscroll(_this2.controls.$consoleBody.children().last(),_this2.controls.$consoleBody)},hideConsole=function(){hider.hide(_this2.controls.$console),hider.hide(_this2.controls.$consoleCloser)},addConsoleLine=function(type,message){var data={time:strPad(moment().format("HH:mm:ss"),12," "),type:strPad(type||"",18," "),message:strPad(message||"",18," ")};_this2.controls.$consoleBody.append($(consoleLineTpl(data)))},showResponses=function(type,responses){_.forEach(responses,function(response,identifier){addConsoleLine(type,strPad("".concat(identifier,": "),15," ")+_.escape(pciResponse.prettyPrint(response)))})};this.controls={$button:$(buttonTpl({control:"submit",title:pluginConfig.submitTitle,icon:pluginConfig.submitIcon,text:pluginConfig.submitText})),$console:$(consoleTpl()),$consoleCloser:$(consoleCloserTpl())},this.controls.$consoleBody=this.controls.$console.find(".preview-console-body"),this.controls.$button.on("click",function(e){e.preventDefault(),!1!==_this2.getState("enabled")&&(_this2.disable(),testRunner.trigger("submititem"))}),this.controls.$consoleCloser.on("click",function(e){e.preventDefault(),hideConsole()}),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?_this2.show():_this2.hide()}).on("submitresponse",function(responses){showResponses(__("Submitted data"),responses),showConsole()}).on("scoreitem",function(responses){responses.itemSession&&(showResponses(__("Output data"),responses.itemSession),showConsole())}).on("enablenav",function(){_this2.enable()}).on("disablenav",function(){_this2.disable()})},render:function render(){var $container=this.getAreaBroker().getContainer(),$navigation=this.getAreaBroker().getNavigationArea();$navigation.append(this.controls.$button),$navigation.append(this.controls.$consoleCloser),$container.append(this.controls.$console)},destroy:function destroy(){_.forEach(this.controls,function($el){return $el.remove()}),this.controls=null},enable:function enable(){this.controls.$button.prop("disabled",!1).removeClass("disabled")},disable:function disable(){this.controls.$button.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.controls.$button)},hide:function hide(){_.forEach(this.controls,hider.hide)}})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
        \n
        \n
        \n
        \n
        \n
        \n
        \n
        ",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer",["jquery","lodash","i18n","ui/component","ui/transformer","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css"],function($,_,__,componentFactory,transformer,devicesPreviewerTpl){'use strict';var _Mathmin=Math.min,defaults={deviceType:"standard",deviceWith:0,deviceHeight:0,deviceOrientation:null};return function(container,config){var controls=null,resetScale=function(){controls&&(controls.$previewContent.removeAttr("style"),controls.$previewContainer.removeAttr("style"))},devicesPreviewer=componentFactory({getDeviceWidth:function(){return this.getConfig().deviceWidth},setDeviceWidth:function(width){var componentConfig=this.getConfig();return componentConfig.deviceWidth=parseInt(width,10)||0,this.trigger("devicewidthchange",componentConfig.deviceWidth),this},getDeviceHeight:function(){return this.getConfig().deviceHeight},setDeviceHeight:function(height){var componentConfig=this.getConfig();return componentConfig.deviceHeight=parseInt(height,10)||0,this.trigger("deviceheightchange",componentConfig.deviceHeight),this},getDeviceOrientation:function(){return this.getConfig().deviceOrientation},setDeviceOrientation:function(orientation){var componentConfig=this.getConfig();return componentConfig.deviceOrientation=orientation,this.is("rendered")&&this.getElement().attr("data-orientation",componentConfig.deviceOrientation),this.trigger("deviceorientationchange",componentConfig.deviceOrientation),this},isDeviceMode:function(){return"standard"!==this.getDeviceType()},getDeviceType:function(){return this.getConfig().deviceType},setDeviceType:function(type){var componentConfig=this.getConfig();return componentConfig.deviceType=type,this.is("rendered")&&this.getElement().attr("data-type",componentConfig.deviceType),this.trigger("devicetypechange",componentConfig.deviceType),this},previewDevice:function(){var width,height;return this.is("rendered")&&(this.is("disabled")||"standard"===this.getDeviceType()?this.clearScale():("portrait"===this.getDeviceOrientation()?(width=this.getDeviceHeight(),height=this.getDeviceWidth()):(width=this.getDeviceWidth(),height=this.getDeviceHeight()),this.applyScale(width,height)),this.trigger("devicepreview")),this},clearScale:function(){return this.is("rendered")&&(resetScale(),this.trigger("scaleclear")),this},applyScale:function(width,height){var frameSize,frameMargins,scaleFactor;return this.is("rendered")&&(resetScale(),frameSize=this.getFrameSize(),frameMargins=this.getFrameMargins(),scaleFactor=this.getScaleFactor(width,height),controls.$previewContent.width(width).height(height),controls.$previewContainer.css("left",(frameSize.width-(width+frameMargins.width)*scaleFactor)/2).width(width+frameMargins.width).height(height+frameMargins.height),transformer.setTransformOrigin(controls.$previewContainer,0,0),transformer.scale(controls.$previewContainer,scaleFactor),this.trigger("scalechange")),this},getFrameMargins:function(){var margins={width:0,height:0};return this.is("rendered")&&(margins.width=controls.$previewContainer.outerWidth()-controls.$previewContent.width(),margins.height=controls.$previewContainer.outerHeight()-controls.$previewContent.height()),margins},getFrameSize:function(){var size={width:0,height:0};return this.is("rendered")&&(size.width=this.getContainer().innerWidth(),size.height=this.getContainer().innerHeight()),size},getScaleFactor:function(width,height){var margins,frameSize,scaleFactor={x:1,y:1};return this.is("rendered")&&this.isDeviceMode()&&(frameSize=this.getFrameSize(),margins=this.getFrameMargins(),width+=margins.width,height+=margins.height,width>frameSize.width&&(scaleFactor.x=frameSize.width/width),height>frameSize.height&&(scaleFactor.y=frameSize.height/height)),_Mathmin(scaleFactor.x,scaleFactor.y)},wrap:function(element){return this.is("rendered")&&(this.unwrap(),controls.$wrappedElement=$(element),controls.$wrappedElementContainer=controls.$wrappedElement.parent(),controls.$previewContent.append(controls.$wrappedElement),this.trigger("wrap",controls.$wrappedElement)),this},unwrap:function(){var $wasWrappedElement;return this.is("rendered")&&controls.$wrappedElement&&($wasWrappedElement=controls.$wrappedElement,controls.$wrappedElementContainer.append(controls.$wrappedElement),controls.$wrappedElement=null,controls.$wrappedElementContainer=null,this.trigger("unwrap",$wasWrappedElement)),this}},defaults).setTemplate(devicesPreviewerTpl).on("init",function(){var componentConfig=this.getConfig();this.setDeviceType(componentConfig.deviceType),this.setDeviceWidth(componentConfig.deviceWidth),this.setDeviceHeight(componentConfig.deviceHeight),this.setDeviceOrientation(componentConfig.deviceOrientation),_.defer(function(){devicesPreviewer.render(container)})}).on("render",function(){var $element=this.getElement();controls={$previewContainer:$element.find(".preview-container"),$previewFrame:$element.find(".preview-frame"),$previewContent:$element.find(".preview-content"),$wrappedElement:null,$wrappedElementContainer:null},this.trigger("ready")}).on("disable enable",function(){var self=this;this.is("rendered")&&_.defer(function(){self.previewDevice()})}).on("destroy",function(){this.unwrap(),controls=null});return _.defer(function(){devicesPreviewer.init(config)}),devicesPreviewer}}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
        \n
        \n
        \n
        \n
        \n
        "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n \n ",buffer}function program2(){return"selected=\"selected\""}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression,self=this;return buffer+="",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector",["jquery","lodash","i18n","ui/component","ui/selecter","taoQtiTestPreviewer/previewer/helpers/devices","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css"],function($,_,__,componentFactory,lookupSelecter,devicesHelper,devicesSelectorTpl,selectorTpl){'use strict';function getSelectorData(selected,list){return selected&&_.size(list)?_.find(list,{value:selected})||null:null}function getValidIdentifier(identifier,list){return list&&list.length?_.find(list,{value:identifier})?identifier:_.first(list).value:null}function updateSelect2($selector,value){var current=$selector.val();return current!==value&&($selector.val(value),$selector.trigger("change")),$selector}function removeSelect2($selector){return $selector.hasClass("select2-offscreen")&&$selector.select2("destroy"),$selector}var defaults={type:"standard",device:null,orientation:"landscape"},deviceTypesList=[{value:"standard",label:__("Actual size"),devicesList:!1,orientation:!1},{value:"desktop",label:__("Desktop preview"),devicesList:!0,orientation:!1},{value:"mobile",label:__("Mobile preview"),devicesList:!0,orientation:!0}],deviceOrientationsList=[{value:"landscape",label:__("Landscape")},{value:"portrait",label:__("Portrait")}],callbackMap={type:"setType",device:"setDevice",mobile:"setDevice",desktop:"setDevice",orientation:"setOrientation"};return function(container,config){var selected={type:null,device:null,orientation:null,desktop:null,mobile:null},devicesList=[],typeData=null,controls=null,setControlsProp=function(property,value){_.forEach(controls,function($selector){$selector.prop(property,value)})},devicesSelector=componentFactory({isDeviceMode:function(){return"standard"!==selected.type},updateMode:function(){return this.is("rendered")&&this.getElement().attr("data-type",selected.type),this},getType:function(){return selected.type},getOrientation:function(){return typeData&&typeData.orientation?selected.orientation:null},getDevice:function(){return typeData&&typeData.devicesList?selected.device:null},getDeviceData:function(){return getSelectorData(this.getDevice(),devicesList)},setType:function(identifier){return identifier=getValidIdentifier(identifier,deviceTypesList),identifier!==selected.type&&(selected.type=identifier,selected.device=null,devicesList=devicesHelper.getDevicesByType(selected.type),typeData=getSelectorData(selected.type,deviceTypesList),this.is("rendered")&&(updateSelect2(controls.$typeSelector,selected.type),this.updateMode()),this.trigger("typechange",selected.type),typeData.devicesList&&this.setDevice(selected[selected.type])),this},setOrientation:function(identifier){return identifier=getValidIdentifier(identifier,deviceOrientationsList),identifier!==selected.orientation&&(selected.orientation=identifier,this.is("rendered")&&updateSelect2(controls.$orientationSelector,selected.orientation),this.trigger("orientationchange",selected.orientation)),this},setDevice:function(identifier){var $selector;return identifier=getValidIdentifier(identifier,devicesList),identifier!==selected.device&&(selected.device=identifier,selected[selected.type]=identifier,this.is("rendered")&&this.isDeviceMode()&&($selector=controls["$"+selected.type+"Selector"],$selector&&updateSelect2($selector,selected.device)),this.trigger("devicechange",selected.device,this.getDeviceData())),this},select:function(name,value){var setterName=callbackMap[name];return setterName&&_.isFunction(this[setterName])&&this[setterName](value),this},reset:function(){var componentConfig=this.getConfig();return this.setType(componentConfig.type),this.setDevice(componentConfig.device),this.setOrientation(componentConfig.orientation),this}},defaults).setTemplate(devicesSelectorTpl).on("init",function(){this.reset(),_.defer(function(){devicesSelector.render(container)})}).on("render",function(){function renderSelector(name,list,selectedValue,category){var $selector=$(selectorTpl({name:name,category:category||name,items:_.map(list,function(item){return{value:item.value,label:item.label,selected:selectedValue===item.value}})}));return self.getElement().find("."+name+"-selector").html($selector),$selector}var self=this;controls={$typeSelector:renderSelector("type",deviceTypesList,selected.type),$desktopSelector:renderSelector("desktop",devicesHelper.getDesktopDevices(),selected.device,"device"),$mobileSelector:renderSelector("mobile",devicesHelper.getMobileDevices(),selected.device,"device"),$orientationSelector:renderSelector("orientation",deviceOrientationsList,selected.orientation)},lookupSelecter(this.getElement()),this.getElement().on("change",".selector",function(e){var $selector=$(e.target).closest("select");self.select($selector.attr("name"),$selector.val())}),this.updateMode(),this.trigger("ready")}).on("disable",function(){this.is("rendered")&&setControlsProp("disabled",!0)}).on("enable",function(){this.is("rendered")&&setControlsProp("disabled",!1)}).on("destroy",function(){_.forEach(controls,removeSelect2),controls=null,selected=null,typeData=null,devicesList=null});return _.defer(function(){devicesSelector.init(config)}),devicesSelector}}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/scale",["jquery","lodash","lib/uuid","util/namespace","taoTests/runner/plugin","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector"],function($,_,uuid,namespaceHelper,pluginFactory,devicesPreviewerFactory,devicesSelectorFactory){'use strict';return pluginFactory({name:"scale",init:function(){function isPluginAllowed(){var config=testRunner.getConfig();return!config.options.readOnly}var self=this,testRunner=this.getTestRunner();this.nsId=this.getName()+uuid(6),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?self.show():self.hide()}).on("resizeitem",function(size,orientation,type){self.devicesPreviewer&&self.devicesPreviewer.setDeviceType(type).setDeviceOrientation(orientation).setDeviceWidth(size&&size.width).setDeviceHeight(size&&size.height).previewDevice()}).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()})},render:function(){function resizeItem(){self.devicesSelector&&self.getState("enabled")&&testRunner.trigger("resizeitem",self.devicesSelector.getDeviceData(),self.devicesSelector.getOrientation(),self.devicesSelector.getType())}var self=this,testRunner=this.getTestRunner(),areaBroker=this.getAreaBroker();return $(window).on(namespaceHelper.namespaceAll("resize orientationchange",this.nsId),_.throttle(function(){self.devicesSelector&&self.devicesSelector.isDeviceMode()&&resizeItem()},50)),Promise.all([new Promise(function(resolve){self.devicesSelector=devicesSelectorFactory(areaBroker.getHeaderArea()).on("ready",function(){self.getState("enabled")||this.disable(),this.on("typechange",function(){this.isDeviceMode()||resizeItem()}),this.on("devicechange orientationchange",function(){resizeItem()}),resolve()})}),new Promise(function(resolve){self.devicesPreviewer=devicesPreviewerFactory(areaBroker.getArea("contentWrapper")).on("ready",function(){this.wrap(areaBroker.getContentArea()),resolve()})})])},destroy:function(){this.nsId&&$(window).off("."+this.nsId),this.devicesSelector&&this.devicesSelector.destroy(),this.devicesPreviewer&&this.devicesPreviewer.destroy(),this.devicesSelector=null,this.devicesPreviewer=null},enable:function(){this.devicesSelector&&this.devicesSelector.enable()},disable:function(){this.devicesSelector&&this.devicesSelector.disable()},show:function(){this.devicesSelector&&this.devicesSelector.show()},hide:function(){this.devicesSelector&&this.devicesSelector.hide()}})}),define("tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
        \n
        \n
        \n
        \n
        \n
          \n
          \n
          \n
          \n\n
          \n\n \n\n
          \n
          \n
          \n
          \n\n \n\n
          "})}),define("taoQtiTestPreviewer/previewer/provider/item/item",["jquery","lodash","i18n","ui/feedback","taoTests/runner/areaBroker","taoTests/runner/testStore","taoTests/runner/proxy","taoQtiTest/runner/ui/toolbox/toolbox","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","taoItems/assets/strategies","taoQtiItem/qtiCommonRenderer/helpers/container","tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item"],function($,_,__,feedback,areaBrokerFactory,testStoreFactory,proxyFactory,toolboxFactory,qtiItemRunner,assetManagerFactory,assetStrategies,containerHelper,layoutTpl){'use strict';function setContext($context){_$previousContext=containerHelper.getContext(),containerHelper.setContext($context)}function restoreContext(){containerHelper.setContext(_$previousContext),_$previousContext=null}var assetManager=assetManagerFactory();assetManager.prependStrategy(assetStrategies.taomedia);var _$previousContext=null;return{name:"qtiItemPreviewer",loadAreaBroker:function loadAreaBroker(){var $layout=$(layoutTpl());return areaBrokerFactory($layout,{contentWrapper:$(".content-wrapper",$layout),content:$("#qti-content",$layout),toolbox:$(".bottom-action-bar .tools-box",$layout),navigation:$(".bottom-action-bar .navi-box-list",$layout),control:$(".top-action-bar .control-box",$layout),actionsBar:$(".bottom-action-bar .control-box",$layout),panel:$(".test-sidebar-left",$layout),header:$(".top-action-bar .tools-box",$layout),context:$(".top-action-bar .navi-box-list",$layout)})},loadProxy:function loadProxy(){var _this$getConfig=this.getConfig(),proxyProvider=_this$getConfig.proxyProvider,serviceCallId=_this$getConfig.serviceCallId,bootstrap=_this$getConfig.bootstrap,timeout=_this$getConfig.timeout;return proxyFactory(proxyProvider||"qtiItemPreviewerProxy",{serviceCallId:serviceCallId,bootstrap:bootstrap,timeout:timeout})},loadTestStore:function loadTestStore(){var config=this.getConfig(),identifier=config.serviceCallId||"test-".concat(Date.now());return testStoreFactory(identifier)},install:function install(){var plugins=this.getConfig().options.plugins;plugins&&_.forEach(this.getPlugins(),function(plugin){if(_.isPlainObject(plugin)&&_.isFunction(plugin.setConfig)){var config=plugins[plugin.getName()];_.isPlainObject(config)&&plugin.setConfig(config)}})},init:function init(){var _this3=this,dataHolder=this.getDataHolder(),areaBroker=this.getAreaBroker();return areaBroker.setComponent("toolbox",toolboxFactory()),areaBroker.getToolbox().init(),this.on("submititem",function(){var itemState=_this3.itemRunner.getState(),itemResponses=_this3.itemRunner.getResponses();return _this3.trigger("disabletools disablenav"),_this3.trigger("submitresponse",itemResponses,itemState),_this3.getProxy().submitItem(dataHolder.get("itemIdentifier"),itemState,itemResponses).then(function(response){_this3.trigger("scoreitem",response),_this3.trigger("enabletools enablenav resumeitem")}).catch(function(err){_this3.trigger("enabletools enablenav"),200===err.code&&_this3.trigger("alert.submitError",err.message||__("An error occurred during results submission. Please retry."),function(){return _this3.trigger("resumeitem")})})}).on("ready",function(){var itemIdentifier=dataHolder.get("itemIdentifier"),itemData=dataHolder.get("itemData");itemIdentifier&&(itemData?_this3.renderItem(itemIdentifier,itemData):_this3.loadItem(itemIdentifier))}).on("loaditem",function(itemRef,itemData){dataHolder.set("itemIdentifier",itemRef),dataHolder.set("itemData",itemData)}).on("renderitem",function(){_this3.trigger("enabletools enablenav")}).on("resumeitem",function(){_this3.trigger("enableitem enablenav")}).on("disableitem",function(){_this3.trigger("disabletools")}).on("enableitem",function(){_this3.trigger("enabletools")}).on("error",function(){_this3.trigger("disabletools enablenav")}).on("finish leave",function(){_this3.trigger("disablenav disabletools"),_this3.flush()}).on("flush",function(){_this3.destroy()}),this.getProxy().init().then(function(data){dataHolder.set("itemIdentifier",data.itemIdentifier),dataHolder.set("itemData",data.itemData)})},render:function render(){var config=this.getConfig(),areaBroker=this.getAreaBroker();config.renderTo.append(areaBroker.getContainer()),areaBroker.getToolbox().render(areaBroker.getToolboxArea())},loadItem:function loadItem(itemIdentifier){return this.getProxy().getItem(itemIdentifier)},renderItem:function renderItem(itemIdentifier,itemData){var _this4=this,areaBroker=this.getAreaBroker(),options=this.getConfig().options,changeState=function(){_this4.setItemState(itemIdentifier,"changed",!0)};return setContext(areaBroker.getContentArea()),new Promise(function(resolve,reject){assetManager.setData("baseUrl",itemData.baseUrl),itemData.content=itemData.content||{},_this4.itemRunner=qtiItemRunner(itemData.content.type,itemData.content.data,Object.assign({assetManager:assetManager},options)).on("error",function(err){_this4.trigger("enablenav"),reject(err),feedback().error(__("It seems that there is an error during item preview loading. Please, try again."))}).on("init",function(){var state=itemData.state,portableElements=itemData.portableElements;this.render(areaBroker.getContentArea(),{state:state,portableElements:portableElements})}).on("render",function(){this.on("responsechange",changeState),this.on("statechange",changeState),resolve()}).init()})},unloadItem:function unloadItem(){var _this5=this;return this.trigger("beforeunloaditem disablenav disabletools"),this.itemRunner?new Promise(function(resolve){_this5.itemRunner.on("clear",resolve).clear()}):Promise.resolve()},destroy:function destroy(){var areaBroker=this.getAreaBroker();this.itemRunner&&this.itemRunner.on("clear",restoreContext).clear(),this.itemRunner=null,areaBroker&&areaBroker.getToolbox().destroy()}}}),define("taoQtiTestPreviewer/previewer/proxy/item",["jquery","lodash","i18n","core/promiseQueue","core/request","taoQtiTestPreviewer/previewer/config/item"],function($,_,__,promiseQueue,coreRequest,configFactory){'use strict';return{name:"qtiItemPreviewerProxy",install:function(){var self=this;this.queue=promiseQueue(),this.prepareParams=function(actionParams){var stringifyParams=["itemState","itemResponse"];return _.isPlainObject(actionParams)?_.mapValues(actionParams,function(value,key){return _.contains(stringifyParams,key)?JSON.stringify(value):value}):actionParams},this.request=function(url,reqParams,contentType,noToken){return coreRequest({url:url,data:self.prepareParams(reqParams),method:reqParams?"POST":"GET",contentType:contentType,noToken:noToken,background:!1,sequential:!0,timeout:self.configStorage.getTimeout()}).then(function(response){return self.setOnline(),response&&response.success?Promise.resolve(response):Promise.reject(response)}).catch(function(error){return error.data&&self.isConnectivityError(error.data)&&self.setOffline("request"),Promise.reject(error)})}},init:function(config,params){return this.configStorage=configFactory(config||{}),this.request(this.configStorage.getTestActionUrl("init"),params,void 0,!0)},destroy:function(){return this.configStorage=null,this.queue=null,Promise.resolve()},callTestAction:function(action,params){return this.request(this.configStorage.getTestActionUrl(action),params)},callItemAction:function(itemIdentifier,action,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,action),params)},getItem:function(itemIdentifier,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params,void 0,!0)},submitItem:function(itemIdentifier,state,response,params){var body=_.merge({itemState:state,itemResponse:response},params||{});return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"submitItem"),body,void 0,!0)}}}),define("taoQtiTestPreviewer/previewer/proxy/test",["core/promiseQueue","core/request","util/url","taoQtiTest/runner/helpers/map"],function(promiseQueue,request,urlUtil,mapHelper){'use strict';var _Mathmin2=Math.min;function findIds(testMap,position){var item=mapHelper.getJump(testMap,position);return item?{testPartId:item.part,sectionId:item.section,itemIdentifier:item.identifier}:{}}var serviceExtension="taoQtiTestPreviewer",testSessionStates=Object.freeze({initial:0,interacting:1,modalFeedback:2,suspended:3,closed:4});return{name:"qtiTestPreviewerProxy",install:function install(){this.queue=promiseQueue()},init:function init(configs){var _this6=this;return request({url:urlUtil.route("init","TestPreviewer",serviceExtension),data:{testUri:configs.options.testUri}}).then(function(response){var data=response.data;_this6.builtTestMap=mapHelper.reindex(data.testMap);var firstItem=_this6.builtTestMap.jumps[0]||{};return data.testContext={itemIdentifier:firstItem.identifier,itemPosition:0,testPartId:firstItem.part,sectionId:firstItem.section,canMoveBackward:!0,state:testSessionStates.initial},data})},destroy:function destroy(){return this.queue=null,Promise.resolve()},getItem:function getItem(itemIdentifier){var _ref=mapHelper.getItem(this.builtTestMap,itemIdentifier)||{},uri=_ref.uri;if(!uri)throw new Error("There is no item ".concat(itemIdentifier," in the testMap!"));return request({url:urlUtil.route("getItem","Previewer",serviceExtension),data:{serviceCallId:"previewer",itemUri:uri},noToken:!0}).then(function(data){return data.itemData=data.content,data.itemIdentifier=data.content.data.identifier,data})},callItemAction:function callItemAction(itemIdentifier,action){var params=2testPartPosition}).sort(function(a,b){return a.position-b.position});0===nextPartsSorted.length?testContext.state=testSessionStates.closed:testContext.itemPosition=_Mathmin2(testMap.stats.total-1,nextPartsSorted[0].position)}else testContext.itemPosition+1>=testMap.stats.total?testContext.state=testSessionStates.closed:testContext.itemPosition=_Mathmin2(testMap.stats.total-1,testContext.itemPosition+1);"previous"===params.direction&&(testContext.itemPosition=_Mathmax(0,testContext.itemPosition-1)),"jump"===params.direction&&0<=params.ref&&(testContext.itemPosition=params.ref);var ids=findIds(testMap,testContext.itemPosition);return testContext.testPartId=ids.testPartId,testContext.sectionId=ids.sectionId,testContext.itemIdentifier=ids.itemIdentifier,{testContext:testContext,testMap:testMap}},flagItem:function flagItem(){return Promise.resolve()}};if(actions.skip=actions.move,"function"==typeof actions[action])return actions[action]()},callTestAction:function callTestAction(){return Promise.resolve()}}}),define("tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="",buffer})}),define("css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest",[],function(){}),define("taoQtiTestPreviewer/previewer/component/test/qtiTest",["context","lodash","layout/loading-bar","taoTests/runner/runnerComponent","tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest","css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest","css!taoQtiTestCss/new-test-runner"],function(context,__,loadingBar,runnerComponentFactory,runnerTpl){'use strict';return function(container){var config=1.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\" \";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\"btn-\"],.section-container .content-block [class*=\" btn-\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 0px)}.item-previewer-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:' ';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\"Andale Mono WT\",\"Andale Mono\",\"Lucida Console\",\"Lucida Sans Typewriter\",\"DejaVu Sans Mono\",\"Bitstream Vera Sans Mono\",\"Liberation Mono\",\"Nimbus Mono L\",Monaco,\"Courier New\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,0.3);border-radius:0px;display:inline-block;height:inherit}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\"btn-\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\" btn-\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\"desktop\"],.devices-previewer:not(.disabled)[data-type=\"mobile\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame{border-radius:5px;padding:30px}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\"standard\"] .desktop-selector,.devices-selector[data-type=\"standard\"] .mobile-selector,.devices-selector[data-type=\"standard\"] .orientation-selector{display:none}.devices-selector[data-type=\"desktop\"] .mobile-selector,.devices-selector[data-type=\"desktop\"] .orientation-selector{display:none}.devices-selector[data-type=\"mobile\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */.previewer-test-component{background:inherit}.previewer-test-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:64px;z-index:100000}.previewer-test-component.fullpage .item-previewer-scope{height:100vh}.previewer-test-component.readonly .qti-item::before{content:' ';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-test-component.hideactionbars .test-sidebar{height:100%}.previewer-test-component.hideactionbars .action-bar{display:none}.previewer-test-component #preview-logo{margin:6px 30px 6px 30px;display:block;max-width:200px;height:52px;background:transparent}.previewer-test-component footer{z-index:10000;position:relative;font-size:11px;padding:10px;border-top:1px #ddd solid}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/component/test/css/qtiTest.css.map */"),define("taoQtiTestPreviewer/loader/qtiPreviewer.bundle",function(){}),define("taoQtiTestPreviewer/loader/qtiPreviewer.min",["taoItems/loader/taoItemsRunner.min","taoTests/loader/taoTestsRunner.min","taoQtiItem/loader/taoQtiItemRunner.min","taoQtiTest/loader/taoQtiTestRunner.min","taoQtiTest/loader/testPlugins.min"],function(){}); //# sourceMappingURL=qtiPreviewer.min.js.map \ No newline at end of file diff --git a/views/js/loader/qtiPreviewer.min.js.map b/views/js/loader/qtiPreviewer.min.js.map index 8b6b2014..52948fbd 100644 --- a/views/js/loader/qtiPreviewer.min.js.map +++ b/views/js/loader/qtiPreviewer.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../previewer/runner!tpl","../previewer/runner.js","../previewer/provider/item/css/item!css","../previewer/component/qtiItem.js","../previewer/adapter/item/qtiItem.js","../previewer/config/item.js","../previewer/resources/devices.json!json","../previewer/helpers/devices.js","../previewer/plugins/content/cloneLogoInTestPreview.js","../previewer/plugins/content/enhancedReadOnlyMode.js","../previewer/plugins/controls/close.js","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer","../previewer/plugins/navigation/submit/submit.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","../previewer/plugins/tools/scale/component/css/devicesPreviewer!css","../previewer/plugins/tools/scale/component/devicesPreviewer.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","../previewer/plugins/tools/scale/component/tpl/selector!tpl","../previewer/plugins/tools/scale/component/css/devicesSelector!css","../previewer/plugins/tools/scale/component/devicesSelector.js","../previewer/plugins/tools/scale/scale.js","../previewer/provider/item/tpl/item!tpl","../previewer/provider/item/item.js","../previewer/proxy/item.js","../previewer/proxy/test.js","../previewer/component/test/tpl/qtiTest!tpl","../previewer/component/test/css/qtiTest!css","../previewer/component/test/qtiTest.js","../previewer/adapter/test/qtiTest.js","onLayerEnd0.js","module-create.js","/Users/luis/Projects/package-tao/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"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","sourcesContent":["\ndefine('tpl!taoQtiTestPreviewer/previewer/runner', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
          \";\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Component that embeds the QTI previewer for tests and items\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/runner',[\n 'taoTests/runner/runnerComponent',\n 'tpl!taoQtiTestPreviewer/previewer/runner'\n], function (runnerComponentFactory, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} config - The testRunner options\n * @param {String} [config.provider] - The provider to use\n * @param {Object[]} [config.providers] - A collection of providers to load.\n * @param {Boolean} [config.replace] - When the component is appended to its container, clears the place before\n * @param {Number|String} [config.width] - The width in pixels, or 'auto' to use the container's width\n * @param {Number|String} [config.height] - The height in pixels, or 'auto' to use the container's height\n * @param {Boolean} [config.options.fullPage] - Force the previewer to occupy the full window.\n * @param {Booleanh} [config.options.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function previewerFactory(container, config = {}, template = null) {\n\n return runnerComponentFactory(container, config, template || runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => this.destroy() );\n });\n };\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/provider/item/css/item',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/component/qtiItem',[\n 'context',\n 'taoQtiTestPreviewer/previewer/runner',\n 'css!taoQtiTestPreviewer/previewer/provider/item/css/item'\n], function (context, previewerFactory) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n * @param {String} [config.itemUri] - The URI of the item to load\n * @param {Object} [config.itemState] - The state of the item when relevant\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {Object[]} [config.pluginsOptions] - Options for the plugins\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function qtiItemPreviewerFactory(container, config = {}, template = null) {\n\n const testRunnerConfig = {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n providers: {\n runner: {\n id: 'qtiItemPreviewer',\n module: 'taoQtiTestPreviewer/previewer/provider/item/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'runner'\n },\n proxy: {\n id: 'qtiItemPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n },\n communicator: {\n id: 'request',\n module: 'core/communicator/request',\n bundle: 'loader/vendor.min',\n category: 'communicator'\n },\n plugins: config.plugins || []\n },\n options: {\n view: config.view,\n readOnly: config.readOnly,\n fullPage: config.fullPage,\n plugins: config.pluginsOptions,\n hideActionBars: config.hideActionBars,\n }\n };\n\n //extra context config\n testRunnerConfig.loadFromBundle = !!context.bundle;\n\n return previewerFactory(container, testRunnerConfig, template)\n .on('ready', runner => {\n if (config.itemState) {\n runner.on('renderitem', () => runner.itemRunner.setState(config.itemState));\n }\n if (config.itemUri) {\n return runner.loadItem(config.itemUri);\n }\n });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/item/qtiItem',[\n 'lodash',\n 'core/logger',\n 'taoQtiTestPreviewer/previewer/component/qtiItem',\n 'ui/feedback'\n], function (_, loggerFactory, qtiItemPreviewerFactory, feedback) {\n 'use strict';\n\n const logger = loggerFactory('taoQtiTest/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [{\n module: 'taoQtiTestPreviewer/previewer/plugins/controls/close',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'controls'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'navigation'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'tools'\n }, {\n module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'tools'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }];\n\n /**\n * Wraps the legacy item previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiItem',\n\n /**\n * Builds and shows the legacy item previewer\n *\n * @param {String} uri - The URI of the item to load\n * @param {Object} state - The state of the item\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(uri, state, config = {}) {\n config.itemUri = uri;\n config.itemState = state;\n config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n return qtiItemPreviewerFactory(window.document.body, config)\n .on('error', function (err) {\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n } else {\n logger.error(err);\n }\n });\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Config manager for the proxy of the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/config/item',[\n 'lodash',\n 'util/url',\n 'util/config'\n], function(_, urlUtil, configHelper) {\n 'use strict';\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n bootstrap : {\n serviceController : 'Previewer',\n serviceExtension : 'taoQtiTestPreviewer'\n }\n };\n\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n var _entries = {\n serviceCallId : true,\n bootstrap : false,\n timeout : false\n };\n\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.serviceCallId - An identifier for the service call\n * @param {String} [config.bootstrap.serviceController] - The name of the service controller\n * @param {String} [config.bootstrap.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n return function itemPreviewerConfigFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef;\n\n // convert some values from seconds to milliseconds\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n }\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the list of parameters\n * @param {String|Object} [itemIdentifier]\n * @returns {Object}\n */\n getParameters: function getParameters(itemIdentifier) {\n var type = typeof itemIdentifier;\n var parameters = {\n serviceCallId : this.getServiceCallId()\n };\n\n if (type === 'string') {\n // simple item identifier\n parameters.itemUri = itemIdentifier;\n // structured item identifier (a list of parameters)\n } else if (type === 'object' && _.isPlainObject(itemIdentifier)) {\n _.merge(parameters, itemIdentifier);\n } else if (type !== 'undefined') {\n throw new TypeError('Wrong parameter type provided for itemIdentifier: ' + type + '. Only string or plain object are allowed!');\n }\n\n return parameters;\n },\n\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId : function getServiceCallId() {\n return storage.serviceCallId;\n },\n\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController : function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension : function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n\n /**\n * Gets an URL of a service action\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl : function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters());\n },\n\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String|Object} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl : function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters(itemIdentifier));\n },\n\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout : function getTimeout() {\n return storage.timeout;\n }\n };\n };\n});\n\n","\ndefine(\"json!taoQtiTestPreviewer/previewer/resources/devices.json\", function(){ return {\n \"tablets\": {\n \"193986c3715c81838870f908fa98d69a\": {\n \"label\": \"Amazon Kindle Fire HDX 7\\u2033\",\n \"width\": 960,\n \"height\": 600\n },\n \"4e8eafab11aad1486992d7ee2c8c16ca\": {\n \"label\": \"Apple iPad\",\n \"width\": 1024,\n \"height\": 768\n },\n \"5aac2932d9ad00d6d8a1604b8f9e4e8d\": {\n \"label\": \"Google Nexus 10, Motorola Xoom, Xyboard\",\n \"width\": 1280,\n \"height\": 800\n },\n \"9805d9753ad08c7630a9ee5418aa6c6c\": {\n \"label\": \"Google Nexus 7\",\n \"width\": 966,\n \"height\": 604\n },\n \"d4a431cedf4705d6bf2cba6d5788378b\": {\n \"label\": \"Samsung Galaxy Tab 7.7, 8.9, 10.1\",\n \"width\": 1280,\n \"height\": 800\n }\n },\n \"phones\": {\n \"1b89338531ef0155c8d6abc2ac02c81a\": {\n \"label\": \"Apple iPhone 3GS\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1,\n \"dpWidth\": 320,\n \"dpHeight\": 480\n },\n \"3f89da99d84214cde7df87ebe0699a6f\": {\n \"label\": \"Apple iPhone 4\",\n \"width\": 640,\n \"height\": 960,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 1920\n },\n \"0d36971a5b98b367f54ced708c9af849\": {\n \"label\": \"Apple iPhone 5\",\n \"width\": 640,\n \"height\": 1136,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 2272\n },\n \"026beffcc051af995660ebdede986ace\": {\n \"label\": \"BlackBerry Z10\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"fd2dd53e667d6d49e4fa73356fa941dd\": {\n \"label\": \"BlackBerry Z30\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"707584c1ae17d9b5b2cbe8603c91c147\": {\n \"label\": \"Google Nexus 4\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"91823264de952e7f2347e07db5c4058b\": {\n \"label\": \"Google Nexus 5\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"cd69817a6e147e8a4677389e56fcf568\": {\n \"label\": \"Google Nexus S\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"75994faa6a38e31e99b53fcd75534a33\": {\n \"label\": \"HTC Evo, Touch HD, Desire HD, Desire\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0cab4dfccdfc880687cb608cfe4159db\": {\n \"label\": \"HTC One X, EVO LTE\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"c4ff41fcba24d74fc21dc3490ca1edc9\": {\n \"label\": \"HTC Sensation, Evo 3D\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 360,\n \"dpHeight\": 1440\n },\n \"fa969a5e0dd2de53700eeee4ba4ba142\": {\n \"label\": \"LG Optimus 2X, Optimus 3D, Optimus Black\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"33c4f9364e295ec03531f3a3425819cf\": {\n \"label\": \"LG Optimus G\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"bc47f5275f0efd56fee52d43a8082981\": {\n \"label\": \"LG Optimus LTE, Optimus 4X HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1.7,\n \"dpWidth\": 424,\n \"dpHeight\": 2176\n },\n \"0732887e6e324fd10777b735520a34cf\": {\n \"label\": \"LG Optimus One\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 213,\n \"dpHeight\": 720\n },\n \"2e38a78364f09d0da0e9e1a3a68e7fb0\": {\n \"label\": \"Motorola Defy, Droid, Droid X, Milestone\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1281\n },\n \"bd4b78dddc7c9625a4141a1b1ddabb87\": {\n \"label\": \"Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1,\n \"dpWidth\": 540,\n \"dpHeight\": 960\n },\n \"3bf1edf21cfa81006183d2b02974c84e\": {\n \"label\": \"Motorola Droid Razr HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1,\n \"dpWidth\": 720,\n \"dpHeight\": 1280\n },\n \"ab5a352e0e016b97dac986f06c394f55\": {\n \"label\": \"Nokia C5, C6, C7, N97, N8, X7\",\n \"width\": 360,\n \"height\": 640,\n \"scaleFactor\": 1,\n \"dpWidth\": 360,\n \"dpHeight\": 640\n },\n \"4826fb7d7257aeaac992ce699df41b3c\": {\n \"label\": \"Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0a691ab20add7c432200f8fa6527b488\": {\n \"label\": \"Samsung Galaxy Note\",\n \"width\": 800,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 400,\n \"dpHeight\": 2560\n },\n \"9c23ee31be29960fbac9e9bbfc2fc7b0\": {\n \"label\": \"Samsung Galaxy Note 3\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 2,\n \"dpWidth\": 540,\n \"dpHeight\": 3840\n },\n \"92177c0508c1d73905a58e2338f2a81f\": {\n \"label\": \"Samsung Galaxy Note II\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"5222b8866dc4cc606725e16ffcc0a783\": {\n \"label\": \"Samsung Galaxy S III, Galaxy Nexus\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"37c1541e2bd55cfd0f4073b0ccdf68b3\": {\n \"label\": \"Samsung Galaxy S, S II, W\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"2f7f64b7dda0144907ff300e83eed465\": {\n \"label\": \"Samsung Galaxy S4\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"9c24f9057744dad56043702a9703127f\": {\n \"label\": \"Sony Xperia S, Ion\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"0a8b2732a016a9395c3af5f12dd9c0da\": {\n \"label\": \"Sony Xperia Sola, U\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1,\n \"dpWidth\": 480,\n \"dpHeight\": 854\n },\n \"5a153d7f53d82dcb0801f041574a6a43\": {\n \"label\": \"Sony Xperia Z, Z1\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n }\n },\n \"screens\": {\n \"9e523ae15b61dc766f5c818726881ecf\": {\n \"label\": \"1920 \\u00d7 1080\",\n \"width\": 1920,\n \"height\": 1080,\n \"dpWidth\": 1920,\n \"dpHeight\": 1080,\n \"scaleFactor\": 1\n },\n \"07769cd8d0a7d09818b2f0b018042fb7\": {\n \"label\": \"1366 \\u00d7 768\",\n \"width\": 1366,\n \"height\": 768,\n \"dpWidth\": 1366,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"72d5478a24194f98b9378e8e0fd65737\": {\n \"label\": \"1280 \\u00d7 1024\",\n \"width\": 1280,\n \"height\": 1024,\n \"dpWidth\": 1280,\n \"dpHeight\": 1024,\n \"scaleFactor\": 1\n },\n \"b7a6dd5900cc72e61f0d3479c7e314ec\": {\n \"label\": \"1280 \\u00d7 800\",\n \"width\": 1280,\n \"height\": 800,\n \"dpWidth\": 1280,\n \"dpHeight\": 800,\n \"scaleFactor\": 1\n },\n \"43193b0ff671a37d8232ab664190a125\": {\n \"label\": \"1024 \\u00d7 768\",\n \"width\": 1024,\n \"height\": 768,\n \"dpWidth\": 1024,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"c29e48814af5443ff5688d9e967ce917\": {\n \"label\": \"800 \\u00d7 600\",\n \"width\": 800,\n \"height\": 600,\n \"dpWidth\": 800,\n \"dpHeight\": 600,\n \"scaleFactor\": 1\n }\n }\n};});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA;\n */\n/**\n * Helper to work with screen values and mobile devices list\n * for \"select device\" select-box on any test-item preview page\n * for example using scale plugin app/taoQtiTestPreviewer/views/js/previewer/plugins/tools/scale/scale.js\n *\n * @author Dieter Raber \n * @author Pavel Hendelman \n */\ndefine('taoQtiTestPreviewer/previewer/helpers/devices',[\n 'lodash',\n 'json!taoQtiTestPreviewer/previewer/resources/devices.json'\n], function (\n _,\n deviceList\n) {\n 'use strict';\n\n /**\n * @typedef {Object} deviceScreen\n * @property {String} value - The selector's value to use\n * @property {String} label - The label to display in the selector\n * @property {Number} width - The width of the screen\n * @property {Number} height - The height of the screen\n */\n\n /**\n * Translation map to convert a device type to a collection's name in the provided list.\n * @type {Object}\n */\n var deviceTypeMap = {\n 'mobile': 'tablets',\n 'desktop': 'screens'\n };\n\n /**\n * Helpers to get the list of devices\n */\n var devicesHelper = {\n /**\n * Gets the list of devices to test item through. This list is meant to be used by a selector.\n * @param {String} type - The type of device from the list ['mobile', 'desktop']\n * @returns {deviceScreen[]} - The list of devices to test item through, filtered by the provided type\n */\n getDevicesByType : function getDevicesByType(type) {\n /*\n * @todo\n * The device list is currently based on the devices found on the Chrome emulator.\n * This is not ideal and should be changed in the future.\n * I have http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density in mind but we\n * will need to figure what criteria to apply when generating the list.\n */\n var key = deviceTypeMap[type];\n\n return _.map(deviceList[key] || [], function mapDeviceData(device, identifier) {\n return {\n value: identifier,\n label: device.label,\n width: device.width,\n height: device.height\n };\n });\n },\n\n /**\n * Gets the list of mobile devices\n * @returns {deviceScreen[]} - The list of mobile devices to test item through\n */\n getMobileDevices: function getMobileDevices() {\n return devicesHelper.getDevicesByType('mobile');\n },\n\n /**\n * Gets the list of desktop devices\n * @returns {deviceScreen[]} - The list of desktop devices to test item through\n */\n getDesktopDevices: function getDesktopDevices() {\n return devicesHelper.getDevicesByType('desktop');\n }\n };\n\n return devicesHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Content Plugin : cloneLogoInTestPreview\n *\n * This plugin can be used as a hook to clone logo from the header in the back office to the header in the test preview\n *\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/cloneLogoInTestPreview',['jquery', 'taoTests/runner/plugin'], function ($, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n name: 'cloneLogoInTestPreview',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n testRunner.after('ready', () => {\n // clone logo to preview - because logo source + class + styles can be customized by client extension\n $('#tao-main-logo').clone().appendTo('.previewer-test-component header');\n });\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Content Plugin : EnhancedReadOnlyMode\n *\n * This plugin can be used as a hook to do modification in the item preview for read only mode\n *\n * @author Ansul Sharma \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'taoTests/runner/plugin'\n], function ($, _, __, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'EnhancedReadOnlyMode',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n /**\n * Enables the plugin only in readOnly mode\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return config.options.readOnly;\n };\n\n testRunner\n .after('renderitem', () => {\n if (isPluginAllowed()) {\n const $contentArea = testRunner.getAreaBroker().getContentArea();\n const $extendedTextinteractionTextAreas = $contentArea.find('.qti-extendedTextInteraction textarea.text-container');\n const $ckeEditorsContent = $contentArea.find('.qti-extendedTextInteraction div.cke_contents');\n\n /**\n * Updates the height of textarea element of all extended text interactions based on the height of the content\n */\n if($extendedTextinteractionTextAreas.length) {\n $extendedTextinteractionTextAreas.each(function() {\n this.style.height = `${this.scrollHeight + 20}px`;\n });\n }\n\n /**\n * Updates the height of all the ckeEditor container of wysiwyg extended text interaction based on the height of the iFrame\n */\n if($ckeEditorsContent.length) {\n $ckeEditorsContent.each(function() {\n const $ckeEditorContent = $(this);\n const $ckeEditorIFrame = $ckeEditorContent.find('iframe.cke_wysiwyg_frame');\n\n /**\n * Only update the height when the iFrame has finished loading the styles because font-size may change the height\n */\n $ckeEditorIFrame.on('load', () => {\n setTimeout(() => {\n const ckeEditorBody = $ckeEditorIFrame[0].contentWindow.document.querySelector('body');\n $ckeEditorContent[0].style.height = `${ckeEditorBody.scrollHeight + 20}px`;\n }, 0);\n });\n });\n }\n }\n });\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Control Plugin : Close\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/controls/close',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/hider',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/templates/button'\n], function ($, _, __, hider, pluginFactory, buttonTpl) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'close',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.hideActionBars;\n }\n\n this.$element = $(buttonTpl({\n control: 'close',\n title: __('Close the previewer'),\n icon: 'close',\n text: __('Close'),\n className: 'context-action'\n }));\n\n this.$element.on('click', function (e) {\n e.preventDefault();\n if (self.getState('enabled') !== false) {\n self.disable();\n testRunner.trigger('finish');\n }\n });\n\n this.disable();\n\n testRunner\n .on('enablenav', function () {\n if (isPluginAllowed()) {\n self.enable();\n }\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n\n //attach the element to the navigation area\n var $container = this.getAreaBroker().getArea('context');\n $container.append(this.$element);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
          \\n
            \\n
            \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
          • \";\n  if (helper = helpers.time) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.time); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\n  if (helper = helpers.type) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.type); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\n  if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  if(stack1 || stack1 === 0) { buffer += stack1; }\n  buffer += \"
          • \";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Navigation Plugin : Submit\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'moment',\n 'ui/hider',\n 'ui/autoscroll',\n 'util/strPad',\n 'taoTests/runner/plugin',\n 'taoQtiItem/qtiCommonRenderer/helpers/PciResponse',\n 'tpl!taoQtiTest/runner/plugins/templates/button',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer'\n], function (\n $,\n _,\n __,\n moment,\n hider,\n autoscroll,\n strPad,\n pluginFactory,\n pciResponse,\n buttonTpl,\n consoleTpl,\n consoleLineTpl,\n consoleCloserTpl\n) {\n 'use strict';\n\n /**\n * Some default config for the plugin\n * @type {Object}\n */\n const defaults = {\n submitTitle: __('Submit and show the result'),\n submitText: __('Submit'),\n submitIcon: 'forward'\n };\n\n return pluginFactory({\n\n name: 'submit',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const pluginConfig = _.defaults(this.getConfig(), defaults);\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return !config.options.readOnly;\n };\n\n // display the console and its related controls, then auto scrolls to the last element\n const showConsole = () => {\n hider.show(this.controls.$console);\n hider.show(this.controls.$consoleBody);\n hider.show(this.controls.$consoleCloser);\n autoscroll(this.controls.$consoleBody.children().last(), this.controls.$consoleBody);\n };\n\n // hide the console and its related controls\n const hideConsole = () => {\n hider.hide(this.controls.$console);\n hider.hide(this.controls.$consoleCloser);\n };\n\n // add a line to the console\n const addConsoleLine = (type, message) => {\n const data = {\n time: strPad(moment().format('HH:mm:ss'), 12, ' '),\n type: strPad(type || '', 18, ' '),\n message: strPad(message || '', 18, ' ')\n };\n this.controls.$consoleBody.append($(consoleLineTpl(data)));\n };\n\n // display responses in the console\n const showResponses = (type, responses) => {\n _.forEach(responses, (response, identifier) => {\n addConsoleLine(type, strPad(`${identifier}: `, 15, ' ') + _.escape(pciResponse.prettyPrint(response)));\n });\n };\n\n this.controls = {\n $button: $(buttonTpl({\n control: 'submit',\n title: pluginConfig.submitTitle,\n icon: pluginConfig.submitIcon,\n text: pluginConfig.submitText\n })),\n $console: $(consoleTpl()),\n $consoleCloser: $(consoleCloserTpl())\n };\n this.controls.$consoleBody = this.controls.$console.find('.preview-console-body');\n\n this.controls.$button.on('click', e => {\n e.preventDefault();\n if (this.getState('enabled') !== false) {\n this.disable();\n testRunner.trigger('submititem');\n }\n });\n\n this.controls.$consoleCloser.on('click', e => {\n e.preventDefault();\n hideConsole();\n });\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', () => {\n if (isPluginAllowed()) {\n this.show();\n } else {\n this.hide();\n }\n })\n .on('submitresponse', responses => {\n showResponses(__('Submitted data'), responses);\n showConsole();\n })\n .on('scoreitem', responses => {\n if (responses.itemSession) {\n showResponses(__('Output data'), responses.itemSession);\n showConsole();\n }\n })\n .on('enablenav', () => {\n this.enable();\n })\n .on('disablenav', () => {\n this.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render() {\n //attach the element to the navigation area\n const $container = this.getAreaBroker().getContainer();\n const $navigation = this.getAreaBroker().getNavigationArea();\n $navigation.append(this.controls.$button);\n $navigation.append(this.controls.$consoleCloser);\n $container.append(this.controls.$console);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n _.forEach(this.controls, $el => $el.remove());\n this.controls = null;\n },\n\n /**\n * Enable the button\n */\n enable() {\n this.controls.$button\n .prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable() {\n this.controls.$button\n .prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show() {\n hider.show(this.controls.$button);\n },\n\n /**\n * Hide the button\n */\n hide() {\n _.forEach(this.controls, hider.hide);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
            \\n
            \\n
            \\n
            \\n
            \\n
            \\n
            \\n
            \";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/transformer',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css'\n], function ($, _, __, componentFactory, transformer, devicesPreviewerTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} size\n * @property {Number} width\n * @property {Number} height\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n deviceType: 'standard',\n deviceWith: 0,\n deviceHeight: 0,\n deviceOrientation: null\n };\n\n /**\n * Builds a devices previewer component. It will works in two modes:\n * - the standard mode will do nothing special, this is simply a sleeping mode\n * - the device mode will redesign the view to show a content using a device's layout and aspect ratio\n *\n * @example\n * var devicesPreviewer = devicesPreviewerFactory('.previewer .previewer-content);\n * ...\n * // react to changes\n * devicesPreviewer\n * .on('devicewidthchange', function(width) {\n * // the width has changed\n * })\n * .on('deviceheightchange', function(height) {\n * // the height has changed\n * })\n * .on('deviceorientationchange', function(orientation) {\n * // the orientation has changed\n * })\n * .on('devicetypechange', function(type) {\n * // the type has changed\n * })\n * .on('devicepreview', function() {\n * // the device preview mode has been applied\n * });\n * ...\n * // apply changes\n * devicesPreviewer\n * .setDeviceType(type)\n * .setDeviceOrientation(orientation)\n * .setDeviceWidth(width)\n * .setDeviceHeight(height)\n * .previewDevice();\n * ...\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.deviceType='standard'] - The preview mode to apply\n * @param {Number} [config.deviceWidth=null] - The width of the device to preview\n * @param {Number} [config.deviceHeight=null] - The height of the device to preview\n * @param {String} [config.deviceOrientation='landscape'] - The device orientation\n * @returns {devicesPreviewer}\n * @fires ready - When the component is ready to work\n */\n function devicesPreviewerFactory(container, config) {\n var controls = null;\n\n /**\n * Remove the applied scale\n */\n var resetScale = function resetScale() {\n if (controls) {\n controls.$previewContent.removeAttr('style');\n controls.$previewContainer.removeAttr('style');\n }\n };\n\n // component specific API\n var api = {\n /**\n * Gets the device width.\n * @returns {Number}\n */\n getDeviceWidth: function getDeviceWidth() {\n return this.getConfig().deviceWidth;\n },\n\n /**\n * Sets the device width.\n * @param {String|Number} width\n * @returns {devicesPreviewer}\n * @fires devicewidthchange\n */\n setDeviceWidth: function setDeviceWidth(width) {\n var componentConfig = this.getConfig();\n componentConfig.deviceWidth = parseInt(width, 10) || 0;\n\n /**\n * @event devicewidthchange\n * @param {Number} deviceWidth\n */\n this.trigger('devicewidthchange', componentConfig.deviceWidth);\n\n return this;\n },\n\n /**\n * Gets the device height.\n * @returns {Number}\n */\n getDeviceHeight: function getDeviceHeight() {\n return this.getConfig().deviceHeight;\n },\n\n /**\n * Sets the device height.\n * @param {String|Number} height\n * @returns {devicesPreviewer}\n * @fires deviceheightchange\n */\n setDeviceHeight: function setDeviceHeight(height) {\n var componentConfig = this.getConfig();\n componentConfig.deviceHeight = parseInt(height, 10) || 0;\n\n /**\n * @event deviceheightchange\n * @param {Number} deviceHeight\n */\n this.trigger('deviceheightchange', componentConfig.deviceHeight);\n\n return this;\n },\n\n /**\n * Gets the device orientation.\n * @returns {String}\n */\n getDeviceOrientation: function getDeviceOrientation() {\n return this.getConfig().deviceOrientation;\n },\n\n /**\n * Sets the device orientation.\n * @param {String} orientation\n * @returns {devicesPreviewer}\n * @fires deviceorientationchange\n */\n setDeviceOrientation: function setDeviceOrientation(orientation) {\n var componentConfig = this.getConfig();\n componentConfig.deviceOrientation = orientation;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-orientation', componentConfig.deviceOrientation);\n }\n\n /**\n * @event deviceorientationchange\n * @param {String} deviceOrientation\n */\n this.trigger('deviceorientationchange', componentConfig.deviceOrientation);\n\n return this;\n },\n\n /**\n * Tells if the previewer has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return this.getDeviceType() !== 'standard';\n },\n\n /**\n * Gets the device type.\n * @returns {String}\n */\n getDeviceType: function getDeviceType() {\n return this.getConfig().deviceType;\n },\n\n /**\n * Sets the type of device\n * @param {String} type\n * @returns {devicesPreviewer}\n * @fires devicetypechange\n */\n setDeviceType: function setDeviceType(type) {\n var componentConfig = this.getConfig();\n componentConfig.deviceType = type;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-type', componentConfig.deviceType);\n }\n\n /**\n * @event devicetypechange\n * @param {String} deviceType\n */\n this.trigger('devicetypechange', componentConfig.deviceType);\n\n return this;\n },\n\n /**\n * Previews the content using the current device settings\n * @returns {devicesPreviewer}\n * @fires devicepreview after the device has been set on preview\n */\n previewDevice: function previewDevice() {\n var width, height;\n\n if (this.is('rendered')) {\n if (this.is('disabled') || this.getDeviceType() === 'standard') {\n // standard mode and disabled state both should be reflected by a \"no scale\" view\n this.clearScale();\n } else {\n // in device preview mode, we need to apply the device's size with respect to the orientation\n if (this.getDeviceOrientation() === 'portrait') {\n width = this.getDeviceHeight();\n height = this.getDeviceWidth();\n } else {\n width = this.getDeviceWidth();\n height = this.getDeviceHeight();\n }\n this.applyScale(width, height);\n }\n\n /**\n * @event devicepreview\n */\n this.trigger('devicepreview');\n }\n\n return this;\n },\n\n /**\n * Removes the scale settings applied on the devices previewer\n * @returns {devicesPreviewer}\n * @fires scaleclear after the scale settings have been cleared\n */\n clearScale: function clearScale() {\n if (this.is('rendered')) {\n resetScale();\n\n /**\n * @event scaleclear\n */\n this.trigger('scaleclear');\n }\n\n return this;\n },\n\n /**\n * Computes and applies the scale settings on the devices previewer\n * @param {Number} width\n * @param {Number} height\n * @returns {devicesPreviewer}\n * * @fires scalechange after the scale settings have been applied\n */\n applyScale: function applyScale(width, height) {\n var frameSize, frameMargins, scaleFactor;\n\n if (this.is('rendered')) {\n resetScale();\n\n frameSize = this.getFrameSize();\n frameMargins = this.getFrameMargins();\n scaleFactor = this.getScaleFactor(width, height);\n\n controls.$previewContent\n .width(width)\n .height(height);\n\n controls.$previewContainer\n .css('left', (frameSize.width - (width + frameMargins.width) * scaleFactor) / 2)\n .width(width + frameMargins.width)\n .height(height + frameMargins.height);\n\n transformer.setTransformOrigin(controls.$previewContainer, 0, 0);\n transformer.scale(controls.$previewContainer, scaleFactor);\n\n /**\n * @event scalechange\n */\n this.trigger('scalechange');\n }\n\n return this;\n },\n\n /**\n * Computes and gets the margins of the previewer frame\n * @returns {size}\n */\n getFrameMargins: function getFrameMargins() {\n var margins = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n margins.width = controls.$previewContainer.outerWidth() - controls.$previewContent.width();\n margins.height = controls.$previewContainer.outerHeight() - controls.$previewContent.height();\n }\n return margins;\n },\n\n /**\n * Computes and gets the available size in the previewer frame\n * @returns {size}\n */\n getFrameSize: function getFrameSize() {\n var size = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n size.width = this.getContainer().innerWidth();\n size.height = this.getContainer().innerHeight();\n }\n return size;\n },\n\n /**\n * Computes and gets the scale factor of the previewer frame\n * @param {Number} width\n * @param {Number} height\n * @returns {Number}\n */\n getScaleFactor: function getScaleFactor(width, height) {\n var margins, frameSize;\n var scaleFactor = {\n x: 1,\n y: 1\n };\n if (this.is('rendered') && this.isDeviceMode()) {\n frameSize = this.getFrameSize();\n margins = this.getFrameMargins();\n width += margins.width;\n height += margins.height;\n\n if (width > frameSize.width) {\n scaleFactor.x = frameSize.width / width;\n }\n\n if (height > frameSize.height) {\n scaleFactor.y = frameSize.height / height;\n }\n }\n return Math.min(scaleFactor.x, scaleFactor.y);\n },\n\n /**\n * Wraps the previewed content into the previewer frame\n * @param {HTMLElement|jQuery} element\n * @returns {devicesPreviewer}\n * @fires wrap after the element has been wrapped\n */\n wrap: function wrap(element) {\n if (this.is('rendered')) {\n // restore current wrapped element to its previous place\n this.unwrap();\n\n // move the element to wrap in the preview container\n controls.$wrappedElement = $(element);\n controls.$wrappedElementContainer = controls.$wrappedElement.parent();\n controls.$previewContent.append(controls.$wrappedElement);\n\n /**\n * @event wrap\n * @param {jQuery} $wrappedElement - The element that has been wrapped\n */\n this.trigger('wrap', controls.$wrappedElement);\n }\n\n return this;\n },\n\n /**\n * Unwraps the previewed content from the previewer frame\n * @returns {devicesPreviewer}\n * @fires unwrap after the element has been unwrapped\n */\n unwrap: function unwrap() {\n var $wasWrappedElement;\n if (this.is('rendered') && controls.$wrappedElement) {\n $wasWrappedElement = controls.$wrappedElement;\n\n // restore current wrapped element to its previous place\n controls.$wrappedElementContainer.append(controls.$wrappedElement);\n controls.$wrappedElement = null;\n controls.$wrappedElementContainer = null;\n\n /**\n * @event unwrap\n * @param {jQuery} $wrappedElement - The element that was wrapped\n */\n this.trigger('unwrap', $wasWrappedElement);\n }\n\n return this;\n }\n };\n\n // build and setup the component\n var devicesPreviewer = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesPreviewerTpl)\n\n // auto render on init\n .on('init', function () {\n var componentConfig = this.getConfig();\n\n // init the internal state\n this.setDeviceType(componentConfig.deviceType);\n this.setDeviceWidth(componentConfig.deviceWidth);\n this.setDeviceHeight(componentConfig.deviceHeight);\n this.setDeviceOrientation(componentConfig.deviceOrientation);\n\n // auto render on init\n _.defer(function () {\n devicesPreviewer.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var $element = this.getElement();\n controls = {\n // internal elements\n $previewContainer: $element.find('.preview-container'),\n $previewFrame: $element.find('.preview-frame'),\n $previewContent: $element.find('.preview-content'),\n\n // placeholder for the wrapped element\n $wrappedElement: null,\n $wrappedElementContainer: null\n };\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable enable', function () {\n var self = this;\n if (this.is('rendered')) {\n // need to defer the call as the enable/disable events are emitted before the state is updated\n _.defer(function () {\n self.previewDevice();\n });\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n this.unwrap();\n controls = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesPreviewer.init(config);\n });\n\n return devicesPreviewer;\n }\n\n return devicesPreviewerFactory;\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
            \\n
            \\n
            \\n
            \\n
            \\n
            \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \"selected=\\\"selected\\\"\";\n }\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/selecter',\n 'taoQtiTestPreviewer/previewer/helpers/devices',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css'\n], function ($, _, __, componentFactory, lookupSelecter, devicesHelper, devicesSelectorTpl, selectorTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} selectorEntry\n * @property {String} value - The value that identifies the entry\n * @property {String} label - The text displayed to describe the entry\n */\n\n /**\n * @typedef {selectorEntry} mainSelectorEntry\n * @property {Boolean} devicesList - tells if a list of devices is expected\n * @property {Boolean} orientation - tells if a list of orientations is expected\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n type: 'standard',\n device: null,\n orientation: 'landscape'\n };\n\n /**\n * List of available types of devices\n * @type {mainSelectorEntry[]}\n */\n var deviceTypesList = [{\n value: 'standard',\n label: __('Actual size'),\n devicesList: false,\n orientation: false\n }, {\n value: 'desktop',\n label: __('Desktop preview'),\n devicesList: true,\n orientation: false\n }, {\n value: 'mobile',\n label: __('Mobile preview'),\n devicesList: true,\n orientation: true\n }];\n\n /**\n * List of available orientations\n * @type {selectorEntry[]}\n */\n var deviceOrientationsList = [{\n value: 'landscape',\n label: __('Landscape')\n }, {\n value: 'portrait',\n label: __('Portrait')\n }];\n\n /**\n * Map selector's names to setter callbacks.\n * This will be used to call the expected setter when selecting a value.\n * @see devicesSelector.select()\n * @type {Object}\n */\n var callbackMap = {\n type: 'setType',\n device: 'setDevice',\n mobile: 'setDevice',\n desktop: 'setDevice',\n orientation: 'setOrientation'\n };\n\n /**\n * Gets the data for a selected entry\n * @param {String} selected\n * @param {selectorEntry[]|deviceScreen[]} list\n * @returns {selectorEntry|deviceScreen|null}\n */\n function getSelectorData(selected, list) {\n if (selected && _.size(list)) {\n return _.find(list, {value: selected}) || null;\n }\n return null;\n }\n\n /**\n * Ensures an identifier is valid with respect to the provided list, or defaulted to null.\n * @param {String} identifier\n * @param {selectorEntry[]} list\n * @returns {String|null}\n */\n function getValidIdentifier(identifier, list) {\n if (list && list.length) {\n if (_.find(list, {value: identifier})) {\n return identifier;\n } else {\n return _.first(list).value;\n }\n }\n return null;\n }\n\n /**\n * Update a Select2 control\n * @param {jQuery} $selector\n * @param {String} value\n * @returns {jQuery}\n */\n function updateSelect2($selector, value) {\n var current = $selector.val();\n // avoid to stress the setters if the value is already set\n if (current !== value) {\n $selector.val(value);\n $selector.trigger('change');\n }\n return $selector;\n }\n\n /**\n * Uninstalls a Select2 control\n * @param {jQuery} $selector\n * @returns {jQuery}\n */\n function removeSelect2($selector) {\n if ($selector.hasClass(\"select2-offscreen\")) {\n $selector.select2('destroy');\n }\n return $selector;\n }\n\n /**\n * Builds a devices selector component. It will provides 3 selectors in cascade:\n * - the first allows to select the type of device\n * - the second allows to select the device itself, the list being filtered by the value of the first selector\n * - the third allows to select the display orientation, if applicable\n *\n * @example\n * var devicesSelector = devicesSelectorFactory('.previewer .previewer-top-bar);\n * ...\n * // react to type change\n * devicesSelector.on('typechange', function(type) {\n * if (!this.isDeviceMode()) {\n * // reset the type to standard, we can re-apply the default size\n * }\n * });\n *\n * // react to device change\n * devicesSelector.on('devicechange', function(device, data) {\n * // apply the size provided in data\n * });\n *\n * // react to orientation change\n * devicesSelector.on('orientationchange', function(orientation) {\n * // apply the orientation\n * });\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.type='standard'] - The default selected device type\n * @param {String} [config.device=null] - The default selected device\n * @param {String} [config.orientation='landscape'] - The default selected orientation\n * @returns {devicesSelector}\n * @fires ready - When the component is ready to work\n */\n function devicesSelectorFactory(container, config) {\n // internal state\n var selected = {\n type: null,\n device: null,\n orientation: null,\n desktop: null,\n mobile: null\n };\n var devicesList = [];\n var typeData = null;\n var controls = null;\n\n /**\n * Changes a DOM property on each selector\n * @param {String} property\n * @param {String|Boolean|Number} value\n */\n var setControlsProp = function setControlsProp(property, value) {\n _.forEach(controls, function($selector) {\n $selector.prop(property, value);\n });\n };\n\n // component specific API\n var api = {\n /**\n * Tells if the selector has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return selected.type !== 'standard';\n },\n\n /**\n * Reflects the mode to the DOM\n * @returns {devicesSelector}\n */\n updateMode: function updateMode() {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n if (this.is('rendered')) {\n this.getElement().attr('data-type', selected.type);\n }\n return this;\n },\n\n /**\n * Gets the selected device type.\n * @returns {String} The type of device, from the list `['standard', 'mobile', 'desktop']`\n */\n getType: function getType() {\n return selected.type;\n },\n\n /**\n * Gets the selected device orientation.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String}\n */\n getOrientation: function getOrientation() {\n if (typeData && typeData.orientation) {\n return selected.orientation;\n }\n return null;\n },\n\n /**\n * Gets the identifier of the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String|null}\n */\n getDevice: function getDevice() {\n if (typeData && typeData.devicesList) {\n return selected.device;\n }\n return null;\n },\n\n /**\n * Gets the data for the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {deviceScreen|null}\n */\n getDeviceData: function getDeviceData() {\n return getSelectorData(this.getDevice(), devicesList);\n },\n\n /**\n * Selects a type of device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires typechange event after the type has been changed\n * @fires devicechange event after the device has been updated if a list of devices is expected\n */\n setType: function setType(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceTypesList);\n if (identifier !== selected.type) {\n selected.type = identifier;\n selected.device = null;\n\n // when the type changes, the list of devices must be updated\n devicesList = devicesHelper.getDevicesByType(selected.type);\n typeData = getSelectorData(selected.type, deviceTypesList);\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$typeSelector, selected.type);\n this.updateMode();\n }\n\n /**\n * @event typechange\n * @param {String} selectedType\n */\n this.trigger('typechange', selected.type);\n\n // the current device must be adapted if a list of devices is expected\n if (typeData.devicesList) {\n this.setDevice(selected[selected.type]);\n }\n }\n return this;\n },\n\n /**\n * Sets the selected device orientation\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires orientationchange event after the type has been changed\n */\n setOrientation: function setOrientation(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceOrientationsList);\n if (identifier !== selected.orientation) {\n selected.orientation = identifier;\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$orientationSelector, selected.orientation);\n }\n\n /**\n * @event orientationchange\n * @param {String} selectedOrientation\n */\n this.trigger('orientationchange', selected.orientation);\n }\n return this;\n },\n\n /**\n * Selects a device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires devicechange event after the device has been changed\n */\n setDevice: function setDevice(identifier) {\n var $selector;\n\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, devicesList);\n if (identifier !== selected.device) {\n selected.device = identifier;\n selected[selected.type] = identifier;\n\n // update the rendered content, depending on the device's category\n if (this.is('rendered') && this.isDeviceMode()) {\n $selector = controls['$' + selected.type + 'Selector'];\n if ($selector) {\n updateSelect2($selector, selected.device);\n }\n }\n\n /**\n * @event devicechange\n * @param {String} selectedDevice\n * @param {deviceScreen} deviceData\n */\n this.trigger('devicechange', selected.device, this.getDeviceData());\n }\n return this;\n },\n\n /**\n * Selects a value in the proper selector\n * @param {String} name - The name of the selector\n * @param {String} value - The value to select\n * @returns {devicesSelector}\n */\n select: function select(name, value) {\n var setterName = callbackMap[name];\n if (setterName && _.isFunction(this[setterName])) {\n this[setterName](value);\n }\n return this;\n },\n\n /**\n * Reset to default values, from the config.\n * @returns {devicesSelector}\n */\n reset: function reset() {\n var componentConfig = this.getConfig();\n this.setType(componentConfig.type);\n this.setDevice(componentConfig.device);\n this.setOrientation(componentConfig.orientation);\n return this;\n }\n };\n\n // build and setup the component\n var devicesSelector = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesSelectorTpl)\n\n // auto render on init\n .on('init', function () {\n // ensure the initial state is aligned with the config\n this.reset();\n\n // auto render on init\n _.defer(function () {\n devicesSelector.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var self = this;\n\n /**\n * Renders a selector from a list of entries. Takes care of the currently selected value.\n * @param {String} name - The name of the selector\n * @param {selectorEntry[]} list - The list of entries\n * @param {String} selectedValue - The currently selected value\n * @param {String} [category=name] - The category of the selector (type, device, orientation).\n * Defaulted to the name if not provided.\n * @returns {jQuery}\n */\n function renderSelector(name, list, selectedValue, category) {\n var $selector = $(selectorTpl({\n name: name,\n category: category || name,\n items: _.map(list, function(item) {\n return {\n value: item.value,\n label: item.label,\n selected: selectedValue === item.value\n };\n })\n }));\n self.getElement().find('.' + name + '-selector').html($selector);\n return $selector;\n }\n\n // create each selector, and keep access to them\n controls = {\n $typeSelector: renderSelector('type', deviceTypesList, selected.type),\n $desktopSelector: renderSelector('desktop', devicesHelper.getDesktopDevices(), selected.device, 'device'),\n $mobileSelector: renderSelector('mobile', devicesHelper.getMobileDevices(), selected.device, 'device'),\n $orientationSelector: renderSelector('orientation', deviceOrientationsList, selected.orientation)\n };\n lookupSelecter(this.getElement());\n\n // react to any change in selectors and then forward the event to the related entry\n this.getElement().on('change', '.selector', function onSelectorChange(e) {\n var $selector = $(e.target).closest('select');\n self.select($selector.attr('name'), $selector.val());\n });\n\n // initialize the display mode\n this.updateMode();\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", true);\n }\n })\n .on('enable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", false);\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n _.forEach(controls, removeSelect2);\n controls = null;\n selected = null;\n typeData = null;\n devicesList = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesSelector.init(config);\n });\n\n return devicesSelector;\n }\n\n return devicesSelectorFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Responsive Scale plugin : Scale\n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',[\n 'jquery',\n 'lodash',\n 'lib/uuid',\n 'util/namespace',\n 'taoTests/runner/plugin',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector'\n], function (\n $,\n _,\n uuid,\n namespaceHelper,\n pluginFactory,\n devicesPreviewerFactory,\n devicesSelectorFactory\n) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'scale',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.readOnly;\n }\n\n // generate unique id for global events\n this.nsId = this.getName() + uuid(6);\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', function () {\n if (isPluginAllowed()) {\n self.show();\n } else {\n self.hide();\n }\n })\n .on('resizeitem', function (size, orientation, type) {\n if (self.devicesPreviewer) {\n self.devicesPreviewer\n .setDeviceType(type)\n .setDeviceOrientation(orientation)\n .setDeviceWidth(size && size.width)\n .setDeviceHeight(size && size.height)\n .previewDevice();\n }\n })\n .on('enablenav', function () {\n self.enable();\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n * Renders plugins controls on proper place\n */\n render: function render() {\n var self = this;\n var testRunner = this.getTestRunner();\n var areaBroker = this.getAreaBroker();\n\n /**\n * Triggers an item resize based on the current selected device\n */\n function resizeItem() {\n if (self.devicesSelector && self.getState('enabled')) {\n /**\n * @event resizeitem\n * @param {deviceScreen} deviceData - The device data, containing width and height\n * @param {String} orientation - The device orientation\n * @param {String} type - The type of device\n */\n testRunner.trigger(\n 'resizeitem',\n self.devicesSelector.getDeviceData(),\n self.devicesSelector.getOrientation(),\n self.devicesSelector.getType()\n );\n }\n }\n\n /**\n * adjust device frame position and size when browser size change\n */\n $(window).on(namespaceHelper.namespaceAll('resize orientationchange', this.nsId), _.throttle(function () {\n if (self.devicesSelector && self.devicesSelector.isDeviceMode()) {\n resizeItem();\n }\n }, 50));\n\n return Promise.all([\n new Promise(function (resolve) {\n self.devicesSelector = devicesSelectorFactory(areaBroker.getHeaderArea())\n .on('ready', function () {\n if (!self.getState('enabled')) {\n this.disable();\n }\n\n this.on('typechange', function () {\n if (!this.isDeviceMode()) {\n resizeItem();\n }\n });\n\n this.on('devicechange orientationchange', function () {\n resizeItem();\n });\n\n resolve();\n });\n }),\n new Promise(function (resolve) {\n self.devicesPreviewer = devicesPreviewerFactory(areaBroker.getArea('contentWrapper'))\n .on('ready', function () {\n this.wrap(areaBroker.getContentArea());\n resolve();\n });\n })\n ]);\n },\n\n /**\n * Called during the runner's destroy phase\n * clears all controls tied to applications DOM\n * detaches the global events\n */\n destroy: function destroy() {\n if (this.nsId) {\n $(window).off('.' + this.nsId);\n }\n if (this.devicesSelector) {\n this.devicesSelector.destroy();\n }\n if (this.devicesPreviewer) {\n this.devicesPreviewer.destroy();\n }\n this.devicesSelector = null;\n this.devicesPreviewer = null;\n },\n\n /**\n * Enable default controls\n */\n enable: function enable() {\n if (this.devicesSelector) {\n this.devicesSelector.enable();\n }\n },\n\n /**\n * Disable default controls\n */\n disable: function disable() {\n if (this.devicesSelector) {\n this.devicesSelector.disable();\n }\n },\n\n /**\n * Show default controls\n */\n show: function show() {\n if (this.devicesSelector) {\n this.devicesSelector.show();\n }\n },\n\n /**\n * Hide default controls\n */\n hide: function hide() {\n if (this.devicesSelector) {\n this.devicesSelector.hide();\n }\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
            \\n
            \\n
            \\n
            \\n
            \\n
              \\n
              \\n
              \\n
              \\n\\n
              \\n\\n \\n\\n
              \\n
              \\n
              \\n
              \\n\\n \\n\\n
              \";\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner provider for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/provider/item/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/feedback',\n 'taoTests/runner/areaBroker',\n 'taoTests/runner/testStore',\n 'taoTests/runner/proxy',\n 'taoQtiTest/runner/ui/toolbox/toolbox',\n 'taoQtiItem/runner/qtiItemRunner',\n 'taoQtiTest/runner/config/assetManager',\n 'taoItems/assets/strategies',\n 'taoQtiItem/qtiCommonRenderer/helpers/container',\n 'tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item'\n], function (\n $,\n _,\n __,\n feedback,\n areaBrokerFactory,\n testStoreFactory,\n proxyFactory,\n toolboxFactory,\n qtiItemRunner,\n assetManagerFactory,\n assetStrategies,\n containerHelper,\n layoutTpl\n) {\n 'use strict';\n\n //the asset strategies\n const assetManager = assetManagerFactory();\n assetManager.prependStrategy(assetStrategies.taomedia);\n\n //store the current execution context of the common renderer (preview)\n let _$previousContext = null;\n function setContext($context){\n _$previousContext = containerHelper.getContext();\n containerHelper.setContext($context);\n }\n function restoreContext(){\n containerHelper.setContext(_$previousContext);\n _$previousContext = null;\n }\n /**\n * A Test runner provider to be registered against the runner\n */\n return {\n\n //provider name\n name: 'qtiItemPreviewer',\n\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker() {\n const $layout = $(layoutTpl());\n\n return areaBrokerFactory($layout, {\n contentWrapper: $('.content-wrapper', $layout),\n content: $('#qti-content', $layout),\n toolbox: $('.bottom-action-bar .tools-box', $layout),\n navigation: $('.bottom-action-bar .navi-box-list', $layout),\n control: $('.top-action-bar .control-box', $layout),\n actionsBar: $('.bottom-action-bar .control-box', $layout),\n panel: $('.test-sidebar-left', $layout),\n header: $('.top-action-bar .tools-box', $layout),\n context: $('.top-action-bar .navi-box-list', $layout)\n });\n },\n\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy() {\n const {proxyProvider, serviceCallId, bootstrap, timeout} = this.getConfig();\n return proxyFactory(proxyProvider || 'qtiItemPreviewerProxy', {serviceCallId, bootstrap, timeout});\n },\n\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore() {\n const config = this.getConfig();\n\n //the test run needs to be identified uniquely\n const identifier = config.serviceCallId || `test-${Date.now()}`;\n return testStoreFactory(identifier);\n },\n\n /**\n * Installation of the provider, called during test runner init phase.\n */\n install() {\n const {plugins} = this.getConfig().options;\n if (plugins) {\n _.forEach(this.getPlugins(), plugin => {\n if (_.isPlainObject(plugin) && _.isFunction(plugin.setConfig)) {\n const config = plugins[plugin.getName()];\n if (_.isPlainObject(config)) {\n plugin.setConfig(config);\n }\n }\n });\n }\n },\n\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init() {\n const dataHolder = this.getDataHolder();\n const areaBroker = this.getAreaBroker();\n\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n\n /*\n * Install behavior on events\n */\n this\n .on('submititem', () => {\n const itemState = this.itemRunner.getState();\n const itemResponses = this.itemRunner.getResponses();\n\n this.trigger('disabletools disablenav');\n this.trigger('submitresponse', itemResponses, itemState);\n\n return this.getProxy()\n .submitItem(dataHolder.get('itemIdentifier'), itemState, itemResponses)\n .then(response => {\n this.trigger('scoreitem', response);\n this.trigger('enabletools enablenav resumeitem');\n })\n .catch(err => {\n this.trigger('enabletools enablenav');\n\n //some server errors are valid, so we don't fail (prevent empty responses)\n if (err.code === 200) {\n this.trigger('alert.submitError',\n err.message || __('An error occurred during results submission. Please retry.'),\n () => this.trigger('resumeitem')\n );\n }\n });\n })\n .on('ready', () => {\n const itemIdentifier = dataHolder.get('itemIdentifier');\n const itemData = dataHolder.get('itemData');\n\n if (itemIdentifier) {\n if (itemData) {\n this.renderItem(itemIdentifier, itemData);\n } else {\n this.loadItem(itemIdentifier);\n }\n }\n })\n .on('loaditem', (itemRef, itemData) => {\n dataHolder.set('itemIdentifier', itemRef);\n dataHolder.set('itemData', itemData);\n })\n .on('renderitem', () => {\n this.trigger('enabletools enablenav');\n })\n .on('resumeitem', () => {\n this.trigger('enableitem enablenav');\n })\n .on('disableitem', () => {\n this.trigger('disabletools');\n })\n .on('enableitem', () => {\n this.trigger('enabletools');\n })\n .on('error', () => {\n this.trigger('disabletools enablenav');\n })\n .on('finish leave', () => {\n this.trigger('disablenav disabletools');\n this.flush();\n })\n .on('flush', () => {\n this.destroy();\n });\n\n return this.getProxy()\n .init()\n .then(data => {\n dataHolder.set('itemIdentifier', data.itemIdentifier);\n dataHolder.set('itemData', data.itemData);\n });\n },\n\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render() {\n const config = this.getConfig();\n const areaBroker = this.getAreaBroker();\n\n config.renderTo.append(areaBroker.getContainer());\n\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier);\n },\n\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem(itemIdentifier, itemData) {\n const areaBroker = this.getAreaBroker();\n const options = this.getConfig().options;\n\n const changeState = () => {\n this.setItemState(itemIdentifier, 'changed', true);\n };\n\n setContext(areaBroker.getContentArea());\n\n return new Promise((resolve, reject) => {\n assetManager.setData('baseUrl', itemData.baseUrl);\n\n itemData.content = itemData.content || {};\n\n this.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, Object.assign({\n assetManager: assetManager\n }, options))\n .on('error', err => {\n this.trigger('enablenav');\n reject(err);\n feedback().error(__('It seems that there is an error during item preview loading. Please, try again.'));\n })\n .on('init', function onItemRunnerInit() {\n const {state, portableElements} = itemData;\n this.render(areaBroker.getContentArea(), {state, portableElements});\n })\n .on('render', function onItemRunnerRender() {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n })\n .init();\n });\n },\n\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem() {\n this.trigger('beforeunloaditem disablenav disabletools');\n\n if (this.itemRunner) {\n return new Promise(resolve => {\n this.itemRunner\n .on('clear', resolve)\n .clear();\n });\n }\n return Promise.resolve();\n },\n\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n */\n destroy() {\n const areaBroker = this.getAreaBroker();\n\n // prevent the item to be displayed while test runner is destroying\n if (this.itemRunner) {\n this.itemRunner\n .on('clear', restoreContext)\n .clear();\n }\n this.itemRunner = null;\n\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\n }\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'core/promiseQueue',\n 'core/request',\n 'taoQtiTestPreviewer/previewer/config/item'\n], function($, _, __, promiseQueue, coreRequest, configFactory) {\n 'use strict';\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n\n name : 'qtiItemPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install : function install(){\n var self = this;\n\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n this.prepareParams = function prepareParams(actionParams){\n\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse'];\n\n if(_.isPlainObject(actionParams)){\n return _.mapValues(actionParams, function(value, key){\n if(_.contains(stringifyParams, key)){\n return JSON.stringify(value);\n }\n return value;\n });\n }\n\n return actionParams;\n };\n\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n })\n .then(function(response) {\n self.setOnline();\n\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n })\n .catch(function(error) {\n if (error.data && self.isConnectivityError(error.data)) {\n self.setOffline('request');\n }\n return Promise.reject(error);\n });\n };\n },\n\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {});\n\n // request for initialization\n return this.request(\n this.configStorage.getTestActionUrl('init'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'),\n body,\n void 0,\n true\n );\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI test previewer\n *\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/test',[\n 'core/promiseQueue',\n 'core/request',\n 'util/url',\n 'taoQtiTest/runner/helpers/map'\n], function (promiseQueue, request, urlUtil, mapHelper) {\n 'use strict';\n\n const serviceControllerInit = 'TestPreviewer';\n const serviceControllerGetItem = 'Previewer';\n\n const serviceExtension = 'taoQtiTestPreviewer';\n\n /**\n * The possible states of the test session,\n * coming from the test context\n * (this state comes from the backend)\n */\n const testSessionStates = Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n });\n /**\n * Finds ids of testPart, section and item in testMap for a given item position\n * @param {Object} testMap\n * @param {Number} position item position\n * @returns {Object} object containing testPartId, sectionId, itemIdentifier\n */\n function findIds(testMap, position) {\n const item = mapHelper.getJump(testMap, position);\n if (item) {\n return { testPartId: item.part, sectionId: item.section, itemIdentifier: item.identifier};\n }\n return {};\n }\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n name: 'qtiTestPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install() {\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n },\n /**\n * Initializes the proxy\n * @param {Object} configs - configuration from proxy\n * @param {String} configs.options.testUri - The identifier of the test\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init(configs) {\n return request( {\n url: urlUtil.route('init', serviceControllerInit, serviceExtension),\n data: { testUri: configs.options.testUri }\n })\n .then(response => {\n const data = response.data;\n //the received map is not complete and should be \"built\"\n this.builtTestMap = mapHelper.reindex(data.testMap);\n const firstItem = this.builtTestMap.jumps[0] || {};\n data.testContext = {\n itemIdentifier: firstItem.identifier,\n itemPosition: 0,\n testPartId: firstItem.part,\n sectionId: firstItem.section,\n canMoveBackward: true,\n state: testSessionStates.initial\n };\n return data;\n });\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy() {\n // no request, just a resources cleaning\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Gets an item definition by its URI, also gets its current state\n * @param {String} itemIdentifier - The URI of the item to get\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem(itemIdentifier) {\n const { uri } = mapHelper.getItem(this.builtTestMap, itemIdentifier) || {};\n if (!uri) {\n throw new Error(`There is no item ${itemIdentifier} in the testMap!`);\n }\n return request({\n url: urlUtil.route('getItem', serviceControllerGetItem, serviceExtension),\n data: { serviceCallId: 'previewer', itemUri: uri},\n noToken: true\n })\n .then(data => {\n data.itemData = data.content;\n return data;\n });\n },\n\n /**\n * Call action on the test\n * @param {string} itemIdentifier - the current item\n * @param {string} action - the action id\n * @param {Object} params\n * @returns {Promise} resolves with the response\n */\n callItemAction(itemIdentifier, action, params = {}) {\n const dataHolder = this.getDataHolder();\n const testContext = dataHolder.get('testContext');\n const testMap = dataHolder.get('testMap');\n const actions = {\n //simulate backend move action\n move: () => {\n if (params.direction === 'next') {\n if (params.scope === 'testPart') {\n const testPartPosition = testMap.parts[testContext.testPartId].position;\n const nextPartsSorted = Object.values(testMap.parts)\n .filter(p => p.position > testPartPosition)\n .sort((a, b) => a.position - b.position);\n if (nextPartsSorted.length === 0) {\n testContext.state = testSessionStates.closed;\n } else {\n testContext.itemPosition = Math.min(testMap.stats.total - 1, nextPartsSorted[0].position);\n }\n } else {\n if (testContext.itemPosition + 1 >= testMap.stats.total) {\n testContext.state = testSessionStates.closed;\n } else {\n testContext.itemPosition = Math.min(testMap.stats.total - 1, testContext.itemPosition + 1);\n }\n }\n }\n if (params.direction === 'previous') {\n testContext.itemPosition = Math.max(0, testContext.itemPosition - 1);\n }\n if (params.direction === 'jump' && params.ref >= 0) {\n testContext.itemPosition = params.ref;\n }\n\n const ids = findIds(testMap, testContext.itemPosition);\n testContext.testPartId = ids.testPartId;\n testContext.sectionId = ids.sectionId;\n testContext.itemIdentifier = ids.itemIdentifier;\n\n return { testContext, testMap };\n },\n\n flagItem: () => Promise.resolve()\n };\n actions.skip = actions.move;\n\n if (typeof actions[action] === 'function') {\n return actions[action]();\n }\n },\n\n /**\n * Calls an action related to the test\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction() {\n // the method must return a promise\n return Promise.resolve();\n },\n };\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/component/test/qtiTest',[\n 'context',\n 'jquery',\n 'taoTests/runner/runnerComponent',\n 'tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest',\n 'css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest',\n 'css!taoQtiTestCss/new-test-runner'\n], function (context, $, runnerComponentFactory, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n * @param {String} [config.testUri] - The test URI\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {previewer}\n */\n return function qtiTestPreviewerFactory(container, config = {}) {\n const testRunnerConfig = {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n providers: {\n runner: {\n id: 'qti',\n module: 'taoQtiTest/runner/provider/qti',\n bundle: 'taoQtiTest/loader/taoQtiTestRunner.min',\n category: 'runner'\n },\n proxy: {\n id: 'qtiTestPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/test',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n },\n communicator: {\n id: 'request',\n module: 'core/communicator/request',\n bundle: 'loader/vendor.min',\n category: 'communicator'\n },\n plugins: config.plugins || []\n },\n options: {\n view: config.view,\n readOnly: config.readOnly,\n fullPage: config.fullPage,\n plugins: config.plugins,\n hideActionBars: config.hideActionBars,\n testUri: config.testUri\n },\n proxyProvider: 'qtiTestPreviewerProxy'\n };\n\n //extra context config\n testRunnerConfig.loadFromBundle = !!context.bundle;\n\n return runnerComponentFactory(container, testRunnerConfig, runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => this.destroy());\n });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/test/qtiTest',['lodash', 'core/logger', 'taoQtiTestPreviewer/previewer/component/test/qtiTest', 'ui/feedback'], function (\n _,\n loggerFactory,\n qtiTestPreviewerFactory,\n feedback\n) {\n 'use strict';\n\n const logger = loggerFactory('taoQtiTestPreviewer/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [\n {\n module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'tools'\n },\n {\n module: 'taoQtiTest/runner/plugins/navigation/previous',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'navigation'\n },\n {\n module: 'taoQtiTest/runner/plugins/navigation/next',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'navigation'\n },\n {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/cloneLogoInTestPreview',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }\n ];\n\n /**\n * Wraps the test previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiTest',\n\n /**\n * Builds and shows the test previewer\n *\n * @param {String} testUri - The URI of the test to load\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(testUri, config = {}) {\n config.testUri = testUri;\n config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n return qtiTestPreviewerFactory(window.document.body, config).on('error', function (err) {\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n }\n logger.error(err);\n });\n }\n };\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('@-o-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-moz-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-webkit-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}.loading-bar{height:6px;position:absolute;width:100%;top:0px;display:none;z-index:10000;cursor:progress}.loading-bar.fixed{position:fixed;width:100%}.loading-bar.fixed:before{top:0 !important}.loading-bar.loading{display:block;overflow:hidden;top:58px}.loading-bar.loading:before{position:absolute;content:\\'\\';height:6px;width:20%;display:block;transform:translateZ(0);background:-webkit-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-moz-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-ms-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-o-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);-webkit-animation:loadingbar 5s linear infinite;-moz-animation:loadingbar 5s linear infinite;-ms-animation:loadingbar 5s linear infinite;-o-animation:loadingbar 5s linear infinite;animation:loadingbar 5s linear infinite}.loading-bar.loading.loadingbar-covered{top:0px;overflow-y:visible}.loading-bar.loading.loadingbar-covered:before{top:86px}.no-version-warning .loading-bar.loadingbar-covered:before{top:58px}.action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.action-bar li{float:left}.action-bar li .li-inner{padding-bottom:1px;text-decoration:none !important;outline:0;display:inline-block;color:inherit}.action-bar li .li-inner:hover{color:white}.action-bar li span.glyph{text-shadow:0 0 0 transparent;color:inherit}.action-bar li input{width:100%;font-size:12px;font-size:1.2rem;padding:2px 4px}.action-bar li.active .li-inner{color:white}.action-bar.horizontal-action-bar{padding:5px;height:35px}.action-bar.horizontal-action-bar .search-area{margin:2px 0 0 0;border:none;float:right;display:inline-block;position:relative;padding:0 30px 0 0}.action-bar.horizontal-action-bar .search-area input{padding-right:34px;min-width:250px !important}.action-bar.horizontal-action-bar .search-area button{position:absolute;right:32px;top:-2px;cursor:default;opacity:.5;background:transparent;width:25px;height:25px}.action-bar.horizontal-action-bar .search-area button:before{color:#666}.action-bar.horizontal-action-bar .search-area .icon-help{position:absolute;right:5px;top:-1px;text-shadow:0px 0px transparent;color:white;cursor:pointer;display:block;width:24px;height:24px;line-height:24px;text-align:center}.action-bar.horizontal-action-bar li{margin:0 1px;border:1px transparent solid;text-align:center;float:left}.action-bar.horizontal-action-bar li .glyph{width:14px}.action-bar.horizontal-action-bar li .svg-glyph{height:14px;width:14px;margin-right:9px}.action-bar.horizontal-action-bar li.btn-info{overflow:hidden;background:transparent}.action-bar.horizontal-action-bar li.btn-info:hover,.action-bar.horizontal-action-bar li.btn-info.active{border-color:rgba(255,255,255,0.3);opacity:1}.action-bar.horizontal-action-bar li.disabled{background:none !important;text-shadow:inherit !important;opacity:0.45 !important;color:inherit !important}.action-bar.horizontal-action-bar li.disabled a{cursor:not-allowed !important}.action-bar.vertical-action-bar li{max-height:60px}.action-bar.vertical-action-bar li .li-inner{height:60px;display:block;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:12px;font-size:1.2rem;line-height:12px}.action-bar.vertical-action-bar li .glyph{display:block;margin:12px auto 3px;width:20px;height:20px}.action-bar.tree-action-bar{background:#f3f1ef;position:relative;left:-1px;padding:0;margin:0 2.8571428571% 8px 2.8571428571%;width:94.6428571429%;font-size:13px;font-size:1.3rem}.action-bar.tree-action-bar li{background:rgba(255,255,255,0.5);border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;line-height:1.3;padding:0;text-align:center;float:left;width:65px;height:65px;margin:0 1px 1px 0}.action-bar.tree-action-bar li .glyph,.action-bar.tree-action-bar li .svg-glyph{display:block;color:#0e5d91;margin:12px auto 1px !important}.action-bar.tree-action-bar li .svg-glyph{width:20px;height:20px}.action-bar.tree-action-bar li .glyph{font-size:17px !important;font-size:1.7rem !important}.action-bar.tree-action-bar li .li-inner{display:block;height:65px;padding:2px;font-size:11px;font-size:1.1rem;color:#222}.action-bar.tree-action-bar li:hover{background:#ddd;color:#666}.action-bar .tree-filters{width:160px;position:relative}.action-bar .tree-filters input{padding-right:24px}.action-bar .tree-filters span{position:absolute;right:3px;color:#555;width:22px;top:2px;line-height:20px;display:inline-block;text-align:center;text-shadow:0 0 0 transparent;border-left:1px solid #ddd;cursor:pointer}.action-bar .tree-filters span.icon-close{display:none}.action-bar .tree-filters span:hover{color:#0e5d91}@media (max-width: 1150px){.action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}.action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}.action-bar.horizontal-action-bar .search-area input:focus{width:220px}}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input:focus{width:220px}.section-container{top:0 !important}.section-container .flex-container-full{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 100%;-webkit-flex:0 0 100%;flex:0 0 100%}.section-container .flex-container-half{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%}.section-container .flex-container-third{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 33.3333333333%;-webkit-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%}.section-container .flex-container-quarter{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 25%;-webkit-flex:0 0 25%;flex:0 0 25%}.section-container .flex-container-remaining{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 480px;-webkit-flex:1 1 480px;flex:1 1 480px}.section-container .flex-container-main-form{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 500px;-webkit-flex:0 0 500px;flex:0 0 500px;margin:0 20px 20px 0}.section-container .flex-container-navi{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px}.section-container .section-header{border:none}.section-container .content-panel{width:100%;height:100%;margin:0;padding:0;border:none !important;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.section-container .tab-container{border:none;display:none;list-style-type:none;padding:0;margin:0}.section-container .tab-container li{float:left;position:relative;top:0;padding:0;margin:0 1px 0px 0;border-top:1px solid #f3f1ef !important;border-bottom:1px solid #f3f1ef !important;background:#f3f1ef !important}.section-container .tab-container li a{top:0 !important;margin-bottom:0 !important;padding:6px 16px;text-decoration:none;min-height:32px;color:#222;float:left}.section-container .tab-container li.active,.section-container .tab-container li:hover{border-bottom-color:#4a86ad !important;border-top-color:#6e9ebd !important;background:#266d9c !important}.section-container .tab-container li.active a,.section-container .tab-container li:hover a{background:transparent !important;border-color:transparent !important;color:#fff !important;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.section-container .tab-container li.disabled:hover{background:#f3f1ef !important}.section-container .tab-container li.disabled:hover a{cursor:not-allowed !important;color:#222 !important}.section-container .navi-container{display:none;background:#f3f1ef;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px;border-right:1px #ddd solid}.section-container .navi-container .block-title{font-size:14px;font-size:1.4rem;padding:2px 8px;margin:0}.section-container .navi-container .tree-action-bar-box{margin:10px 0;opacity:0}.section-container .navi-container .tree-action-bar-box.active{opacity:1;-webkit-opacity:0.25s ease-in-out;-moz-opacity:0.25s ease-in-out;opacity:0.25s ease-in-out}.section-container .content-container{border:none;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.section-container .content-block{padding:20px;overflow-y:auto;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.section-container .content-block>.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\\\" \\\";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\\\"btn-\\\"],.section-container .content-block [class*=\\\" btn-\\\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 0px)}.item-previewer-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\\\"Andale Mono WT\\\",\\\"Andale Mono\\\",\\\"Lucida Console\\\",\\\"Lucida Sans Typewriter\\\",\\\"DejaVu Sans Mono\\\",\\\"Bitstream Vera Sans Mono\\\",\\\"Liberation Mono\\\",\\\"Nimbus Mono L\\\",Monaco,\\\"Courier New\\\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,0.3);border-radius:0px;display:inline-block;height:inherit}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\\\"btn-\\\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"],.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame{border-radius:5px;padding:30px}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\\\"standard\\\"] .desktop-selector,.devices-selector[data-type=\\\"standard\\\"] .mobile-selector,.devices-selector[data-type=\\\"standard\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"desktop\\\"] .mobile-selector,.devices-selector[data-type=\\\"desktop\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"mobile\\\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */.previewer-test-component{background:inherit}.previewer-test-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:64px;z-index:100000}.previewer-test-component.fullpage .item-previewer-scope{height:100vh}.previewer-test-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-test-component.hideactionbars .test-sidebar{height:100%}.previewer-test-component.hideactionbars .action-bar{display:none}.previewer-test-component #preview-logo{margin:6px 30px 6px 30px;display:block;max-width:200px;height:52px;background:transparent}.previewer-test-component footer{z-index:10000;position:relative;font-size:11px;padding:10px;border-top:1px #ddd solid}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/component/test/css/qtiTest.css.map */');\n","\ndefine(\"taoQtiTestPreviewer/loader/qtiPreviewer.bundle\", function(){});\n","define(\"taoQtiTestPreviewer/loader/qtiPreviewer.min\", [\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\",\"taoQtiTest/loader/taoQtiTestRunner.min\",\"taoQtiTest/loader/testPlugins.min\"], function(){});\n"]} \ No newline at end of file +{"version":3,"sources":["../previewer/runner!tpl","../previewer/runner.js","../previewer/provider/item/css/item!css","../previewer/component/qtiItem.js","../previewer/adapter/item/qtiItem.js","../previewer/config/item.js","../previewer/resources/devices.json!json","../previewer/helpers/devices.js","../previewer/plugins/content/cloneLogoInTestPreview.js","../previewer/plugins/content/enhancedReadOnlyMode.js","../previewer/plugins/controls/close.js","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer","../previewer/plugins/navigation/submit/submit.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","../previewer/plugins/tools/scale/component/css/devicesPreviewer!css","../previewer/plugins/tools/scale/component/devicesPreviewer.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","../previewer/plugins/tools/scale/component/tpl/selector!tpl","../previewer/plugins/tools/scale/component/css/devicesSelector!css","../previewer/plugins/tools/scale/component/devicesSelector.js","../previewer/plugins/tools/scale/scale.js","../previewer/provider/item/tpl/item!tpl","../previewer/provider/item/item.js","../previewer/proxy/item.js","../previewer/proxy/test.js","../previewer/component/test/tpl/qtiTest!tpl","../previewer/component/test/css/qtiTest!css","../previewer/component/test/qtiTest.js","../previewer/adapter/test/qtiTest.js","onLayerEnd0.js","module-create.js","/Users/sergei.mikhailov/Sources/tao-enterprise-bosa/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"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","sourcesContent":["\ndefine('tpl!taoQtiTestPreviewer/previewer/runner', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
              \";\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Component that embeds the QTI previewer for tests and items\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/runner',[\n 'taoTests/runner/runnerComponent',\n 'tpl!taoQtiTestPreviewer/previewer/runner'\n], function (runnerComponentFactory, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} config - The testRunner options\n * @param {String} [config.provider] - The provider to use\n * @param {Object[]} [config.providers] - A collection of providers to load.\n * @param {Boolean} [config.replace] - When the component is appended to its container, clears the place before\n * @param {Number|String} [config.width] - The width in pixels, or 'auto' to use the container's width\n * @param {Number|String} [config.height] - The height in pixels, or 'auto' to use the container's height\n * @param {Boolean} [config.options.fullPage] - Force the previewer to occupy the full window.\n * @param {Booleanh} [config.options.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function previewerFactory(container, config = {}, template = null) {\n\n return runnerComponentFactory(container, config, template || runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => this.destroy() );\n });\n };\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/provider/item/css/item',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/component/qtiItem',[\n 'context',\n 'taoQtiTestPreviewer/previewer/runner',\n 'css!taoQtiTestPreviewer/previewer/provider/item/css/item'\n], function (context, previewerFactory) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n * @param {String} [config.itemUri] - The URI of the item to load\n * @param {Object} [config.itemState] - The state of the item when relevant\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {Object[]} [config.pluginsOptions] - Options for the plugins\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function qtiItemPreviewerFactory(container, config = {}, template = null) {\n\n const testRunnerConfig = {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n providers: {\n runner: {\n id: 'qtiItemPreviewer',\n module: 'taoQtiTestPreviewer/previewer/provider/item/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'runner'\n },\n proxy: {\n id: 'qtiItemPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n },\n communicator: {\n id: 'request',\n module: 'core/communicator/request',\n bundle: 'loader/vendor.min',\n category: 'communicator'\n },\n plugins: config.plugins || []\n },\n options: {\n view: config.view,\n readOnly: config.readOnly,\n fullPage: config.fullPage,\n plugins: config.pluginsOptions,\n hideActionBars: config.hideActionBars,\n }\n };\n\n //extra context config\n testRunnerConfig.loadFromBundle = !!context.bundle;\n\n return previewerFactory(container, testRunnerConfig, template)\n .on('ready', runner => {\n if (config.itemState) {\n runner.on('renderitem', () => runner.itemRunner.setState(config.itemState));\n }\n if (config.itemUri) {\n return runner.loadItem(config.itemUri);\n }\n });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/item/qtiItem',[\n 'lodash',\n 'core/logger',\n 'taoQtiTestPreviewer/previewer/component/qtiItem',\n 'ui/feedback'\n], function (_, loggerFactory, qtiItemPreviewerFactory, feedback) {\n 'use strict';\n\n const logger = loggerFactory('taoQtiTest/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [{\n module: 'taoQtiTestPreviewer/previewer/plugins/controls/close',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'controls'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'navigation'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'tools'\n }, {\n module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'tools'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }];\n\n /**\n * Wraps the legacy item previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiItem',\n\n /**\n * Builds and shows the legacy item previewer\n *\n * @param {String} uri - The URI of the item to load\n * @param {Object} state - The state of the item\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(uri, state, config = {}) {\n config.itemUri = uri;\n config.itemState = state;\n config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n return qtiItemPreviewerFactory(window.document.body, config)\n .on('error', function (err) {\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n } else {\n logger.error(err);\n }\n });\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Config manager for the proxy of the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/config/item',[\n 'lodash',\n 'util/url',\n 'util/config'\n], function(_, urlUtil, configHelper) {\n 'use strict';\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n bootstrap : {\n serviceController : 'Previewer',\n serviceExtension : 'taoQtiTestPreviewer'\n }\n };\n\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n var _entries = {\n serviceCallId : true,\n bootstrap : false,\n timeout : false\n };\n\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.serviceCallId - An identifier for the service call\n * @param {String} [config.bootstrap.serviceController] - The name of the service controller\n * @param {String} [config.bootstrap.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n return function itemPreviewerConfigFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef;\n\n // convert some values from seconds to milliseconds\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n }\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the list of parameters\n * @param {String|Object} [itemIdentifier]\n * @returns {Object}\n */\n getParameters: function getParameters(itemIdentifier) {\n var type = typeof itemIdentifier;\n var parameters = {\n serviceCallId : this.getServiceCallId()\n };\n\n if (type === 'string') {\n // simple item identifier\n parameters.itemUri = itemIdentifier;\n // structured item identifier (a list of parameters)\n } else if (type === 'object' && _.isPlainObject(itemIdentifier)) {\n _.merge(parameters, itemIdentifier);\n } else if (type !== 'undefined') {\n throw new TypeError('Wrong parameter type provided for itemIdentifier: ' + type + '. Only string or plain object are allowed!');\n }\n\n return parameters;\n },\n\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId : function getServiceCallId() {\n return storage.serviceCallId;\n },\n\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController : function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension : function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n\n /**\n * Gets an URL of a service action\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl : function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters());\n },\n\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String|Object} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl : function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters(itemIdentifier));\n },\n\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout : function getTimeout() {\n return storage.timeout;\n }\n };\n };\n});\n\n","\ndefine(\"json!taoQtiTestPreviewer/previewer/resources/devices.json\", function(){ return {\n \"tablets\": {\n \"193986c3715c81838870f908fa98d69a\": {\n \"label\": \"Amazon Kindle Fire HDX 7\\u2033\",\n \"width\": 960,\n \"height\": 600\n },\n \"4e8eafab11aad1486992d7ee2c8c16ca\": {\n \"label\": \"Apple iPad\",\n \"width\": 1024,\n \"height\": 768\n },\n \"5aac2932d9ad00d6d8a1604b8f9e4e8d\": {\n \"label\": \"Google Nexus 10, Motorola Xoom, Xyboard\",\n \"width\": 1280,\n \"height\": 800\n },\n \"9805d9753ad08c7630a9ee5418aa6c6c\": {\n \"label\": \"Google Nexus 7\",\n \"width\": 966,\n \"height\": 604\n },\n \"d4a431cedf4705d6bf2cba6d5788378b\": {\n \"label\": \"Samsung Galaxy Tab 7.7, 8.9, 10.1\",\n \"width\": 1280,\n \"height\": 800\n }\n },\n \"phones\": {\n \"1b89338531ef0155c8d6abc2ac02c81a\": {\n \"label\": \"Apple iPhone 3GS\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1,\n \"dpWidth\": 320,\n \"dpHeight\": 480\n },\n \"3f89da99d84214cde7df87ebe0699a6f\": {\n \"label\": \"Apple iPhone 4\",\n \"width\": 640,\n \"height\": 960,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 1920\n },\n \"0d36971a5b98b367f54ced708c9af849\": {\n \"label\": \"Apple iPhone 5\",\n \"width\": 640,\n \"height\": 1136,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 2272\n },\n \"026beffcc051af995660ebdede986ace\": {\n \"label\": \"BlackBerry Z10\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"fd2dd53e667d6d49e4fa73356fa941dd\": {\n \"label\": \"BlackBerry Z30\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"707584c1ae17d9b5b2cbe8603c91c147\": {\n \"label\": \"Google Nexus 4\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"91823264de952e7f2347e07db5c4058b\": {\n \"label\": \"Google Nexus 5\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"cd69817a6e147e8a4677389e56fcf568\": {\n \"label\": \"Google Nexus S\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"75994faa6a38e31e99b53fcd75534a33\": {\n \"label\": \"HTC Evo, Touch HD, Desire HD, Desire\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0cab4dfccdfc880687cb608cfe4159db\": {\n \"label\": \"HTC One X, EVO LTE\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"c4ff41fcba24d74fc21dc3490ca1edc9\": {\n \"label\": \"HTC Sensation, Evo 3D\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 360,\n \"dpHeight\": 1440\n },\n \"fa969a5e0dd2de53700eeee4ba4ba142\": {\n \"label\": \"LG Optimus 2X, Optimus 3D, Optimus Black\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"33c4f9364e295ec03531f3a3425819cf\": {\n \"label\": \"LG Optimus G\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"bc47f5275f0efd56fee52d43a8082981\": {\n \"label\": \"LG Optimus LTE, Optimus 4X HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1.7,\n \"dpWidth\": 424,\n \"dpHeight\": 2176\n },\n \"0732887e6e324fd10777b735520a34cf\": {\n \"label\": \"LG Optimus One\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 213,\n \"dpHeight\": 720\n },\n \"2e38a78364f09d0da0e9e1a3a68e7fb0\": {\n \"label\": \"Motorola Defy, Droid, Droid X, Milestone\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1281\n },\n \"bd4b78dddc7c9625a4141a1b1ddabb87\": {\n \"label\": \"Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1,\n \"dpWidth\": 540,\n \"dpHeight\": 960\n },\n \"3bf1edf21cfa81006183d2b02974c84e\": {\n \"label\": \"Motorola Droid Razr HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1,\n \"dpWidth\": 720,\n \"dpHeight\": 1280\n },\n \"ab5a352e0e016b97dac986f06c394f55\": {\n \"label\": \"Nokia C5, C6, C7, N97, N8, X7\",\n \"width\": 360,\n \"height\": 640,\n \"scaleFactor\": 1,\n \"dpWidth\": 360,\n \"dpHeight\": 640\n },\n \"4826fb7d7257aeaac992ce699df41b3c\": {\n \"label\": \"Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0a691ab20add7c432200f8fa6527b488\": {\n \"label\": \"Samsung Galaxy Note\",\n \"width\": 800,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 400,\n \"dpHeight\": 2560\n },\n \"9c23ee31be29960fbac9e9bbfc2fc7b0\": {\n \"label\": \"Samsung Galaxy Note 3\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 2,\n \"dpWidth\": 540,\n \"dpHeight\": 3840\n },\n \"92177c0508c1d73905a58e2338f2a81f\": {\n \"label\": \"Samsung Galaxy Note II\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"5222b8866dc4cc606725e16ffcc0a783\": {\n \"label\": \"Samsung Galaxy S III, Galaxy Nexus\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"37c1541e2bd55cfd0f4073b0ccdf68b3\": {\n \"label\": \"Samsung Galaxy S, S II, W\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"2f7f64b7dda0144907ff300e83eed465\": {\n \"label\": \"Samsung Galaxy S4\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"9c24f9057744dad56043702a9703127f\": {\n \"label\": \"Sony Xperia S, Ion\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"0a8b2732a016a9395c3af5f12dd9c0da\": {\n \"label\": \"Sony Xperia Sola, U\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1,\n \"dpWidth\": 480,\n \"dpHeight\": 854\n },\n \"5a153d7f53d82dcb0801f041574a6a43\": {\n \"label\": \"Sony Xperia Z, Z1\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n }\n },\n \"screens\": {\n \"9e523ae15b61dc766f5c818726881ecf\": {\n \"label\": \"1920 \\u00d7 1080\",\n \"width\": 1920,\n \"height\": 1080,\n \"dpWidth\": 1920,\n \"dpHeight\": 1080,\n \"scaleFactor\": 1\n },\n \"07769cd8d0a7d09818b2f0b018042fb7\": {\n \"label\": \"1366 \\u00d7 768\",\n \"width\": 1366,\n \"height\": 768,\n \"dpWidth\": 1366,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"72d5478a24194f98b9378e8e0fd65737\": {\n \"label\": \"1280 \\u00d7 1024\",\n \"width\": 1280,\n \"height\": 1024,\n \"dpWidth\": 1280,\n \"dpHeight\": 1024,\n \"scaleFactor\": 1\n },\n \"b7a6dd5900cc72e61f0d3479c7e314ec\": {\n \"label\": \"1280 \\u00d7 800\",\n \"width\": 1280,\n \"height\": 800,\n \"dpWidth\": 1280,\n \"dpHeight\": 800,\n \"scaleFactor\": 1\n },\n \"43193b0ff671a37d8232ab664190a125\": {\n \"label\": \"1024 \\u00d7 768\",\n \"width\": 1024,\n \"height\": 768,\n \"dpWidth\": 1024,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"c29e48814af5443ff5688d9e967ce917\": {\n \"label\": \"800 \\u00d7 600\",\n \"width\": 800,\n \"height\": 600,\n \"dpWidth\": 800,\n \"dpHeight\": 600,\n \"scaleFactor\": 1\n }\n }\n};});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA;\n */\n/**\n * Helper to work with screen values and mobile devices list\n * for \"select device\" select-box on any test-item preview page\n * for example using scale plugin app/taoQtiTestPreviewer/views/js/previewer/plugins/tools/scale/scale.js\n *\n * @author Dieter Raber \n * @author Pavel Hendelman \n */\ndefine('taoQtiTestPreviewer/previewer/helpers/devices',[\n 'lodash',\n 'json!taoQtiTestPreviewer/previewer/resources/devices.json'\n], function (\n _,\n deviceList\n) {\n 'use strict';\n\n /**\n * @typedef {Object} deviceScreen\n * @property {String} value - The selector's value to use\n * @property {String} label - The label to display in the selector\n * @property {Number} width - The width of the screen\n * @property {Number} height - The height of the screen\n */\n\n /**\n * Translation map to convert a device type to a collection's name in the provided list.\n * @type {Object}\n */\n var deviceTypeMap = {\n 'mobile': 'tablets',\n 'desktop': 'screens'\n };\n\n /**\n * Helpers to get the list of devices\n */\n var devicesHelper = {\n /**\n * Gets the list of devices to test item through. This list is meant to be used by a selector.\n * @param {String} type - The type of device from the list ['mobile', 'desktop']\n * @returns {deviceScreen[]} - The list of devices to test item through, filtered by the provided type\n */\n getDevicesByType : function getDevicesByType(type) {\n /*\n * @todo\n * The device list is currently based on the devices found on the Chrome emulator.\n * This is not ideal and should be changed in the future.\n * I have http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density in mind but we\n * will need to figure what criteria to apply when generating the list.\n */\n var key = deviceTypeMap[type];\n\n return _.map(deviceList[key] || [], function mapDeviceData(device, identifier) {\n return {\n value: identifier,\n label: device.label,\n width: device.width,\n height: device.height\n };\n });\n },\n\n /**\n * Gets the list of mobile devices\n * @returns {deviceScreen[]} - The list of mobile devices to test item through\n */\n getMobileDevices: function getMobileDevices() {\n return devicesHelper.getDevicesByType('mobile');\n },\n\n /**\n * Gets the list of desktop devices\n * @returns {deviceScreen[]} - The list of desktop devices to test item through\n */\n getDesktopDevices: function getDesktopDevices() {\n return devicesHelper.getDevicesByType('desktop');\n }\n };\n\n return devicesHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Content Plugin : cloneLogoInTestPreview\n *\n * This plugin can be used as a hook to clone logo from the header in the back office to the header in the test preview\n *\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/cloneLogoInTestPreview',['jquery', 'taoTests/runner/plugin'], function ($, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n name: 'cloneLogoInTestPreview',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n testRunner.after('ready', () => {\n // clone logo to preview - because logo source + class + styles can be customized by client extension\n $('#tao-main-logo').clone().appendTo('.previewer-test-component header');\n });\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Content Plugin : EnhancedReadOnlyMode\n *\n * This plugin can be used as a hook to do modification in the item preview for read only mode\n *\n * @author Ansul Sharma \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'taoTests/runner/plugin'\n], function ($, _, __, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'EnhancedReadOnlyMode',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n /**\n * Enables the plugin only in readOnly mode\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return config.options.readOnly;\n };\n\n testRunner\n .after('renderitem', () => {\n if (isPluginAllowed()) {\n const $contentArea = testRunner.getAreaBroker().getContentArea();\n const $extendedTextinteractionTextAreas = $contentArea.find('.qti-extendedTextInteraction textarea.text-container');\n const $ckeEditorsContent = $contentArea.find('.qti-extendedTextInteraction div.cke_contents');\n\n /**\n * Updates the height of textarea element of all extended text interactions based on the height of the content\n */\n if($extendedTextinteractionTextAreas.length) {\n $extendedTextinteractionTextAreas.each(function() {\n this.style.height = `${this.scrollHeight + 20}px`;\n });\n }\n\n /**\n * Updates the height of all the ckeEditor container of wysiwyg extended text interaction based on the height of the iFrame\n */\n if($ckeEditorsContent.length) {\n $ckeEditorsContent.each(function() {\n const $ckeEditorContent = $(this);\n const $ckeEditorIFrame = $ckeEditorContent.find('iframe.cke_wysiwyg_frame');\n\n /**\n * Only update the height when the iFrame has finished loading the styles because font-size may change the height\n */\n $ckeEditorIFrame.on('load', () => {\n setTimeout(() => {\n const ckeEditorBody = $ckeEditorIFrame[0].contentWindow.document.querySelector('body');\n $ckeEditorContent[0].style.height = `${ckeEditorBody.scrollHeight + 20}px`;\n }, 0);\n });\n });\n }\n }\n });\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Control Plugin : Close\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/controls/close',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/hider',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/templates/button'\n], function ($, _, __, hider, pluginFactory, buttonTpl) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'close',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.hideActionBars;\n }\n\n this.$element = $(buttonTpl({\n control: 'close',\n title: __('Close the previewer'),\n icon: 'close',\n text: __('Close'),\n className: 'context-action'\n }));\n\n this.$element.on('click', function (e) {\n e.preventDefault();\n if (self.getState('enabled') !== false) {\n self.disable();\n testRunner.trigger('finish');\n }\n });\n\n this.disable();\n\n testRunner\n .on('enablenav', function () {\n if (isPluginAllowed()) {\n self.enable();\n }\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n\n //attach the element to the navigation area\n var $container = this.getAreaBroker().getArea('context');\n $container.append(this.$element);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
              \\n
                \\n
                \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
              • \";\n  if (helper = helpers.time) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.time); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\n  if (helper = helpers.type) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.type); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\n  if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  if(stack1 || stack1 === 0) { buffer += stack1; }\n  buffer += \"
              • \";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Navigation Plugin : Submit\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'moment',\n 'ui/hider',\n 'ui/autoscroll',\n 'util/strPad',\n 'taoTests/runner/plugin',\n 'taoQtiItem/qtiCommonRenderer/helpers/PciResponse',\n 'tpl!taoQtiTest/runner/plugins/templates/button',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer'\n], function (\n $,\n _,\n __,\n moment,\n hider,\n autoscroll,\n strPad,\n pluginFactory,\n pciResponse,\n buttonTpl,\n consoleTpl,\n consoleLineTpl,\n consoleCloserTpl\n) {\n 'use strict';\n\n /**\n * Some default config for the plugin\n * @type {Object}\n */\n const defaults = {\n submitTitle: __('Submit and show the result'),\n submitText: __('Submit'),\n submitIcon: 'forward'\n };\n\n return pluginFactory({\n\n name: 'submit',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const pluginConfig = _.defaults(this.getConfig(), defaults);\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return !config.options.readOnly;\n };\n\n // display the console and its related controls, then auto scrolls to the last element\n const showConsole = () => {\n hider.show(this.controls.$console);\n hider.show(this.controls.$consoleBody);\n hider.show(this.controls.$consoleCloser);\n autoscroll(this.controls.$consoleBody.children().last(), this.controls.$consoleBody);\n };\n\n // hide the console and its related controls\n const hideConsole = () => {\n hider.hide(this.controls.$console);\n hider.hide(this.controls.$consoleCloser);\n };\n\n // add a line to the console\n const addConsoleLine = (type, message) => {\n const data = {\n time: strPad(moment().format('HH:mm:ss'), 12, ' '),\n type: strPad(type || '', 18, ' '),\n message: strPad(message || '', 18, ' ')\n };\n this.controls.$consoleBody.append($(consoleLineTpl(data)));\n };\n\n // display responses in the console\n const showResponses = (type, responses) => {\n _.forEach(responses, (response, identifier) => {\n addConsoleLine(type, strPad(`${identifier}: `, 15, ' ') + _.escape(pciResponse.prettyPrint(response)));\n });\n };\n\n this.controls = {\n $button: $(buttonTpl({\n control: 'submit',\n title: pluginConfig.submitTitle,\n icon: pluginConfig.submitIcon,\n text: pluginConfig.submitText\n })),\n $console: $(consoleTpl()),\n $consoleCloser: $(consoleCloserTpl())\n };\n this.controls.$consoleBody = this.controls.$console.find('.preview-console-body');\n\n this.controls.$button.on('click', e => {\n e.preventDefault();\n if (this.getState('enabled') !== false) {\n this.disable();\n testRunner.trigger('submititem');\n }\n });\n\n this.controls.$consoleCloser.on('click', e => {\n e.preventDefault();\n hideConsole();\n });\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', () => {\n if (isPluginAllowed()) {\n this.show();\n } else {\n this.hide();\n }\n })\n .on('submitresponse', responses => {\n showResponses(__('Submitted data'), responses);\n showConsole();\n })\n .on('scoreitem', responses => {\n if (responses.itemSession) {\n showResponses(__('Output data'), responses.itemSession);\n showConsole();\n }\n })\n .on('enablenav', () => {\n this.enable();\n })\n .on('disablenav', () => {\n this.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render() {\n //attach the element to the navigation area\n const $container = this.getAreaBroker().getContainer();\n const $navigation = this.getAreaBroker().getNavigationArea();\n $navigation.append(this.controls.$button);\n $navigation.append(this.controls.$consoleCloser);\n $container.append(this.controls.$console);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n _.forEach(this.controls, $el => $el.remove());\n this.controls = null;\n },\n\n /**\n * Enable the button\n */\n enable() {\n this.controls.$button\n .prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable() {\n this.controls.$button\n .prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show() {\n hider.show(this.controls.$button);\n },\n\n /**\n * Hide the button\n */\n hide() {\n _.forEach(this.controls, hider.hide);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
                \\n
                \\n
                \\n
                \\n
                \\n
                \\n
                \\n
                \";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/transformer',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css'\n], function ($, _, __, componentFactory, transformer, devicesPreviewerTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} size\n * @property {Number} width\n * @property {Number} height\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n deviceType: 'standard',\n deviceWith: 0,\n deviceHeight: 0,\n deviceOrientation: null\n };\n\n /**\n * Builds a devices previewer component. It will works in two modes:\n * - the standard mode will do nothing special, this is simply a sleeping mode\n * - the device mode will redesign the view to show a content using a device's layout and aspect ratio\n *\n * @example\n * var devicesPreviewer = devicesPreviewerFactory('.previewer .previewer-content);\n * ...\n * // react to changes\n * devicesPreviewer\n * .on('devicewidthchange', function(width) {\n * // the width has changed\n * })\n * .on('deviceheightchange', function(height) {\n * // the height has changed\n * })\n * .on('deviceorientationchange', function(orientation) {\n * // the orientation has changed\n * })\n * .on('devicetypechange', function(type) {\n * // the type has changed\n * })\n * .on('devicepreview', function() {\n * // the device preview mode has been applied\n * });\n * ...\n * // apply changes\n * devicesPreviewer\n * .setDeviceType(type)\n * .setDeviceOrientation(orientation)\n * .setDeviceWidth(width)\n * .setDeviceHeight(height)\n * .previewDevice();\n * ...\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.deviceType='standard'] - The preview mode to apply\n * @param {Number} [config.deviceWidth=null] - The width of the device to preview\n * @param {Number} [config.deviceHeight=null] - The height of the device to preview\n * @param {String} [config.deviceOrientation='landscape'] - The device orientation\n * @returns {devicesPreviewer}\n * @fires ready - When the component is ready to work\n */\n function devicesPreviewerFactory(container, config) {\n var controls = null;\n\n /**\n * Remove the applied scale\n */\n var resetScale = function resetScale() {\n if (controls) {\n controls.$previewContent.removeAttr('style');\n controls.$previewContainer.removeAttr('style');\n }\n };\n\n // component specific API\n var api = {\n /**\n * Gets the device width.\n * @returns {Number}\n */\n getDeviceWidth: function getDeviceWidth() {\n return this.getConfig().deviceWidth;\n },\n\n /**\n * Sets the device width.\n * @param {String|Number} width\n * @returns {devicesPreviewer}\n * @fires devicewidthchange\n */\n setDeviceWidth: function setDeviceWidth(width) {\n var componentConfig = this.getConfig();\n componentConfig.deviceWidth = parseInt(width, 10) || 0;\n\n /**\n * @event devicewidthchange\n * @param {Number} deviceWidth\n */\n this.trigger('devicewidthchange', componentConfig.deviceWidth);\n\n return this;\n },\n\n /**\n * Gets the device height.\n * @returns {Number}\n */\n getDeviceHeight: function getDeviceHeight() {\n return this.getConfig().deviceHeight;\n },\n\n /**\n * Sets the device height.\n * @param {String|Number} height\n * @returns {devicesPreviewer}\n * @fires deviceheightchange\n */\n setDeviceHeight: function setDeviceHeight(height) {\n var componentConfig = this.getConfig();\n componentConfig.deviceHeight = parseInt(height, 10) || 0;\n\n /**\n * @event deviceheightchange\n * @param {Number} deviceHeight\n */\n this.trigger('deviceheightchange', componentConfig.deviceHeight);\n\n return this;\n },\n\n /**\n * Gets the device orientation.\n * @returns {String}\n */\n getDeviceOrientation: function getDeviceOrientation() {\n return this.getConfig().deviceOrientation;\n },\n\n /**\n * Sets the device orientation.\n * @param {String} orientation\n * @returns {devicesPreviewer}\n * @fires deviceorientationchange\n */\n setDeviceOrientation: function setDeviceOrientation(orientation) {\n var componentConfig = this.getConfig();\n componentConfig.deviceOrientation = orientation;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-orientation', componentConfig.deviceOrientation);\n }\n\n /**\n * @event deviceorientationchange\n * @param {String} deviceOrientation\n */\n this.trigger('deviceorientationchange', componentConfig.deviceOrientation);\n\n return this;\n },\n\n /**\n * Tells if the previewer has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return this.getDeviceType() !== 'standard';\n },\n\n /**\n * Gets the device type.\n * @returns {String}\n */\n getDeviceType: function getDeviceType() {\n return this.getConfig().deviceType;\n },\n\n /**\n * Sets the type of device\n * @param {String} type\n * @returns {devicesPreviewer}\n * @fires devicetypechange\n */\n setDeviceType: function setDeviceType(type) {\n var componentConfig = this.getConfig();\n componentConfig.deviceType = type;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-type', componentConfig.deviceType);\n }\n\n /**\n * @event devicetypechange\n * @param {String} deviceType\n */\n this.trigger('devicetypechange', componentConfig.deviceType);\n\n return this;\n },\n\n /**\n * Previews the content using the current device settings\n * @returns {devicesPreviewer}\n * @fires devicepreview after the device has been set on preview\n */\n previewDevice: function previewDevice() {\n var width, height;\n\n if (this.is('rendered')) {\n if (this.is('disabled') || this.getDeviceType() === 'standard') {\n // standard mode and disabled state both should be reflected by a \"no scale\" view\n this.clearScale();\n } else {\n // in device preview mode, we need to apply the device's size with respect to the orientation\n if (this.getDeviceOrientation() === 'portrait') {\n width = this.getDeviceHeight();\n height = this.getDeviceWidth();\n } else {\n width = this.getDeviceWidth();\n height = this.getDeviceHeight();\n }\n this.applyScale(width, height);\n }\n\n /**\n * @event devicepreview\n */\n this.trigger('devicepreview');\n }\n\n return this;\n },\n\n /**\n * Removes the scale settings applied on the devices previewer\n * @returns {devicesPreviewer}\n * @fires scaleclear after the scale settings have been cleared\n */\n clearScale: function clearScale() {\n if (this.is('rendered')) {\n resetScale();\n\n /**\n * @event scaleclear\n */\n this.trigger('scaleclear');\n }\n\n return this;\n },\n\n /**\n * Computes and applies the scale settings on the devices previewer\n * @param {Number} width\n * @param {Number} height\n * @returns {devicesPreviewer}\n * * @fires scalechange after the scale settings have been applied\n */\n applyScale: function applyScale(width, height) {\n var frameSize, frameMargins, scaleFactor;\n\n if (this.is('rendered')) {\n resetScale();\n\n frameSize = this.getFrameSize();\n frameMargins = this.getFrameMargins();\n scaleFactor = this.getScaleFactor(width, height);\n\n controls.$previewContent\n .width(width)\n .height(height);\n\n controls.$previewContainer\n .css('left', (frameSize.width - (width + frameMargins.width) * scaleFactor) / 2)\n .width(width + frameMargins.width)\n .height(height + frameMargins.height);\n\n transformer.setTransformOrigin(controls.$previewContainer, 0, 0);\n transformer.scale(controls.$previewContainer, scaleFactor);\n\n /**\n * @event scalechange\n */\n this.trigger('scalechange');\n }\n\n return this;\n },\n\n /**\n * Computes and gets the margins of the previewer frame\n * @returns {size}\n */\n getFrameMargins: function getFrameMargins() {\n var margins = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n margins.width = controls.$previewContainer.outerWidth() - controls.$previewContent.width();\n margins.height = controls.$previewContainer.outerHeight() - controls.$previewContent.height();\n }\n return margins;\n },\n\n /**\n * Computes and gets the available size in the previewer frame\n * @returns {size}\n */\n getFrameSize: function getFrameSize() {\n var size = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n size.width = this.getContainer().innerWidth();\n size.height = this.getContainer().innerHeight();\n }\n return size;\n },\n\n /**\n * Computes and gets the scale factor of the previewer frame\n * @param {Number} width\n * @param {Number} height\n * @returns {Number}\n */\n getScaleFactor: function getScaleFactor(width, height) {\n var margins, frameSize;\n var scaleFactor = {\n x: 1,\n y: 1\n };\n if (this.is('rendered') && this.isDeviceMode()) {\n frameSize = this.getFrameSize();\n margins = this.getFrameMargins();\n width += margins.width;\n height += margins.height;\n\n if (width > frameSize.width) {\n scaleFactor.x = frameSize.width / width;\n }\n\n if (height > frameSize.height) {\n scaleFactor.y = frameSize.height / height;\n }\n }\n return Math.min(scaleFactor.x, scaleFactor.y);\n },\n\n /**\n * Wraps the previewed content into the previewer frame\n * @param {HTMLElement|jQuery} element\n * @returns {devicesPreviewer}\n * @fires wrap after the element has been wrapped\n */\n wrap: function wrap(element) {\n if (this.is('rendered')) {\n // restore current wrapped element to its previous place\n this.unwrap();\n\n // move the element to wrap in the preview container\n controls.$wrappedElement = $(element);\n controls.$wrappedElementContainer = controls.$wrappedElement.parent();\n controls.$previewContent.append(controls.$wrappedElement);\n\n /**\n * @event wrap\n * @param {jQuery} $wrappedElement - The element that has been wrapped\n */\n this.trigger('wrap', controls.$wrappedElement);\n }\n\n return this;\n },\n\n /**\n * Unwraps the previewed content from the previewer frame\n * @returns {devicesPreviewer}\n * @fires unwrap after the element has been unwrapped\n */\n unwrap: function unwrap() {\n var $wasWrappedElement;\n if (this.is('rendered') && controls.$wrappedElement) {\n $wasWrappedElement = controls.$wrappedElement;\n\n // restore current wrapped element to its previous place\n controls.$wrappedElementContainer.append(controls.$wrappedElement);\n controls.$wrappedElement = null;\n controls.$wrappedElementContainer = null;\n\n /**\n * @event unwrap\n * @param {jQuery} $wrappedElement - The element that was wrapped\n */\n this.trigger('unwrap', $wasWrappedElement);\n }\n\n return this;\n }\n };\n\n // build and setup the component\n var devicesPreviewer = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesPreviewerTpl)\n\n // auto render on init\n .on('init', function () {\n var componentConfig = this.getConfig();\n\n // init the internal state\n this.setDeviceType(componentConfig.deviceType);\n this.setDeviceWidth(componentConfig.deviceWidth);\n this.setDeviceHeight(componentConfig.deviceHeight);\n this.setDeviceOrientation(componentConfig.deviceOrientation);\n\n // auto render on init\n _.defer(function () {\n devicesPreviewer.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var $element = this.getElement();\n controls = {\n // internal elements\n $previewContainer: $element.find('.preview-container'),\n $previewFrame: $element.find('.preview-frame'),\n $previewContent: $element.find('.preview-content'),\n\n // placeholder for the wrapped element\n $wrappedElement: null,\n $wrappedElementContainer: null\n };\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable enable', function () {\n var self = this;\n if (this.is('rendered')) {\n // need to defer the call as the enable/disable events are emitted before the state is updated\n _.defer(function () {\n self.previewDevice();\n });\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n this.unwrap();\n controls = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesPreviewer.init(config);\n });\n\n return devicesPreviewer;\n }\n\n return devicesPreviewerFactory;\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
                \\n
                \\n
                \\n
                \\n
                \\n
                \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \"selected=\\\"selected\\\"\";\n }\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/selecter',\n 'taoQtiTestPreviewer/previewer/helpers/devices',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css'\n], function ($, _, __, componentFactory, lookupSelecter, devicesHelper, devicesSelectorTpl, selectorTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} selectorEntry\n * @property {String} value - The value that identifies the entry\n * @property {String} label - The text displayed to describe the entry\n */\n\n /**\n * @typedef {selectorEntry} mainSelectorEntry\n * @property {Boolean} devicesList - tells if a list of devices is expected\n * @property {Boolean} orientation - tells if a list of orientations is expected\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n type: 'standard',\n device: null,\n orientation: 'landscape'\n };\n\n /**\n * List of available types of devices\n * @type {mainSelectorEntry[]}\n */\n var deviceTypesList = [{\n value: 'standard',\n label: __('Actual size'),\n devicesList: false,\n orientation: false\n }, {\n value: 'desktop',\n label: __('Desktop preview'),\n devicesList: true,\n orientation: false\n }, {\n value: 'mobile',\n label: __('Mobile preview'),\n devicesList: true,\n orientation: true\n }];\n\n /**\n * List of available orientations\n * @type {selectorEntry[]}\n */\n var deviceOrientationsList = [{\n value: 'landscape',\n label: __('Landscape')\n }, {\n value: 'portrait',\n label: __('Portrait')\n }];\n\n /**\n * Map selector's names to setter callbacks.\n * This will be used to call the expected setter when selecting a value.\n * @see devicesSelector.select()\n * @type {Object}\n */\n var callbackMap = {\n type: 'setType',\n device: 'setDevice',\n mobile: 'setDevice',\n desktop: 'setDevice',\n orientation: 'setOrientation'\n };\n\n /**\n * Gets the data for a selected entry\n * @param {String} selected\n * @param {selectorEntry[]|deviceScreen[]} list\n * @returns {selectorEntry|deviceScreen|null}\n */\n function getSelectorData(selected, list) {\n if (selected && _.size(list)) {\n return _.find(list, {value: selected}) || null;\n }\n return null;\n }\n\n /**\n * Ensures an identifier is valid with respect to the provided list, or defaulted to null.\n * @param {String} identifier\n * @param {selectorEntry[]} list\n * @returns {String|null}\n */\n function getValidIdentifier(identifier, list) {\n if (list && list.length) {\n if (_.find(list, {value: identifier})) {\n return identifier;\n } else {\n return _.first(list).value;\n }\n }\n return null;\n }\n\n /**\n * Update a Select2 control\n * @param {jQuery} $selector\n * @param {String} value\n * @returns {jQuery}\n */\n function updateSelect2($selector, value) {\n var current = $selector.val();\n // avoid to stress the setters if the value is already set\n if (current !== value) {\n $selector.val(value);\n $selector.trigger('change');\n }\n return $selector;\n }\n\n /**\n * Uninstalls a Select2 control\n * @param {jQuery} $selector\n * @returns {jQuery}\n */\n function removeSelect2($selector) {\n if ($selector.hasClass(\"select2-offscreen\")) {\n $selector.select2('destroy');\n }\n return $selector;\n }\n\n /**\n * Builds a devices selector component. It will provides 3 selectors in cascade:\n * - the first allows to select the type of device\n * - the second allows to select the device itself, the list being filtered by the value of the first selector\n * - the third allows to select the display orientation, if applicable\n *\n * @example\n * var devicesSelector = devicesSelectorFactory('.previewer .previewer-top-bar);\n * ...\n * // react to type change\n * devicesSelector.on('typechange', function(type) {\n * if (!this.isDeviceMode()) {\n * // reset the type to standard, we can re-apply the default size\n * }\n * });\n *\n * // react to device change\n * devicesSelector.on('devicechange', function(device, data) {\n * // apply the size provided in data\n * });\n *\n * // react to orientation change\n * devicesSelector.on('orientationchange', function(orientation) {\n * // apply the orientation\n * });\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.type='standard'] - The default selected device type\n * @param {String} [config.device=null] - The default selected device\n * @param {String} [config.orientation='landscape'] - The default selected orientation\n * @returns {devicesSelector}\n * @fires ready - When the component is ready to work\n */\n function devicesSelectorFactory(container, config) {\n // internal state\n var selected = {\n type: null,\n device: null,\n orientation: null,\n desktop: null,\n mobile: null\n };\n var devicesList = [];\n var typeData = null;\n var controls = null;\n\n /**\n * Changes a DOM property on each selector\n * @param {String} property\n * @param {String|Boolean|Number} value\n */\n var setControlsProp = function setControlsProp(property, value) {\n _.forEach(controls, function($selector) {\n $selector.prop(property, value);\n });\n };\n\n // component specific API\n var api = {\n /**\n * Tells if the selector has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return selected.type !== 'standard';\n },\n\n /**\n * Reflects the mode to the DOM\n * @returns {devicesSelector}\n */\n updateMode: function updateMode() {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n if (this.is('rendered')) {\n this.getElement().attr('data-type', selected.type);\n }\n return this;\n },\n\n /**\n * Gets the selected device type.\n * @returns {String} The type of device, from the list `['standard', 'mobile', 'desktop']`\n */\n getType: function getType() {\n return selected.type;\n },\n\n /**\n * Gets the selected device orientation.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String}\n */\n getOrientation: function getOrientation() {\n if (typeData && typeData.orientation) {\n return selected.orientation;\n }\n return null;\n },\n\n /**\n * Gets the identifier of the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String|null}\n */\n getDevice: function getDevice() {\n if (typeData && typeData.devicesList) {\n return selected.device;\n }\n return null;\n },\n\n /**\n * Gets the data for the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {deviceScreen|null}\n */\n getDeviceData: function getDeviceData() {\n return getSelectorData(this.getDevice(), devicesList);\n },\n\n /**\n * Selects a type of device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires typechange event after the type has been changed\n * @fires devicechange event after the device has been updated if a list of devices is expected\n */\n setType: function setType(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceTypesList);\n if (identifier !== selected.type) {\n selected.type = identifier;\n selected.device = null;\n\n // when the type changes, the list of devices must be updated\n devicesList = devicesHelper.getDevicesByType(selected.type);\n typeData = getSelectorData(selected.type, deviceTypesList);\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$typeSelector, selected.type);\n this.updateMode();\n }\n\n /**\n * @event typechange\n * @param {String} selectedType\n */\n this.trigger('typechange', selected.type);\n\n // the current device must be adapted if a list of devices is expected\n if (typeData.devicesList) {\n this.setDevice(selected[selected.type]);\n }\n }\n return this;\n },\n\n /**\n * Sets the selected device orientation\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires orientationchange event after the type has been changed\n */\n setOrientation: function setOrientation(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceOrientationsList);\n if (identifier !== selected.orientation) {\n selected.orientation = identifier;\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$orientationSelector, selected.orientation);\n }\n\n /**\n * @event orientationchange\n * @param {String} selectedOrientation\n */\n this.trigger('orientationchange', selected.orientation);\n }\n return this;\n },\n\n /**\n * Selects a device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires devicechange event after the device has been changed\n */\n setDevice: function setDevice(identifier) {\n var $selector;\n\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, devicesList);\n if (identifier !== selected.device) {\n selected.device = identifier;\n selected[selected.type] = identifier;\n\n // update the rendered content, depending on the device's category\n if (this.is('rendered') && this.isDeviceMode()) {\n $selector = controls['$' + selected.type + 'Selector'];\n if ($selector) {\n updateSelect2($selector, selected.device);\n }\n }\n\n /**\n * @event devicechange\n * @param {String} selectedDevice\n * @param {deviceScreen} deviceData\n */\n this.trigger('devicechange', selected.device, this.getDeviceData());\n }\n return this;\n },\n\n /**\n * Selects a value in the proper selector\n * @param {String} name - The name of the selector\n * @param {String} value - The value to select\n * @returns {devicesSelector}\n */\n select: function select(name, value) {\n var setterName = callbackMap[name];\n if (setterName && _.isFunction(this[setterName])) {\n this[setterName](value);\n }\n return this;\n },\n\n /**\n * Reset to default values, from the config.\n * @returns {devicesSelector}\n */\n reset: function reset() {\n var componentConfig = this.getConfig();\n this.setType(componentConfig.type);\n this.setDevice(componentConfig.device);\n this.setOrientation(componentConfig.orientation);\n return this;\n }\n };\n\n // build and setup the component\n var devicesSelector = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesSelectorTpl)\n\n // auto render on init\n .on('init', function () {\n // ensure the initial state is aligned with the config\n this.reset();\n\n // auto render on init\n _.defer(function () {\n devicesSelector.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var self = this;\n\n /**\n * Renders a selector from a list of entries. Takes care of the currently selected value.\n * @param {String} name - The name of the selector\n * @param {selectorEntry[]} list - The list of entries\n * @param {String} selectedValue - The currently selected value\n * @param {String} [category=name] - The category of the selector (type, device, orientation).\n * Defaulted to the name if not provided.\n * @returns {jQuery}\n */\n function renderSelector(name, list, selectedValue, category) {\n var $selector = $(selectorTpl({\n name: name,\n category: category || name,\n items: _.map(list, function(item) {\n return {\n value: item.value,\n label: item.label,\n selected: selectedValue === item.value\n };\n })\n }));\n self.getElement().find('.' + name + '-selector').html($selector);\n return $selector;\n }\n\n // create each selector, and keep access to them\n controls = {\n $typeSelector: renderSelector('type', deviceTypesList, selected.type),\n $desktopSelector: renderSelector('desktop', devicesHelper.getDesktopDevices(), selected.device, 'device'),\n $mobileSelector: renderSelector('mobile', devicesHelper.getMobileDevices(), selected.device, 'device'),\n $orientationSelector: renderSelector('orientation', deviceOrientationsList, selected.orientation)\n };\n lookupSelecter(this.getElement());\n\n // react to any change in selectors and then forward the event to the related entry\n this.getElement().on('change', '.selector', function onSelectorChange(e) {\n var $selector = $(e.target).closest('select');\n self.select($selector.attr('name'), $selector.val());\n });\n\n // initialize the display mode\n this.updateMode();\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", true);\n }\n })\n .on('enable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", false);\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n _.forEach(controls, removeSelect2);\n controls = null;\n selected = null;\n typeData = null;\n devicesList = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesSelector.init(config);\n });\n\n return devicesSelector;\n }\n\n return devicesSelectorFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Responsive Scale plugin : Scale\n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',[\n 'jquery',\n 'lodash',\n 'lib/uuid',\n 'util/namespace',\n 'taoTests/runner/plugin',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector'\n], function (\n $,\n _,\n uuid,\n namespaceHelper,\n pluginFactory,\n devicesPreviewerFactory,\n devicesSelectorFactory\n) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'scale',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.readOnly;\n }\n\n // generate unique id for global events\n this.nsId = this.getName() + uuid(6);\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', function () {\n if (isPluginAllowed()) {\n self.show();\n } else {\n self.hide();\n }\n })\n .on('resizeitem', function (size, orientation, type) {\n if (self.devicesPreviewer) {\n self.devicesPreviewer\n .setDeviceType(type)\n .setDeviceOrientation(orientation)\n .setDeviceWidth(size && size.width)\n .setDeviceHeight(size && size.height)\n .previewDevice();\n }\n })\n .on('enablenav', function () {\n self.enable();\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n * Renders plugins controls on proper place\n */\n render: function render() {\n var self = this;\n var testRunner = this.getTestRunner();\n var areaBroker = this.getAreaBroker();\n\n /**\n * Triggers an item resize based on the current selected device\n */\n function resizeItem() {\n if (self.devicesSelector && self.getState('enabled')) {\n /**\n * @event resizeitem\n * @param {deviceScreen} deviceData - The device data, containing width and height\n * @param {String} orientation - The device orientation\n * @param {String} type - The type of device\n */\n testRunner.trigger(\n 'resizeitem',\n self.devicesSelector.getDeviceData(),\n self.devicesSelector.getOrientation(),\n self.devicesSelector.getType()\n );\n }\n }\n\n /**\n * adjust device frame position and size when browser size change\n */\n $(window).on(namespaceHelper.namespaceAll('resize orientationchange', this.nsId), _.throttle(function () {\n if (self.devicesSelector && self.devicesSelector.isDeviceMode()) {\n resizeItem();\n }\n }, 50));\n\n return Promise.all([\n new Promise(function (resolve) {\n self.devicesSelector = devicesSelectorFactory(areaBroker.getHeaderArea())\n .on('ready', function () {\n if (!self.getState('enabled')) {\n this.disable();\n }\n\n this.on('typechange', function () {\n if (!this.isDeviceMode()) {\n resizeItem();\n }\n });\n\n this.on('devicechange orientationchange', function () {\n resizeItem();\n });\n\n resolve();\n });\n }),\n new Promise(function (resolve) {\n self.devicesPreviewer = devicesPreviewerFactory(areaBroker.getArea('contentWrapper'))\n .on('ready', function () {\n this.wrap(areaBroker.getContentArea());\n resolve();\n });\n })\n ]);\n },\n\n /**\n * Called during the runner's destroy phase\n * clears all controls tied to applications DOM\n * detaches the global events\n */\n destroy: function destroy() {\n if (this.nsId) {\n $(window).off('.' + this.nsId);\n }\n if (this.devicesSelector) {\n this.devicesSelector.destroy();\n }\n if (this.devicesPreviewer) {\n this.devicesPreviewer.destroy();\n }\n this.devicesSelector = null;\n this.devicesPreviewer = null;\n },\n\n /**\n * Enable default controls\n */\n enable: function enable() {\n if (this.devicesSelector) {\n this.devicesSelector.enable();\n }\n },\n\n /**\n * Disable default controls\n */\n disable: function disable() {\n if (this.devicesSelector) {\n this.devicesSelector.disable();\n }\n },\n\n /**\n * Show default controls\n */\n show: function show() {\n if (this.devicesSelector) {\n this.devicesSelector.show();\n }\n },\n\n /**\n * Hide default controls\n */\n hide: function hide() {\n if (this.devicesSelector) {\n this.devicesSelector.hide();\n }\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
                \\n
                \\n
                \\n
                \\n
                \\n
                  \\n
                  \\n
                  \\n
                  \\n\\n
                  \\n\\n \\n\\n
                  \\n
                  \\n
                  \\n
                  \\n\\n \\n\\n
                  \";\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner provider for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/provider/item/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/feedback',\n 'taoTests/runner/areaBroker',\n 'taoTests/runner/testStore',\n 'taoTests/runner/proxy',\n 'taoQtiTest/runner/ui/toolbox/toolbox',\n 'taoQtiItem/runner/qtiItemRunner',\n 'taoQtiTest/runner/config/assetManager',\n 'taoItems/assets/strategies',\n 'taoQtiItem/qtiCommonRenderer/helpers/container',\n 'tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item'\n], function (\n $,\n _,\n __,\n feedback,\n areaBrokerFactory,\n testStoreFactory,\n proxyFactory,\n toolboxFactory,\n qtiItemRunner,\n assetManagerFactory,\n assetStrategies,\n containerHelper,\n layoutTpl\n) {\n 'use strict';\n\n //the asset strategies\n const assetManager = assetManagerFactory();\n assetManager.prependStrategy(assetStrategies.taomedia);\n\n //store the current execution context of the common renderer (preview)\n let _$previousContext = null;\n function setContext($context){\n _$previousContext = containerHelper.getContext();\n containerHelper.setContext($context);\n }\n function restoreContext(){\n containerHelper.setContext(_$previousContext);\n _$previousContext = null;\n }\n /**\n * A Test runner provider to be registered against the runner\n */\n return {\n\n //provider name\n name: 'qtiItemPreviewer',\n\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker() {\n const $layout = $(layoutTpl());\n\n return areaBrokerFactory($layout, {\n contentWrapper: $('.content-wrapper', $layout),\n content: $('#qti-content', $layout),\n toolbox: $('.bottom-action-bar .tools-box', $layout),\n navigation: $('.bottom-action-bar .navi-box-list', $layout),\n control: $('.top-action-bar .control-box', $layout),\n actionsBar: $('.bottom-action-bar .control-box', $layout),\n panel: $('.test-sidebar-left', $layout),\n header: $('.top-action-bar .tools-box', $layout),\n context: $('.top-action-bar .navi-box-list', $layout)\n });\n },\n\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy() {\n const {proxyProvider, serviceCallId, bootstrap, timeout} = this.getConfig();\n return proxyFactory(proxyProvider || 'qtiItemPreviewerProxy', {serviceCallId, bootstrap, timeout});\n },\n\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore() {\n const config = this.getConfig();\n\n //the test run needs to be identified uniquely\n const identifier = config.serviceCallId || `test-${Date.now()}`;\n return testStoreFactory(identifier);\n },\n\n /**\n * Installation of the provider, called during test runner init phase.\n */\n install() {\n const {plugins} = this.getConfig().options;\n if (plugins) {\n _.forEach(this.getPlugins(), plugin => {\n if (_.isPlainObject(plugin) && _.isFunction(plugin.setConfig)) {\n const config = plugins[plugin.getName()];\n if (_.isPlainObject(config)) {\n plugin.setConfig(config);\n }\n }\n });\n }\n },\n\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init() {\n const dataHolder = this.getDataHolder();\n const areaBroker = this.getAreaBroker();\n\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n\n /*\n * Install behavior on events\n */\n this\n .on('submititem', () => {\n const itemState = this.itemRunner.getState();\n const itemResponses = this.itemRunner.getResponses();\n\n this.trigger('disabletools disablenav');\n this.trigger('submitresponse', itemResponses, itemState);\n\n return this.getProxy()\n .submitItem(dataHolder.get('itemIdentifier'), itemState, itemResponses)\n .then(response => {\n this.trigger('scoreitem', response);\n this.trigger('enabletools enablenav resumeitem');\n })\n .catch(err => {\n this.trigger('enabletools enablenav');\n\n //some server errors are valid, so we don't fail (prevent empty responses)\n if (err.code === 200) {\n this.trigger('alert.submitError',\n err.message || __('An error occurred during results submission. Please retry.'),\n () => this.trigger('resumeitem')\n );\n }\n });\n })\n .on('ready', () => {\n const itemIdentifier = dataHolder.get('itemIdentifier');\n const itemData = dataHolder.get('itemData');\n\n if (itemIdentifier) {\n if (itemData) {\n this.renderItem(itemIdentifier, itemData);\n } else {\n this.loadItem(itemIdentifier);\n }\n }\n })\n .on('loaditem', (itemRef, itemData) => {\n dataHolder.set('itemIdentifier', itemRef);\n dataHolder.set('itemData', itemData);\n })\n .on('renderitem', () => {\n this.trigger('enabletools enablenav');\n })\n .on('resumeitem', () => {\n this.trigger('enableitem enablenav');\n })\n .on('disableitem', () => {\n this.trigger('disabletools');\n })\n .on('enableitem', () => {\n this.trigger('enabletools');\n })\n .on('error', () => {\n this.trigger('disabletools enablenav');\n })\n .on('finish leave', () => {\n this.trigger('disablenav disabletools');\n this.flush();\n })\n .on('flush', () => {\n this.destroy();\n });\n\n return this.getProxy()\n .init()\n .then(data => {\n dataHolder.set('itemIdentifier', data.itemIdentifier);\n dataHolder.set('itemData', data.itemData);\n });\n },\n\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render() {\n const config = this.getConfig();\n const areaBroker = this.getAreaBroker();\n\n config.renderTo.append(areaBroker.getContainer());\n\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier);\n },\n\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem(itemIdentifier, itemData) {\n const areaBroker = this.getAreaBroker();\n const options = this.getConfig().options;\n\n const changeState = () => {\n this.setItemState(itemIdentifier, 'changed', true);\n };\n\n setContext(areaBroker.getContentArea());\n\n return new Promise((resolve, reject) => {\n assetManager.setData('baseUrl', itemData.baseUrl);\n\n itemData.content = itemData.content || {};\n\n this.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, Object.assign({\n assetManager: assetManager\n }, options))\n .on('error', err => {\n this.trigger('enablenav');\n reject(err);\n feedback().error(__('It seems that there is an error during item preview loading. Please, try again.'));\n })\n .on('init', function onItemRunnerInit() {\n const {state, portableElements} = itemData;\n this.render(areaBroker.getContentArea(), {state, portableElements});\n })\n .on('render', function onItemRunnerRender() {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n })\n .init();\n });\n },\n\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem() {\n this.trigger('beforeunloaditem disablenav disabletools');\n\n if (this.itemRunner) {\n return new Promise(resolve => {\n this.itemRunner\n .on('clear', resolve)\n .clear();\n });\n }\n return Promise.resolve();\n },\n\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n */\n destroy() {\n const areaBroker = this.getAreaBroker();\n\n // prevent the item to be displayed while test runner is destroying\n if (this.itemRunner) {\n this.itemRunner\n .on('clear', restoreContext)\n .clear();\n }\n this.itemRunner = null;\n\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\n }\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'core/promiseQueue',\n 'core/request',\n 'taoQtiTestPreviewer/previewer/config/item'\n], function($, _, __, promiseQueue, coreRequest, configFactory) {\n 'use strict';\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n\n name : 'qtiItemPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install : function install(){\n var self = this;\n\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n this.prepareParams = function prepareParams(actionParams){\n\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse'];\n\n if(_.isPlainObject(actionParams)){\n return _.mapValues(actionParams, function(value, key){\n if(_.contains(stringifyParams, key)){\n return JSON.stringify(value);\n }\n return value;\n });\n }\n\n return actionParams;\n };\n\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n })\n .then(function(response) {\n self.setOnline();\n\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n })\n .catch(function(error) {\n if (error.data && self.isConnectivityError(error.data)) {\n self.setOffline('request');\n }\n return Promise.reject(error);\n });\n };\n },\n\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {});\n\n // request for initialization\n return this.request(\n this.configStorage.getTestActionUrl('init'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'),\n body,\n void 0,\n true\n );\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI test previewer\n *\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/test',[\n 'core/promiseQueue',\n 'core/request',\n 'util/url',\n 'taoQtiTest/runner/helpers/map'\n], function (promiseQueue, request, urlUtil, mapHelper) {\n 'use strict';\n\n const serviceControllerInit = 'TestPreviewer';\n const serviceControllerGetItem = 'Previewer';\n\n const serviceExtension = 'taoQtiTestPreviewer';\n\n /**\n * The possible states of the test session,\n * coming from the test context\n * (this state comes from the backend)\n */\n const testSessionStates = Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n });\n /**\n * Finds ids of testPart, section and item in testMap for a given item position\n * @param {Object} testMap\n * @param {Number} position item position\n * @returns {Object} object containing testPartId, sectionId, itemIdentifier\n */\n function findIds(testMap, position) {\n const item = mapHelper.getJump(testMap, position);\n if (item) {\n return { testPartId: item.part, sectionId: item.section, itemIdentifier: item.identifier};\n }\n return {};\n }\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n name: 'qtiTestPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install() {\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n },\n /**\n * Initializes the proxy\n * @param {Object} configs - configuration from proxy\n * @param {String} configs.options.testUri - The identifier of the test\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init(configs) {\n return request( {\n url: urlUtil.route('init', serviceControllerInit, serviceExtension),\n data: { testUri: configs.options.testUri }\n })\n .then(response => {\n const data = response.data;\n //the received map is not complete and should be \"built\"\n this.builtTestMap = mapHelper.reindex(data.testMap);\n const firstItem = this.builtTestMap.jumps[0] || {};\n data.testContext = {\n itemIdentifier: firstItem.identifier,\n itemPosition: 0,\n testPartId: firstItem.part,\n sectionId: firstItem.section,\n canMoveBackward: true,\n state: testSessionStates.initial\n };\n return data;\n });\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy() {\n // no request, just a resources cleaning\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Gets an item definition by its URI, also gets its current state\n * @param {String} itemIdentifier - The URI of the item to get\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem(itemIdentifier) {\n const { uri } = mapHelper.getItem(this.builtTestMap, itemIdentifier) || {};\n if (!uri) {\n throw new Error(`There is no item ${itemIdentifier} in the testMap!`);\n }\n return request({\n url: urlUtil.route('getItem', serviceControllerGetItem, serviceExtension),\n data: { serviceCallId: 'previewer', itemUri: uri},\n noToken: true\n })\n .then(data => {\n data.itemData = data.content;\n data.itemIdentifier = data.content.data.identifier;\n return data;\n });\n },\n\n /**\n * Call action on the test\n * @param {string} itemIdentifier - the current item\n * @param {string} action - the action id\n * @param {Object} params\n * @returns {Promise} resolves with the response\n */\n callItemAction(itemIdentifier, action, params = {}) {\n const dataHolder = this.getDataHolder();\n const testContext = dataHolder.get('testContext');\n const testMap = dataHolder.get('testMap');\n const actions = {\n //simulate backend move action\n move: () => {\n if (params.direction === 'next') {\n if (params.scope === 'testPart') {\n const testPartPosition = testMap.parts[testContext.testPartId].position;\n const nextPartsSorted = Object.values(testMap.parts)\n .filter(p => p.position > testPartPosition)\n .sort((a, b) => a.position - b.position);\n if (nextPartsSorted.length === 0) {\n testContext.state = testSessionStates.closed;\n } else {\n testContext.itemPosition = Math.min(testMap.stats.total - 1, nextPartsSorted[0].position);\n }\n } else {\n if (testContext.itemPosition + 1 >= testMap.stats.total) {\n testContext.state = testSessionStates.closed;\n } else {\n testContext.itemPosition = Math.min(testMap.stats.total - 1, testContext.itemPosition + 1);\n }\n }\n }\n if (params.direction === 'previous') {\n testContext.itemPosition = Math.max(0, testContext.itemPosition - 1);\n }\n if (params.direction === 'jump' && params.ref >= 0) {\n testContext.itemPosition = params.ref;\n }\n\n const ids = findIds(testMap, testContext.itemPosition);\n testContext.testPartId = ids.testPartId;\n testContext.sectionId = ids.sectionId;\n testContext.itemIdentifier = ids.itemIdentifier;\n\n return { testContext, testMap };\n },\n\n flagItem: () => Promise.resolve()\n };\n actions.skip = actions.move;\n\n if (typeof actions[action] === 'function') {\n return actions[action]();\n }\n },\n\n /**\n * Calls an action related to the test\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction() {\n // the method must return a promise\n return Promise.resolve();\n },\n };\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/component/test/qtiTest',[\n 'context',\n 'lodash',\n 'layout/loading-bar',\n 'taoTests/runner/runnerComponent',\n 'tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest',\n 'css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest',\n 'css!taoQtiTestCss/new-test-runner'\n], function (context, __, loadingBar, runnerComponentFactory, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n *\n * @returns {runner}\n */\n return function qtiTestPreviewerFactory(container, config = {}) {\n const testRunnerConfig = __.defaults(\n {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n proxyProvider: 'qtiTestPreviewerProxy',\n loadFromBundle: !!context.bundle,\n },\n config\n );\n\n testRunnerConfig.providers.proxy = [{\n id: 'qtiTestPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/test',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n }];\n\n return runnerComponentFactory(container, testRunnerConfig, runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => {\n // stop loading bar - started in plugin loading\n loadingBar.stop();\n this.destroy();\n });\n });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/test/qtiTest',[\n 'lodash',\n 'core/promiseQueue',\n 'core/request',\n 'util/url',\n 'core/logger',\n 'taoQtiTestPreviewer/previewer/component/test/qtiTest',\n 'ui/feedback'\n], function (\n _,\n promiseQueue,\n request,\n urlUtil,\n loggerFactory,\n qtiTestPreviewerFactory,\n feedback\n) {\n 'use strict';\n\n const taoExtension = 'taoQtiTestPreviewer';\n\n const testPreviewerController = 'TestPreviewer';\n\n const logger = loggerFactory('taoQtiTestPreviewer/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [\n {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/cloneLogoInTestPreview',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }\n ];\n\n const transformConfiguration = config => {\n const plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n const {view, readOnly, fullPage, hideActionBars} = config;\n const options = _.omit({view, readOnly, fullPage, hideActionBars}, _.isUndefined);\n\n return request({\n url: urlUtil.route('configuration', testPreviewerController, taoExtension),\n }).then(response => {\n const configuration = response.data;\n\n configuration.providers.plugins = [...configuration.providers.plugins, ...plugins];\n _.assign(configuration.options, options);\n\n return configuration;\n });\n };\n\n /**\n * Wraps the test previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiTest',\n\n install() {\n this.queue = promiseQueue();\n },\n\n /**\n * Builds and shows the test previewer\n *\n * @param {String} testUri - The URI of the test to load\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(testUri, config = {}) {\n return transformConfiguration(config).then(config => {\n config.options.testUri = testUri;\n return qtiTestPreviewerFactory(window.document.body, config).on('error', function (err) {\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n }\n logger.error(err);\n });\n });\n },\n\n destroy() {\n this.queue = null;\n\n return Promise.resolve();\n },\n };\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('@-o-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-moz-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-webkit-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}.loading-bar{height:6px;position:absolute;width:100%;top:0px;display:none;z-index:10000;cursor:progress}.loading-bar.fixed{position:fixed;width:100%}.loading-bar.fixed:before{top:0 !important}.loading-bar.loading{display:block;overflow:hidden;top:58px}.loading-bar.loading:before{position:absolute;content:\\'\\';height:6px;width:20%;display:block;transform:translateZ(0);background:-webkit-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-moz-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-ms-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-o-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);-webkit-animation:loadingbar 5s linear infinite;-moz-animation:loadingbar 5s linear infinite;-ms-animation:loadingbar 5s linear infinite;-o-animation:loadingbar 5s linear infinite;animation:loadingbar 5s linear infinite}.loading-bar.loading.loadingbar-covered{top:0px;overflow-y:visible}.loading-bar.loading.loadingbar-covered:before{top:86px}.no-version-warning .loading-bar.loadingbar-covered:before{top:58px}.action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.action-bar li{float:left}.action-bar li .li-inner{padding-bottom:1px;text-decoration:none !important;outline:0;display:inline-block;color:inherit}.action-bar li .li-inner:hover{color:white}.action-bar li span.glyph{text-shadow:0 0 0 transparent;color:inherit}.action-bar li input{width:100%;font-size:12px;font-size:1.2rem;padding:2px 4px}.action-bar li.active .li-inner{color:white}.action-bar.horizontal-action-bar{padding:5px;height:35px}.action-bar.horizontal-action-bar .search-area{margin:2px 0 0 0;border:none;float:right;display:inline-block;position:relative;padding:0 30px 0 0}.action-bar.horizontal-action-bar .search-area input{padding-right:34px;min-width:250px !important}.action-bar.horizontal-action-bar .search-area button{position:absolute;right:32px;top:-2px;cursor:default;opacity:.5;background:transparent;width:25px;height:25px}.action-bar.horizontal-action-bar .search-area button:before{color:#666}.action-bar.horizontal-action-bar .search-area .icon-help{position:absolute;right:5px;top:-1px;text-shadow:0px 0px transparent;color:white;cursor:pointer;display:block;width:24px;height:24px;line-height:24px;text-align:center}.action-bar.horizontal-action-bar li{margin:0 1px;border:1px transparent solid;text-align:center;float:left}.action-bar.horizontal-action-bar li .glyph{width:14px}.action-bar.horizontal-action-bar li .svg-glyph{height:14px;width:14px;margin-right:9px}.action-bar.horizontal-action-bar li.btn-info{overflow:hidden;background:transparent}.action-bar.horizontal-action-bar li.btn-info:hover,.action-bar.horizontal-action-bar li.btn-info.active{border-color:rgba(255,255,255,0.3);opacity:1}.action-bar.horizontal-action-bar li.disabled{background:none !important;text-shadow:inherit !important;opacity:0.45 !important;color:inherit !important}.action-bar.horizontal-action-bar li.disabled a{cursor:not-allowed !important}.action-bar.vertical-action-bar li{max-height:60px}.action-bar.vertical-action-bar li .li-inner{height:60px;display:block;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:12px;font-size:1.2rem;line-height:12px}.action-bar.vertical-action-bar li .glyph{display:block;margin:12px auto 3px;width:20px;height:20px}.action-bar.tree-action-bar{background:#f3f1ef;position:relative;left:-1px;padding:0;margin:0 2.8571428571% 8px 2.8571428571%;width:94.6428571429%;font-size:13px;font-size:1.3rem}.action-bar.tree-action-bar li{background:rgba(255,255,255,0.5);border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;line-height:1.3;padding:0;text-align:center;float:left;width:65px;height:65px;margin:0 1px 1px 0}.action-bar.tree-action-bar li .glyph,.action-bar.tree-action-bar li .svg-glyph{display:block;color:#0e5d91;margin:12px auto 1px !important}.action-bar.tree-action-bar li .svg-glyph{width:20px;height:20px}.action-bar.tree-action-bar li .glyph{font-size:17px !important;font-size:1.7rem !important}.action-bar.tree-action-bar li .li-inner{display:block;height:65px;padding:2px;font-size:11px;font-size:1.1rem;color:#222}.action-bar.tree-action-bar li:hover{background:#ddd;color:#666}.action-bar .tree-filters{width:160px;position:relative}.action-bar .tree-filters input{padding-right:24px}.action-bar .tree-filters span{position:absolute;right:3px;color:#555;width:22px;top:2px;line-height:20px;display:inline-block;text-align:center;text-shadow:0 0 0 transparent;border-left:1px solid #ddd;cursor:pointer}.action-bar .tree-filters span.icon-close{display:none}.action-bar .tree-filters span:hover{color:#0e5d91}@media (max-width: 1150px){.action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}.action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}.action-bar.horizontal-action-bar .search-area input:focus{width:220px}}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input:focus{width:220px}.section-container{top:0 !important}.section-container .flex-container-full{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 100%;-webkit-flex:0 0 100%;flex:0 0 100%}.section-container .flex-container-half{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%}.section-container .flex-container-third{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 33.3333333333%;-webkit-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%}.section-container .flex-container-quarter{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 25%;-webkit-flex:0 0 25%;flex:0 0 25%}.section-container .flex-container-remaining{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 480px;-webkit-flex:1 1 480px;flex:1 1 480px}.section-container .flex-container-main-form{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 500px;-webkit-flex:0 0 500px;flex:0 0 500px;margin:0 20px 20px 0}.section-container .flex-container-navi{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px}.section-container .section-header{border:none}.section-container .content-panel{width:100%;height:100%;margin:0;padding:0;border:none !important;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.section-container .tab-container{border:none;display:none;list-style-type:none;padding:0;margin:0}.section-container .tab-container li{float:left;position:relative;top:0;padding:0;margin:0 1px 0px 0;border-top:1px solid #f3f1ef !important;border-bottom:1px solid #f3f1ef !important;background:#f3f1ef !important}.section-container .tab-container li a{top:0 !important;margin-bottom:0 !important;padding:6px 16px;text-decoration:none;min-height:32px;color:#222;float:left}.section-container .tab-container li.active,.section-container .tab-container li:hover{border-bottom-color:#4a86ad !important;border-top-color:#6e9ebd !important;background:#266d9c !important}.section-container .tab-container li.active a,.section-container .tab-container li:hover a{background:transparent !important;border-color:transparent !important;color:#fff !important;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.section-container .tab-container li.disabled:hover{background:#f3f1ef !important}.section-container .tab-container li.disabled:hover a{cursor:not-allowed !important;color:#222 !important}.section-container .navi-container{display:none;background:#f3f1ef;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px;border-right:1px #ddd solid}.section-container .navi-container .block-title{font-size:14px;font-size:1.4rem;padding:2px 8px;margin:0}.section-container .navi-container .tree-action-bar-box{margin:10px 0;opacity:0}.section-container .navi-container .tree-action-bar-box.active{opacity:1;-webkit-opacity:0.25s ease-in-out;-moz-opacity:0.25s ease-in-out;opacity:0.25s ease-in-out}.section-container .content-container{border:none;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.section-container .content-block{padding:20px;overflow-y:auto;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.section-container .content-block>.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\\\" \\\";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\\\"btn-\\\"],.section-container .content-block [class*=\\\" btn-\\\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 0px)}.item-previewer-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\\\"Andale Mono WT\\\",\\\"Andale Mono\\\",\\\"Lucida Console\\\",\\\"Lucida Sans Typewriter\\\",\\\"DejaVu Sans Mono\\\",\\\"Bitstream Vera Sans Mono\\\",\\\"Liberation Mono\\\",\\\"Nimbus Mono L\\\",Monaco,\\\"Courier New\\\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,0.3);border-radius:0px;display:inline-block;height:inherit}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\\\"btn-\\\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"],.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame{border-radius:5px;padding:30px}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\\\"standard\\\"] .desktop-selector,.devices-selector[data-type=\\\"standard\\\"] .mobile-selector,.devices-selector[data-type=\\\"standard\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"desktop\\\"] .mobile-selector,.devices-selector[data-type=\\\"desktop\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"mobile\\\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */.previewer-test-component{background:inherit}.previewer-test-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:64px;z-index:100000}.previewer-test-component.fullpage .item-previewer-scope{height:100vh}.previewer-test-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-test-component.hideactionbars .test-sidebar{height:100%}.previewer-test-component.hideactionbars .action-bar{display:none}.previewer-test-component #preview-logo{margin:6px 30px 6px 30px;display:block;max-width:200px;height:52px;background:transparent}.previewer-test-component footer{z-index:10000;position:relative;font-size:11px;padding:10px;border-top:1px #ddd solid}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/component/test/css/qtiTest.css.map */');\n","\ndefine(\"taoQtiTestPreviewer/loader/qtiPreviewer.bundle\", function(){});\n","define(\"taoQtiTestPreviewer/loader/qtiPreviewer.min\", [\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\",\"taoQtiTest/loader/taoQtiTestRunner.min\",\"taoQtiTest/loader/testPlugins.min\"], function(){});\n"]} \ No newline at end of file