Skip to content

Commit

Permalink
MDL-53528 tool_lp: Allow user to choose parent when creating competency
Browse files Browse the repository at this point in the history
  • Loading branch information
taboubi authored and Frederic Massart committed Apr 18, 2016
1 parent 91e5464 commit 5f887f4
Show file tree
Hide file tree
Showing 8 changed files with 270 additions and 14 deletions.
2 changes: 1 addition & 1 deletion admin/tool/lp/amd/build/course_competency_settings.min.js

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

1 change: 1 addition & 0 deletions admin/tool/lp/amd/build/parentcompetency_form.min.js

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

207 changes: 207 additions & 0 deletions admin/tool/lp/amd/src/parentcompetency_form.js
@@ -0,0 +1,207 @@
// 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/>.

/**
* Handle selecting parent competency in competency form.
*
* @module tool_lp/parentcompetency_form
* @package tool_lp
* @copyright 2015 Issam Taboubi <issam.taboubi@umontreal.ca>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(['jquery', 'core/ajax', 'core/str', 'tool_lp/competencypicker', 'core/templates', 'core/notification'],
function($, ajax, Str, Picker, Templates, Notification) {

/**
* Parent Competency Form object.
* @param {String} buttonSelector The parent competency button selector.
* @param {String} inputHiddenSelector The hidden input field selector.
* @param {String} staticElementSelector The static element displaying the parent competency.
* @param {Number} frameworkId The competency framework ID.
* @param {Number} frameworkMaxLevel The framework max level.
* @param {Number} pageContextId The page context ID.
*/
var ParentCompetencyForm = function(buttonSelector,
inputHiddenSelector,
staticElementSelector,
frameworkId,
frameworkMaxLevel,
pageContextId) {
this.buttonSelector = buttonSelector;
this.inputHiddenSelector = inputHiddenSelector;
this.staticElementSelector = staticElementSelector;
this.frameworkId = frameworkId;
this.frameworkMaxLevel = frameworkMaxLevel;
this.pageContextId = pageContextId;

// Register the events.
this.registerEvents();
};

/** @var {String} The parent competency button selector. */
ParentCompetencyForm.prototype.buttonSelector = null;
/** @var {String} The hidden input field selector. */
ParentCompetencyForm.prototype.inputHiddenSelector = null;
/** @var {String} The static element displaying the parent competency. */
ParentCompetencyForm.prototype.staticElementSelector = null;
/** @var {Number} The competency framework ID. */
ParentCompetencyForm.prototype.frameworkId = null;
/** @var {Number} The framework max level. */
ParentCompetencyForm.prototype.frameworkMaxLevel = null;
/** @var {Number} The page context ID. */
ParentCompetencyForm.prototype.pageContextId = null;

/**
* Set the parent competency in the competency form.
*
* @param {Object} Data containing selected cmpetency.
* @method setParent
*/
ParentCompetencyForm.prototype.setParent = function(data) {
var self = this;

if (data.competencyId !== 0) {
ajax.call([
{ methodname: 'core_competency_read_competency', args: {
id: data.competencyId
}}
])[0].done(function(competency) {
$(self.staticElementSelector).html(competency.shortname);
$(self.inputHiddenSelector).val(competency.id);
}).fail(Notification.exception);
} else {
// Root of competency framework selected.
Str.get_string('competencyframeworkroot', 'tool_lp').then(function(rootframework) {
$(self.staticElementSelector).html(rootframework);
$(self.inputHiddenSelector).val(data.competencyId);
}).fail(Notification.exception);
}
};

/**
* Register the events of parent competency button click.
*
* @method registerEvents
*/
ParentCompetencyForm.prototype.registerEvents = function() {
var self = this;

// Event on edit parent button.
$(self.buttonSelector).on('click', function(e) {
e.preventDefault();

var picker = new Picker(self.pageContextId, self.frameworkId, 'self', false);
var maxlevel = self.frameworkMaxLevel;
// Override the fetchcompetencies method to filter by max level.
picker._fetchCompetencies = function(frameworkId, searchText) {
var self = this;

return ajax.call([
{ methodname: 'core_competency_search_competencies', args: {
searchtext: searchText,
competencyframeworkid: frameworkId
}}
])[0].done(function(competencies) {

var disabledcompetencies = [];
function addCompetencyChildren(parent, competencies) {
for (var i = 0; i < competencies.length; i++) {
// Check if competency does not exceed the framework max level.
var path = String(competencies[i].path),
level = path.split('/').length - 2;
if (level >= maxlevel && competencies[i].id !== "0") {
disabledcompetencies.push(competencies[i].id);
}

if (competencies[i].parentid == parent.id) {
parent.haschildren = true;
competencies[i].children = [];
competencies[i].haschildren = false;
parent.children[parent.children.length] = competencies[i];
addCompetencyChildren(competencies[i], competencies);
}
}
}

// Expand the list of competencies into a tree.
var i, tree = [], comp;
for (i = 0; i < competencies.length; i++) {
comp = competencies[i];
if (comp.parentid == "0") { // Loose check for now, because WS returns a string.
comp.children = [];
comp.haschildren = 0;
tree[tree.length] = comp;
addCompetencyChildren(comp, competencies);
}
}

self._competencies = tree;
self.setDisallowedCompetencyIDs(disabledcompetencies);

}.bind(self)).fail(Notification.exception);
};
// Override the render method to make framework selectable.
picker._render = function() {
var self = this;
return self._preRender().then(function() {
var context = {
competencies: self._competencies,
framework: self._getFramework(self._frameworkId),
frameworks: self._frameworks,
search: self._searchText,
singleFramework: self._singleFramework,
};

return Templates.render('tool_lp/competency_picker_competencyform', context);
}.bind(self));
};

// On selected competency.
picker.on('save', function(e, data) {
self.setParent(data);
}.bind(self));

picker.display();
});
};

