// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Competency rule points module.
*
* @module tool_lp/competency_rule_points
* @copyright 2015 Frédéric Massart - FMCorz.net
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(['jquery',
'core/str',
'core/templates',
'tool_lp/competency_rule',
],
function($, Str, Templates, RuleBase) {
/**
* Competency rule points class.
*/
var Rule = function() {
RuleBase.apply(this, arguments);
};
Rule.prototype = Object.create(RuleBase.prototype);
/** @property {Node} Reference to the container in which the template was included. */
Rule.prototype._container = null;
/** @property {Boolean} Whether or not the template was included. */
Rule.prototype._templateLoaded = false;
/**
* The config established by this rule.
*
* @return {String}
* @method getConfig
*/
Rule.prototype.getConfig = function() {
return JSON.stringify({
base: {
points: this._getRequiredPoints(),
},
competencies: this._getCompetenciesConfig()
});
};
/**
* Gathers the input provided by the user for competencies.
*
* @return {Array} Containing id, points and required.
* @method _getCompetenciesConfig
* @protected
*/
Rule.prototype._getCompetenciesConfig = function() {
var competencies = [];
this._container.find('[data-competency]').each(function() {
var node = $(this),
id = node.data('competency'),
points = parseInt(node.find('[name="points"]').val(), 10),
required = node.find('[name="required"]').prop('checked');
competencies.push({
id: id,
points: points,
required: required ? 1 : 0
});
});
return competencies;
};
/**
* Fetches the required points set by the user.
*
* @return {Number}
* @method _getRequiredPoints
* @protected
*/
Rule.prototype._getRequiredPoints = function() {
return parseInt(this._container.find('[name="requiredpoints"]').val() || 1, 10);
};
/**
* Return the type of the module.
*
* @return {String}
* @method getType
*/
Rule.prototype.getType = function() {
return 'core_competency\\competency_rule_points';
};
/**
* Callback to inject the template.
*
* @param {Node} container Node to inject in.
* @return {Promise} Resolved when done.
* @method injectTemplate
*/
Rule.prototype.injectTemplate = function(container) {
var self = this,
children = this._tree.getChildren(this._competency.id),
context,
config = {
base: {points: 2},
competencies: []
};
this._templateLoaded = false;
// Only pre-load the configuration when the competency is using this rule.
if (self._competency.ruletype == self.getType()) {
try {
config = JSON.parse(self._competency.ruleconfig);
} catch (e) {
// eslint-disable-line no-empty
}
}
context = {
requiredpoints: (config && config.base) ? config.base.points : 2,
competency: self._competency,
children: []
};
$.each(children, function(index, child) {
var competency = {
id: child.id,
shortname: child.shortname,
required: false,
points: 0
};
if (config) {
$.each(config.competencies, function(index, comp) {
if (comp.id == competency.id) {
competency.required = comp.required ? true : false;
competency.points = comp.points;
}
});
}
context.children.push(competency);
});
return Templates.render('tool_lp/competency_rule_points', context).then(function(html) {
self._container = container;
container.html(html);
container.find('input').change(function() {
self._triggerChange();
});
// We're done, let's trigger a change.
self._templateLoaded = true;
self._triggerChange();
return;
});
};
/**
* Whether or not the current config is valid.
*
* @return {Boolean}
* @method isValid
*/
Rule.prototype.isValid = function() {
if (!this._templateLoaded) {
return false;
}
var required = this._getRequiredPoints(),
max = 0,
valid = true;
$.each(this._getCompetenciesConfig(), function(index, competency) {
if (competency.points < 0) {
valid = false;
}
max += competency.points;
});
valid = valid && max >= required;
return valid;
};
return Rule;
});