From 8cb101a7d2f8c55ea0c40020160b34b15fc18c48 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Fri, 16 Oct 2015 14:17:00 +0800 Subject: [PATCH] MDL-51638 tool_lp: Display the taxonomy terms where relevant --- .../lp/amd/build/competencyactions.min.js | 2 +- admin/tool/lp/amd/build/competencytree.min.js | 2 +- admin/tool/lp/amd/src/competencyactions.js | 101 ++++++++++++++++-- admin/tool/lp/amd/src/competencytree.js | 12 +++ admin/tool/lp/classes/competency.php | 11 ++ .../tool/lp/classes/competency_framework.php | 6 +- admin/tool/lp/classes/form/competency.php | 6 +- .../output/manage_competencies_page.php | 3 +- admin/tool/lp/editcompetency.php | 23 ++-- admin/tool/lp/lang/en/tool_lp.php | 44 ++++++++ .../manage_competencies_page.mustache | 10 +- 11 files changed, 190 insertions(+), 30 deletions(-) diff --git a/admin/tool/lp/amd/build/competencyactions.min.js b/admin/tool/lp/amd/build/competencyactions.min.js index e22b41f698e..d1bc5859317 100644 --- a/admin/tool/lp/amd/build/competencyactions.min.js +++ b/admin/tool/lp/amd/build/competencyactions.min.js @@ -1 +1 @@ -define(["jquery","core/url","core/templates","core/notification","core/str","core/ajax","tool_lp/dragdrop-reorder","tool_lp/tree","tool_lp/dialogue","tool_lp/menubar","tool_lp/competencypicker"],function(a,b,c,d,e,f,g,h,i,j,k){var l,m,n,o=null,p=null,q=null,r=function(){var c=a('[data-region="competencyactions"]').data("competency"),d={competencyframeworkid:o.getCompetencyFrameworkId(),pagecontextid:l};null!==c&&(d.parentid=c.id);var e=a.param(d);window.location=b.relativeUrl("/admin/tool/lp/editcompetency.php?"+e)},s=function(){if("undefined"==typeof q&&(q=0),q!=p){var b=a('[data-region="filtercompetencies"]').data("frameworkid"),c=f.call([{methodname:"tool_lp_set_parent_competency",args:{competencyid:p,parentid:q}},{methodname:"tool_lp_data_for_competencies_manage_page",args:{competencyframeworkid:b,search:a('[data-region="filtercompetencies"] input').val()}}]);c[1].done(x).fail(d.exception)}},t=function(b){new h("[data-enhance=movetree]",function(b){q=a(b).data("id")});var c=a(b.getContent());c.on("click",'[data-action="move"]',function(){b.close(),s()}),c.on("click",'[data-action="cancel"]',function(){b.close()})},u=function(a,b){var c;for(c=0;c". + * + * @param {Number} level The level. + * @return {String} + * @function strAddTaxonomy + */ + var strAddTaxonomy = function(level) { + return str.get_string('taxonomy_add_' + getTaxonomyAtLevel(level), 'tool_lp'); + }; + + /** + * Return the string "Selected ". + * + * @param {Number} level The level. + * @return {String} + * @function strSelectedTaxonomy + */ + var strSelectedTaxonomy = function(level) { + return str.get_string('taxonomy_selected_' + getTaxonomyAtLevel(level), 'tool_lp'); + }; + return { /** * Initialise this page (attach event handlers etc). @@ -489,10 +539,12 @@ define(['jquery', * @method init * @param {Object} model The tree model provides some useful functions for loading and searching competencies. * @param {Number} pagectxid The page context ID. + * @param {Object} taxonomies Constants indexed by level. */ - init: function(model, pagectxid) { + init: function(model, pagectxid, taxonomies) { treeModel = model; pageContextId = pagectxid; + taxonomiesConstants = taxonomies; $('[data-region="competencyactions"] [data-action="add"]').on('click', addHandler); @@ -506,6 +558,7 @@ define(['jquery', '[data-action="relatedcompetencies"]': relateCompetenciesHandler.bind(this) }); $('[data-region="competencyactionsmenu"]').hide(); + $('[data-region="competencyactions"] [data-action="add"]').hide(); $('[data-region="filtercompetencies"]').on('submit', updateSearchHandler); // Simple html5 drag drop because we already added an accessible alternative. @@ -521,30 +574,56 @@ define(['jquery', * @method selectionChanged */ selectionChanged: function(node) { - var id = $(node).data('id'); + var id = $(node).data('id'), + btn = $('[data-region="competencyactions"] [data-action="add"]'), + actionMenu = $('[data-region="competencyactionsmenu"]'), + selectedTitle = $('[data-region="selected-competency"]'), + level = 0, + sublevel = 1; + menubar.closeAll(); + if (typeof id === "undefined") { // Assume this is the root of the tree. // Here we are only getting the text from the top of the tree, to do it we clone the tree, // remove all children and then call text on the result. $('[data-region="competencyinfo"]').html(node.clone().children().remove().end().text()); $('[data-region="competencyactions"]').data('competency', null); - $('[data-region="competencyactionsmenu"]').hide(); - $('[data-region="competencyactions"] [data-action="add"]').removeAttr("disabled"); + actionMenu.hide(); + } else { var competency = treeModel.getCompetency(id); + competency.showdeleterelatedaction = true; competency.showrelatedcompetencies = true; - $('[data-region="competencyactionsmenu"]').show(); - templates.render('tool_lp/competency_summary', competency) - .done(function(html) { - $('[data-region="competencyinfo"]').html(html); - $('[data-action="deleterelation"]').on('click', deleteRelatedHandler); - }).fail(notification.exception); + level = treeModel.getCompetencyLevel(id); + if (!hasSubLevel(level)) { + sublevel = false; + } else { + sublevel = level + 1; + } + actionMenu.show(); $('[data-region="competencyactions"]').data('competency', competency); - $('[data-region="competencyactions"] [data-action="add"]').removeAttr("disabled"); + templates.render('tool_lp/competency_summary', competency).then(function(html) { + $('[data-region="competencyinfo"]').html(html); + $('[data-action="deleterelation"]').on('click', deleteRelatedHandler); + }, notification.exception); + } + + strSelectedTaxonomy(level).then(function(str) { + selectedTitle.text(str); + }); + + if (!sublevel) { + btn.hide(); + } else { + strAddTaxonomy(sublevel).then(function(str) { + btn.show() + .find('[data-region="term"]') + .text(str); + }); } } }; diff --git a/admin/tool/lp/amd/src/competencytree.js b/admin/tool/lp/amd/src/competencytree.js index 3dffca648c1..9f470b43fda 100644 --- a/admin/tool/lp/amd/src/competencytree.js +++ b/admin/tool/lp/amd/src/competencytree.js @@ -91,6 +91,18 @@ return competencies[id]; }, + /** + * Get the competency level. + * + * @param {Number} id The competency ID. + * @return {Number} + */ + getCompetencyLevel: function(id) { + var competency = this.getCompetency(id), + level = competency.path.replace(/^\/|\/$/g, '').split('/').length; + return level; + }, + /** * Reload all the page competencies framework competencies. * @method reloadCompetencies diff --git a/admin/tool/lp/classes/competency.php b/admin/tool/lp/classes/competency.php index b4b6d072670..fff17f92ac4 100644 --- a/admin/tool/lp/classes/competency.php +++ b/admin/tool/lp/classes/competency.php @@ -182,6 +182,17 @@ class competency extends persistent { return new competency_framework($this->get_competencyframeworkid()); } + /** + * Get the competency level. + * + * @return int + */ + public function get_level() { + $path = $this->get_path(); + $path = trim($path, '/'); + return substr_count($path, '/') + 1; + } + /** * Return the parent competency. * diff --git a/admin/tool/lp/classes/competency_framework.php b/admin/tool/lp/classes/competency_framework.php index da81135a5f1..2e1a1132abc 100644 --- a/admin/tool/lp/classes/competency_framework.php +++ b/admin/tool/lp/classes/competency_framework.php @@ -116,10 +116,10 @@ class competency_framework extends persistent { } /** - * Get the translated name for a level. + * Get the constant name for a level. * * @param int $level The level of the term. - * @return lang_string + * @return string */ public function get_taxonomy($level) { $taxonomies = $this->get_taxonomies(); @@ -131,7 +131,7 @@ class competency_framework extends persistent { $constant = $taxonomies[$level]; } - return self::get_taxonomy_from_constant($constant); + return $constant; } /** diff --git a/admin/tool/lp/classes/form/competency.php b/admin/tool/lp/classes/form/competency.php index b097a5fb99b..67d40b77ea8 100644 --- a/admin/tool/lp/classes/form/competency.php +++ b/admin/tool/lp/classes/form/competency.php @@ -65,6 +65,8 @@ class competency extends moodleform { $mform->setType('competencyframeworkid', PARAM_INT); $mform->setDefault('competencyframeworkid', $framework->get_id()); + $mform->addElement('header', 'generalhdr', get_string('general')); + $mform->addElement('static', 'frameworkdesc', get_string('competencyframework', 'tool_lp'), @@ -72,7 +74,7 @@ class competency extends moodleform { if ($parent) { $mform->addElement('static', 'parentdesc', - get_string('parentcompetency', 'tool_lp'), + get_string('taxonomy_parent_' . $framework->get_taxonomy($parent->get_level()), 'tool_lp'), s($parent->get_shortname())); } @@ -96,7 +98,7 @@ class competency extends moodleform { if (!empty($id)) { if (!$this->is_submitted()) { - $competency = api::read_competency($id); + $competency = $this->_customdata['competency']; $record = $competency->to_record(); // Massage for editor API. $record->description = array('text' => $record->description, 'format' => $record->descriptionformat); diff --git a/admin/tool/lp/classes/output/manage_competencies_page.php b/admin/tool/lp/classes/output/manage_competencies_page.php index 78715aa3e1f..c786f426918 100644 --- a/admin/tool/lp/classes/output/manage_competencies_page.php +++ b/admin/tool/lp/classes/output/manage_competencies_page.php @@ -31,6 +31,7 @@ use stdClass; use moodle_url; use context_system; use tool_lp\api; +use tool_lp\competency_framework; /** * Class containing data for managecompetencies page @@ -115,6 +116,7 @@ class manage_competencies_page implements renderable, templatable { $data->framework = $this->framework->to_record(); $data->framework->descriptionformatted = format_text($data->framework->description, $data->framework->descriptionformat, $options); + $data->framework->taxonomies = json_encode($this->framework->get_taxonomies()); $data->canmanage = $this->canmanage; $data->competencies = array(); $data->search = $this->search; @@ -123,7 +125,6 @@ class manage_competencies_page implements renderable, templatable { foreach ($this->competencies as $competency) { if ($competency->get_parentid() == 0) { $record = $competency->to_record(); - // TODO Use framework context for formatting. $record->descriptionformatted = format_text($record->description, $record->descriptionformat, $options); $record->children = array(); $record->haschildren = false; diff --git a/admin/tool/lp/editcompetency.php b/admin/tool/lp/editcompetency.php index 83cd6484e8d..21b3ed5f101 100644 --- a/admin/tool/lp/editcompetency.php +++ b/admin/tool/lp/editcompetency.php @@ -34,11 +34,6 @@ $parentid = optional_param('parentid', 0, PARAM_INT); require_login(); $pagecontext = context::instance_by_id($pagecontextid); -if (empty($id)) { - $pagetitle = get_string('addnewcompetency', 'tool_lp'); -} else { - $pagetitle = get_string('editcompetency', 'tool_lp'); -} // Set up the page. $url = new moodle_url("/admin/tool/lp/editcompetency.php", array('id' => $id, 'competencyframeworkid' => $competencyframeworkid, @@ -47,12 +42,26 @@ $frameworksurl = new moodle_url('/admin/tool/lp/competencyframeworks.php', array $frameworkurl = new moodle_url('/admin/tool/lp/competencies.php', array('competencyframeworkid' => $competencyframeworkid, 'pagecontextid' => $pagecontextid)); +$competency = null; $competencyframework = \tool_lp\api::read_framework($competencyframeworkid); +if (!empty($id)) { + $competency = \tool_lp\api::read_competency($id); +} + $parent = null; -if ($parentid) { +if ($competency) { + $parent = $competency->get_parent(); +} else if ($parentid) { $parent = \tool_lp\api::read_competency($parentid); } +if (empty($id)) { + $level = $parent ? $parent->get_level() + 1 : 1; + $pagetitle = get_string('taxonomy_add_' . $competencyframework->get_taxonomy($level), 'tool_lp'); +} else { + $pagetitle = get_string('taxonomy_edit_' . $competencyframework->get_taxonomy($competency->get_level()), 'tool_lp'); +} + $PAGE->navigation->override_active_url($frameworksurl); $PAGE->set_context($pagecontext); $PAGE->set_pagelayout('admin'); @@ -63,7 +72,7 @@ $PAGE->navbar->add($competencyframework->get_shortname(), $frameworkurl); $output = $PAGE->get_renderer('tool_lp'); $form = new \tool_lp\form\competency($url->out(false), array('id' => $id, 'competencyframework' => $competencyframework, - 'parent' => $parent)); + 'parent' => $parent, 'competency' => $competency)); if ($form->is_cancelled()) { redirect($frameworkurl); diff --git a/admin/tool/lp/lang/en/tool_lp.php b/admin/tool/lp/lang/en/tool_lp.php index 587808dcfab..dfa655e0926 100644 --- a/admin/tool/lp/lang/en/tool_lp.php +++ b/admin/tool/lp/lang/en/tool_lp.php @@ -129,15 +129,59 @@ $string['selectedcompetency'] = 'Selected competency'; $string['shortname'] = 'Name'; $string['status'] = 'Status'; $string['taxonomies'] = 'Taxonomies'; +$string['taxonomy_add_behaviour'] = 'Add behaviour'; +$string['taxonomy_add_competency'] = 'Add competency'; +$string['taxonomy_add_concept'] = 'Add concept'; +$string['taxonomy_add_domain'] = 'Add domain'; +$string['taxonomy_add_indicator'] = 'Add indicator'; +$string['taxonomy_add_level'] = 'Add level'; +$string['taxonomy_add_outcome'] = 'Add outcome'; +$string['taxonomy_add_practice'] = 'Add practice'; +$string['taxonomy_add_proficiency'] = 'Add proficiency'; +$string['taxonomy_add_skill'] = 'Add skill'; +$string['taxonomy_add_value'] = 'Add value'; $string['taxonomy_behaviour'] = 'Behaviour'; $string['taxonomy_competency'] = 'Competency'; $string['taxonomy_concept'] = 'Concept'; $string['taxonomy_domain'] = 'Domain'; +$string['taxonomy_edit_behaviour'] = 'Edit behaviour'; +$string['taxonomy_edit_competency'] = 'Edit competency'; +$string['taxonomy_edit_concept'] = 'Edit concept'; +$string['taxonomy_edit_domain'] = 'Edit domain'; +$string['taxonomy_edit_indicator'] = 'Edit indicator'; +$string['taxonomy_edit_level'] = 'Edit level'; +$string['taxonomy_edit_outcome'] = 'Edit outcome'; +$string['taxonomy_edit_practice'] = 'Edit practice'; +$string['taxonomy_edit_proficiency'] = 'Edit proficiency'; +$string['taxonomy_edit_skill'] = 'Edit skill'; +$string['taxonomy_edit_value'] = 'Edit value'; $string['taxonomy_indicator'] = 'Indicator'; $string['taxonomy_level'] = 'Level'; $string['taxonomy_outcome'] = 'Outcome'; +$string['taxonomy_parent_behaviour'] = 'Parent behaviour'; +$string['taxonomy_parent_competency'] = 'Parent competency'; +$string['taxonomy_parent_concept'] = 'Parent concept'; +$string['taxonomy_parent_domain'] = 'Parent domain'; +$string['taxonomy_parent_indicator'] = 'Parent indicator'; +$string['taxonomy_parent_level'] = 'Parent level'; +$string['taxonomy_parent_outcome'] = 'Parent outcome'; +$string['taxonomy_parent_practice'] = 'Parent practice'; +$string['taxonomy_parent_proficiency'] = 'Parent proficiency'; +$string['taxonomy_parent_skill'] = 'Parent skill'; +$string['taxonomy_parent_value'] = 'Parent value'; $string['taxonomy_practice'] = 'Practice'; $string['taxonomy_proficiency'] = 'Proficiency'; +$string['taxonomy_selected_behaviour'] = 'Selected behaviour'; +$string['taxonomy_selected_competency'] = 'Selected competency'; +$string['taxonomy_selected_concept'] = 'Selected concept'; +$string['taxonomy_selected_domain'] = 'Selected domain'; +$string['taxonomy_selected_indicator'] = 'Selected indicator'; +$string['taxonomy_selected_level'] = 'Selected level'; +$string['taxonomy_selected_outcome'] = 'Selected outcome'; +$string['taxonomy_selected_practice'] = 'Selected practice'; +$string['taxonomy_selected_proficiency'] = 'Selected proficiency'; +$string['taxonomy_selected_skill'] = 'Selected skill'; +$string['taxonomy_selected_value'] = 'Selected value'; $string['taxonomy_skill'] = 'Skill'; $string['taxonomy_value'] = 'Value'; $string['templatecompetencies'] = 'Template competencies'; diff --git a/admin/tool/lp/templates/manage_competencies_page.mustache b/admin/tool/lp/templates/manage_competencies_page.mustache index 4ede739d35b..2553b28c9a2 100644 --- a/admin/tool/lp/templates/manage_competencies_page.mustache +++ b/admin/tool/lp/templates/manage_competencies_page.mustache @@ -22,13 +22,15 @@ Data attibutes required for JS: * data-action=add * data-enhance=tree + * data-region=term + * data-region=selected-competency Context variables required for this template: * framework - * competencies - array of objects containing id, shortname, idnumber, sortorder, visible, parentid, competencyframeworkid, path * canmanage - true if this user has permission to manage the competencies }} -
+
@@ -51,13 +53,13 @@
-

{{#str}}selectedcompetency, tool_lp{{/str}}

+

{{#str}}selectedcompetency, tool_lp{{/str}}

{{#str}}nocompetencyselected, tool_lp{{/str}}

{{#canmanage}}
- +
  • @@ -113,7 +115,7 @@ require(['tool_lp/tree', 'tool_lp/competencytree', 'tool_lp/competencyactions' ] treeModel.init({{framework.id}}); - actions.init(treeModel, {{pagecontextid}}); + actions.init(treeModel, {{pagecontextid}}, {{{framework.taxonomies}}}); var competencytree = new ariatree('[data-enhance=tree]', actions.selectionChanged);