tao-test/app/taoClientDiagnostic/views/js/component/diagnostic/diagnosticLoader.js

86 lines
3.5 KiB
JavaScript

/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* 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-2021 (original work) Open Assessment Technologies SA ;
*/
define([
'lodash',
'ui/component',
'core/moduleLoader',
'context',
'module',
'tpl!taoClientDiagnostic/component/diagnostic/tpl/component',
'layout/loading-bar'
], function(_, componentFactory, moduleLoader, context, module, componentTpl, loadingBar) {
'use strict';
/*
* This component factory is loading diagnostic tool modules and initialising with their configuration.
* @param {object} container - Container in which the module will render diagnostic check
* @param {object} config - Some config options.
*/
return function diagnosticLoaderFactory(container, config) {
const component = componentFactory()
// set the component's layout
.setTemplate(componentTpl)
// auto render on init
.on('init', function onDiagnosticLoaderInit() {
this.render(container);
})
// renders the component
.on('render', function onDiagnosticLoaderRender() {
const moduleConfig = module.config();
const identifiers = Object.keys(moduleConfig.diagnostics);
/*
* This loads all the modules from module configuration, which are in the `diagnostics` array.
*/
moduleLoader({}, _.isFunction)
.addList(moduleConfig.diagnostics)
.load(context.bundle)
.then(factories => {
const componentConfig = this.getConfig();
/*
* Read all factories and initialise them with their config from component.
*/
factories.forEach((factory, index) => {
const factoryName = identifiers[index];
const factoryConfig = componentConfig[factoryName];
factoryConfig.controller = componentConfig.controller;
factory(this.getElement(), factoryConfig)
.on('render', function onRender() {
if (factoryConfig.autoStart) {
this.run();
}
})
.on('start', () => loadingBar.start())
.on('end', () => loadingBar.stop());
});
/**
* @event ready
*/
this.trigger('ready');
});
});
_.defer(() => component.init(config));
return component;
};
});