Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/hkd 6/integration #212

Merged
merged 8 commits into from
Nov 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@
"minimum-stability": "dev",
"require": {
"oat-sa/oatbox-extension-installer": "~1.1||dev-master",
"oat-sa/generis" : ">=15.22",
"oat-sa/tao-core" : ">=54.0.0",
"oat-sa/extension-tao-item" : ">=11.11.2",
"oat-sa/extension-tao-itemqti" : ">=28.22.0",
"oat-sa/extension-tao-testqti" : ">=47.3.0",
"oat-sa/extension-tao-test" : ">=15.0.0",
"oat-sa/generis" : ">=15.39.0",
"oat-sa/tao-core" : ">=54.23.0",
"oat-sa/extension-tao-item" : ">=12.4.0",
"oat-sa/extension-tao-itemqti" : ">=30.22.0",
"oat-sa/extension-tao-testqti" : ">=48.14.0",
"oat-sa/extension-tao-test" : ">=16.3.0",
"oat-sa/extension-tao-delivery" : ">=15.0.0",
"oat-sa/extension-tao-outcome" : ">=13.0.0",
"qtism/qtism": "~0"
Expand Down
2 changes: 1 addition & 1 deletion views/js/loader/qtiPreviewer.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion views/js/loader/qtiPreviewer.min.js.map

Large diffs are not rendered by default.

82 changes: 48 additions & 34 deletions views/js/previewer/adapter/item/qtiItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,17 @@
* 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) 2019 (original work) Open Assessment Technologies SA ;
* Copyright (c) 2019-2024 (original work) Open Assessment Technologies SA ;
*/
/**
* @author Jean-Sébastien Conan <[email protected]>
*/
define([
'lodash',
'core/logger',
'taoQtiTestPreviewer/previewer/component/qtiItem',
'ui/feedback'
], function (_, loggerFactory, qtiItemPreviewerFactory, feedback) {
define(['lodash', 'core/logger', 'taoQtiTestPreviewer/previewer/component/qtiItem', 'ui/feedback'], function (
_,
loggerFactory,
qtiItemPreviewerFactory,
feedback
) {
'use strict';

const logger = loggerFactory('taoQtiTest/previewer');
Expand All @@ -32,27 +32,33 @@ define([
* List of required plugins that should be loaded in order to make the previewer work properly
* @type {Object[]}
*/
const defaultPlugins = [{
module: 'taoQtiTestPreviewer/previewer/plugins/controls/close',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'controls'
}, {
module: 'taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'navigation'
}, {
module: 'taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'tools'
}, {
module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',
bundle: 'taoQtiTest/loader/testPlugins.min',
category: 'tools'
}, {
module: 'taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'content'
}];
const defaultPlugins = [
{
module: 'taoQtiTestPreviewer/previewer/plugins/controls/close',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'controls'
},
{
module: 'taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'navigation'
},
{
module: 'taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'tools'
},
{
module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',
bundle: 'taoQtiTest/loader/testPlugins.min',
category: 'tools'
},
{
module: 'taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',
bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',
category: 'content'
}
];

/**
* Wraps the legacy item previewer in order to be loaded by the taoItems previewer factory
Expand All @@ -67,22 +73,30 @@ define([
* @param {Object} state - The state of the item
* @param {Object} [config] - Some config entries
* @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.
* @param {boolean} [config.fullPage] - Force the previewer to occupy the full window.
* @param {boolean} [config.readOnly] - Do not allow to modify the previewed item.
* @param {string} [config.viewer] - Instruct the previewer of the type of usage.
* @param {boolean} [config.disableDefaultPlugins] - Disable the plugins.
* @returns {Object}
*/
init(uri, state, config = {}) {
config.itemUri = uri;
config.itemState = state;
config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;
return qtiItemPreviewerFactory(window.document.body, config)
.on('error', function (err) {
if (!config.disableDefaultPlugins) {
config.plugins = Array.isArray(config.plugins)
? [...defaultPlugins, ...config.plugins]
: defaultPlugins;
}
return qtiItemPreviewerFactory(config.container || window.document.body, config).on(
'error',
function (err) {
if (!_.isUndefined(err.message)) {
feedback().error(err.message);
} else {
logger.error(err);
}
});
}
);
}
};
});
2 changes: 1 addition & 1 deletion views/js/previewer/provider/item/css/item.css

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion views/js/previewer/provider/item/css/item.css.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

98 changes: 53 additions & 45 deletions views/js/previewer/provider/item/item.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* 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-2020 (original work) Open Assessment Technologies SA ;
* Copyright (c) 2018-2024 (original work) Open Assessment Technologies SA ;
*/

/**
Expand Down Expand Up @@ -58,19 +58,18 @@ define([

//store the current execution context of the common renderer (preview)
let _$previousContext = null;
function setContext($context){
function setContext($context) {
_$previousContext = containerHelper.getContext();
containerHelper.setContext($context);
}
function restoreContext(){
function restoreContext() {
containerHelper.setContext(_$previousContext);
_$previousContext = null;
}
/**
* A Test runner provider to be registered against the runner
*/
return {

//provider name
name: 'qtiItemPreviewer',

Expand Down Expand Up @@ -99,8 +98,8 @@ define([
* @returns {proxy}
*/
loadProxy() {
const {proxyProvider, serviceCallId, bootstrap, timeout} = this.getConfig();
return proxyFactory(proxyProvider || 'qtiItemPreviewerProxy', {serviceCallId, bootstrap, timeout});
const { proxyProvider, serviceCallId, bootstrap, timeout } = this.getConfig();
return proxyFactory(proxyProvider || 'qtiItemPreviewerProxy', { serviceCallId, bootstrap, timeout });
},

/**
Expand All @@ -119,7 +118,7 @@ define([
* Installation of the provider, called during test runner init phase.
*/
install() {
const {plugins} = this.getConfig().options;
const { plugins } = this.getConfig().options;
if (plugins) {
_.forEach(this.getPlugins(), plugin => {
if (_.isPlainObject(plugin) && _.isFunction(plugin.setConfig)) {
Expand Down Expand Up @@ -151,32 +150,32 @@ define([
/*
* Install behavior on events
*/
this
.on('submititem', () => {
const itemState = this.itemRunner.getState();
const itemResponses = this.itemRunner.getResponses();

this.trigger('disabletools disablenav');
this.trigger('submitresponse', itemResponses, itemState);

return this.getProxy()
.submitItem(dataHolder.get('itemIdentifier'), itemState, itemResponses)
.then(response => {
this.trigger('scoreitem', response);
this.trigger('enabletools enablenav resumeitem');
})
.catch(err => {
this.trigger('enabletools enablenav');

//some server errors are valid, so we don't fail (prevent empty responses)
if (err.code === 200) {
this.trigger('alert.submitError',
err.message || __('An error occurred during results submission. Please retry.'),
() => this.trigger('resumeitem')
);
}
});
})
this.on('submititem', () => {
const itemState = this.itemRunner.getState();
const itemResponses = this.itemRunner.getResponses();

this.trigger('disabletools disablenav');
this.trigger('submitresponse', itemResponses, itemState);

return this.getProxy()
.submitItem(dataHolder.get('itemIdentifier'), itemState, itemResponses)
.then(response => {
this.trigger('scoreitem', response);
this.trigger('enabletools enablenav resumeitem');
})
.catch(err => {
this.trigger('enabletools enablenav');

//some server errors are valid, so we don't fail (prevent empty responses)
if (err.code === 200) {
this.trigger(
'alert.submitError',
err.message || __('An error occurred during results submission. Please retry.'),
() => this.trigger('resumeitem')
);
}
});
})
.on('ready', () => {
const itemIdentifier = dataHolder.get('itemIdentifier');
const itemData = dataHolder.get('itemData');
Expand Down Expand Up @@ -237,6 +236,10 @@ define([

config.renderTo.append(areaBroker.getContainer());

if (config.options.view) {
areaBroker.getContainer().addClass(`view-${config.options.view}`);
}

areaBroker.getToolbox().render(areaBroker.getToolboxArea());
},

Expand Down Expand Up @@ -279,17 +282,26 @@ define([
assetManager.setData('baseUrl', itemData.baseUrl);
assetManager.setData('assets', itemData.content.assets);

this.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, Object.assign({
assetManager: assetManager
}, options))
this.itemRunner = qtiItemRunner(
itemData.content.type,
itemData.content.data,
Object.assign(
{
assetManager: assetManager
},
options
)
)
.on('error', err => {
this.trigger('enablenav');
reject(err);
feedback().error(__('It seems that there is an error during item preview loading. Please, try again.'));
feedback().error(
__('It seems that there is an error during item preview loading. Please, try again.')
);
})
.on('init', function onItemRunnerInit() {
const {state, portableElements} = itemData;
this.render(areaBroker.getContentArea(), {state, portableElements});
const { state, portableElements } = itemData;
this.render(areaBroker.getContentArea(), { state, portableElements });
})
.on('render', function onItemRunnerRender() {
this.on('responsechange', changeState);
Expand All @@ -313,9 +325,7 @@ define([

if (this.itemRunner) {
return new Promise(resolve => {
this.itemRunner
.on('clear', resolve)
.clear();
this.itemRunner.on('clear', resolve).clear();
});
}
return Promise.resolve();
Expand All @@ -333,9 +343,7 @@ define([

// prevent the item to be displayed while test runner is destroying
if (this.itemRunner) {
this.itemRunner
.on('clear', restoreContext)
.clear();
this.itemRunner.on('clear', restoreContext).clear();
}
this.itemRunner = null;

Expand Down
15 changes: 12 additions & 3 deletions views/js/previewer/provider/item/scss/inc/_previewer-layout.scss
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,18 @@
-ms-flex-direction: column;
flex-direction: column;

height: calc(100vh - #{(map-get($heights, header) + map-get($heights, footer)) * 1px});
&.view-viewer {
.action-bar {
display: none;
}
}
&:not(.view-viewer) {
height: calc(100vh - #{(map-get($heights, header) + map-get($heights, footer)) * 1px});

.test-sidebar {
height: calc(100vh - #{(map-get($heights, header) + map-get($heights, footer) + map-get($heights, horizontal-action-bar) * 2) * 1px});
}
}

.test-runner-sections {

Expand Down Expand Up @@ -41,8 +52,6 @@
-ms-flex: 0 1 auto;
flex: 0 1 auto;

height: calc(100vh - #{(map-get($heights, header) + map-get($heights, footer) + map-get($heights, horizontal-action-bar) * 2) * 1px});

overflow-y: auto;

max-width: 350px;
Expand Down
Loading