return {

/**
* Main initialisation.
* @param {String} buttonSelector The parent competency button selector.
* @param {String} inputHiddenSelector The hidden input field selector.
* @param {String} staticElementSelector The static element displaying the parent competency.
* @param {Number} frameworkId The competency framework ID.
* @param {Number} frameworkMaxLevel The framework max level.
* @param {Number} pageContextId The page context ID.
* @method init
*/
init: function(buttonSelector,
inputSelector,
staticElementSelector,
frameworkId,
frameworkMaxLevel,
pageContextId) {
// Create instance.
new ParentCompetencyForm(buttonSelector,
inputSelector,
staticElementSelector,
frameworkId,
frameworkMaxLevel,
pageContextId);
}
};
});
42 changes: 32 additions & 10 deletions admin/tool/lp/classes/form/competency.php
Expand Up @@ -36,17 +36,19 @@
*/
class competency extends persistent {

/** @var core_competency\competency persistent class for form */
protected static $persistentclass = 'core_competency\\competency';

/**
* Define the form - called by parent constructor
*/
public function definition() {
global $PAGE;
global $PAGE, $OUTPUT;

$mform = $this->_form;
$framework = $this->_customdata['competencyframework'];
$parent = $this->_customdata['parent'];
$pagecontextid = $this->_customdata['pagecontextid'];
$competency = $this->get_persistent();

$mform->addElement('hidden', 'competencyframeworkid');
Expand All @@ -59,15 +61,35 @@ public function definition() {
'frameworkdesc',
get_string('competencyframework', 'tool_lp'),
s($framework->get_shortname()));
if ($parent) {
$mform->addElement('hidden', 'parentid');
$mform->setType('parentid', PARAM_INT);
$mform->setConstant('parentid', $parent->get_id());

$mform->addElement('static',
'parentdesc',
get_string('taxonomy_parent_' . $framework->get_taxonomy($parent->get_level()), 'tool_lp'),
s($parent->get_shortname()));

$mform->addElement('hidden', 'parentid', '', array('id' => 'tool_lp_parentcompetency'));

$mform->setType('parentid', PARAM_INT);
$mform->setConstant('parentid', ($parent) ? $parent->get_id() : 0);
$parentlevel = ($parent) ? $parent->get_level() : 0;
$parentname = ($parent) ? $parent->get_shortname() : get_string('competencyframeworkroot', 'tool_lp');
$parentlabel = ($competency->get_id()) ?
get_string('taxonomy_parent_' . $framework->get_taxonomy($parentlevel), 'tool_lp') :
get_string('parentcompetency', 'tool_lp');
$editaction = '';
if (!$competency->get_id()) {
$icon = $OUTPUT->pix_icon('t/editstring', get_string('parentcompetency_edit', 'tool_lp'));
$editaction = $OUTPUT->action_link('#', $icon, null, array('id' => 'id_parentcompetencybutton'));
}

$mform->addElement('static',
'parentdesc',
$parentlabel,
"<span id='id_parentdesc'>$parentname</span>&nbsp;".$editaction);
// Set the picker competency when adding new competency.
if (!$competency->get_id()) {
// Call the parentcompetency_form init to initialize the competency picker for parent competency.
$PAGE->requires->js_call_amd('tool_lp/parentcompetency_form', 'init', array('#id_parentcompetencybutton',
'#tool_lp_parentcompetency',
'#id_parentdesc',
$framework->get_id(),
\core_competency\competency_framework::get_taxonomies_max_level(),
$pagecontextid));
}

$mform->addElement('text', 'shortname',
Expand Down
3 changes: 2 additions & 1 deletion admin/tool/lp/editcompetency.php
Expand Up @@ -77,7 +77,8 @@
$formoptions = [
'competencyframework' => $competencyframework,
'parent' => $parent,
'persistent' => $competency
'persistent' => $competency,
'pagecontextid' => $pagecontextid
];
$form = new \tool_lp\form\competency($url->out(false), $formoptions);

Expand Down
5 changes: 4 additions & 1 deletion admin/tool/lp/lang/en/tool_lp.php
Expand Up @@ -58,6 +58,7 @@
$string['competencyframework'] = 'Competency framework';
$string['competencyframeworkcreated'] = 'Competency framework created.';
$string['competencyframeworkname'] = 'Name';
$string['competencyframeworkroot'] = 'No parent (Top level competency)';
$string['competencyframeworks'] = 'Competency Frameworks';
$string['competencyframeworkupdated'] = 'Competency framework updated.';
$string['competencyoutcome_complete'] = 'Mark as complete';
Expand Down Expand Up @@ -156,8 +157,10 @@
$string['nouserplans'] = 'No learning plans have been created yet.';
$string['oneplanwascreated'] = 'A plan was created';
$string['outcome'] = 'Outcome';
$string['parentcompetency'] = 'Parent competency';
$string['path'] = 'Path:';
$string['parentcompetency'] = 'Parent';
$string['parentcompetency_edit'] = 'Edit parent';
$string['parentcompetency_help'] = 'Define the parent under which the competency will be added. It can either be another competency within the same framework, or the root of the competency framework for a top level competency.';
$string['planapprove'] = 'Make active';
$string['plancompleted'] = 'Plan completed';
$string['plancreated'] = 'Learning plan created';
Expand Down

0 comments on commit 5f887f4

Please sign in to comment.