Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
{"version":3,"file":"competencyactions.min.js","sources":["../src/competencyactions.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Handle selection changes and actions on the competency tree.\n *\n * @module     tool_lp/competencyactions\n * @copyright  2015 Damyon Wiese <damyon@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n        'core/url',\n        'core/templates',\n        'core/notification',\n        'core/str',\n        'core/ajax',\n        'tool_lp/dragdrop-reorder',\n        'tool_lp/tree',\n        'tool_lp/dialogue',\n        'tool_lp/menubar',\n        'tool_lp/competencypicker',\n        'tool_lp/competency_outcomes',\n        'tool_lp/competencyruleconfig',\n        'core/pending',\n        ],\n       function(\n            $, url, templates, notification, str, ajax, dragdrop, Ariatree, Dialogue, menubar, Picker, Outcomes, RuleConfig, Pending\n        ) {\n\n    // Private variables and functions.\n    /** @var {Object} treeModel - This is an object representing the nodes in the tree. */\n    var treeModel = null;\n    /** @var {Node} moveSource - The start of a drag operation */\n    var moveSource = null;\n    /** @var {Node} moveTarget - The end of a drag operation */\n    var moveTarget = null;\n    /** @var {Number} pageContextId The page context ID. */\n    var pageContextId;\n    /** @var {Object} Picker instance. */\n    var pickerInstance;\n    /** @var {Object} Rule config instance. */\n    var ruleConfigInstance;\n    /** @var {Object} The competency we're picking a relation to. */\n    var relatedTarget;\n    /** @var {Object} Taxonomy constants indexed per level. */\n    var taxonomiesConstants;\n    /** @var {Array} The rules modules. Values are object containing type, namd and amd. */\n    var rulesModules;\n    /** @var {Number} the selected competency ID. */\n    var selectedCompetencyId = null;\n\n    /**\n     * Respond to choosing the \"Add\" menu item for the selected node in the tree.\n     * @method addHandler\n     */\n    var addHandler = function() {\n        var parent = $('[data-region=\"competencyactions\"]').data('competency');\n\n        var params = {\n            competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n            pagecontextid: pageContextId\n        };\n\n        if (parent !== null) {\n            // We are adding at a sub node.\n            params.parentid = parent.id;\n        }\n\n        var relocate = function() {\n            var queryparams = $.param(params);\n            window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n        };\n\n        if (parent !== null && treeModel.hasRule(parent.id)) {\n            str.get_strings([\n                {key: 'confirm', component: 'moodle'},\n                {key: 'addingcompetencywillresetparentrule', component: 'tool_lp', param: parent.shortname},\n                {key: 'yes', component: 'core'},\n                {key: 'no', component: 'core'}\n            ]).done(function(strings) {\n                notification.confirm(\n                    strings[0],\n                    strings[1],\n                    strings[2],\n                    strings[3],\n                    relocate\n                );\n            }).fail(notification.exception);\n        } else {\n            relocate();\n        }\n    };\n\n    /**\n     * A source and destination has been chosen - so time to complete a move.\n     * @method doMove\n     */\n    var doMove = function() {\n        var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n        var requests = ajax.call([{\n            methodname: 'core_competency_set_parent_competency',\n            args: {competencyid: moveSource, parentid: moveTarget}\n        }, {\n            methodname: 'tool_lp_data_for_competencies_manage_page',\n            args: {competencyframeworkid: frameworkid,\n                    search: $('[data-region=\"filtercompetencies\"] input').val()}\n        }]);\n        requests[1].done(reloadPage).fail(notification.exception);\n    };\n\n    /**\n     * Confirms a competency move.\n     *\n     * @method confirmMove\n     */\n    var confirmMove = function() {\n        moveTarget = typeof moveTarget === \"undefined\" ? 0 : moveTarget;\n        if (moveTarget == moveSource) {\n            // No move to do.\n            return;\n        }\n\n        var targetComp = treeModel.getCompetency(moveTarget) || {},\n            sourceComp = treeModel.getCompetency(moveSource) || {},\n            confirmMessage = 'movecompetencywillresetrules',\n            showConfirm = false;\n\n        // We shouldn't be moving the competency to the same parent.\n        if (sourceComp.parentid == moveTarget) {\n            return;\n        }\n\n        // If we are moving to a child of self.\n        if (targetComp.path && targetComp.path.indexOf('/' + sourceComp.id + '/') >= 0) {\n            confirmMessage = 'movecompetencytochildofselfwillresetrules';\n\n            // Show a confirmation if self has rules, as they'll disappear.\n            showConfirm = showConfirm || treeModel.hasRule(sourceComp.id);\n        }\n\n        // Show a confirmation if the current parent, or the destination have rules.\n        showConfirm = showConfirm || (treeModel.hasRule(targetComp.id) || treeModel.hasRule(sourceComp.parentid));\n\n        // Show confirm, and/or do the things.\n        if (showConfirm) {\n            str.get_strings([\n                {key: 'confirm', component: 'moodle'},\n                {key: confirmMessage, component: 'tool_lp'},\n                {key: 'yes', component: 'moodle'},\n                {key: 'no', component: 'moodle'}\n            ]).done(function(strings) {\n                notification.confirm(\n                    strings[0], // Confirm.\n                    strings[1], // Delete competency X?\n                    strings[2], // Delete.\n                    strings[3], // Cancel.\n                    doMove\n                );\n            }).fail(notification.exception);\n\n        } else {\n            doMove();\n        }\n    };\n\n    /**\n     * A move competency popup was opened - initialise the aria tree in it.\n     * @method initMovePopup\n     * @param {dialogue} popup The tool_lp/dialogue that was created.\n     */\n    var initMovePopup = function(popup) {\n        var body = $(popup.getContent());\n        var treeRoot = body.find('[data-enhance=movetree]');\n        var tree = new Ariatree(treeRoot, false);\n        tree.on('selectionchanged', function(evt, params) {\n            var target = params.selected;\n            moveTarget = $(target).data('id');\n        });\n        treeRoot.show();\n\n        body.on('click', '[data-action=\"move\"]', function() {\n          popup.close();\n          confirmMove();\n        });\n        body.on('click', '[data-action=\"cancel\"]', function() {\n          popup.close();\n        });\n    };\n\n    /**\n     * Turn a flat list of competencies into a tree structure (recursive).\n     * @method addCompetencyChildren\n     * @param {Object} parent The current parent node in the tree\n     * @param {Object[]} competencies The flat list of competencies\n     */\n    var addCompetencyChildren = function(parent, competencies) {\n        var i;\n\n        for (i = 0; i < competencies.length; i++) {\n            if (competencies[i].parentid == parent.id) {\n                parent.haschildren = true;\n                competencies[i].children = [];\n                competencies[i].haschildren = false;\n                parent.children[parent.children.length] = competencies[i];\n                addCompetencyChildren(competencies[i], competencies);\n            }\n        }\n    };\n\n    /**\n     * A node was chosen and \"Move\" was selected from the menu. Open a popup to select the target.\n     * @param {Event} e\n     * @method moveHandler\n     */\n    var moveHandler = function(e) {\n        e.preventDefault();\n        var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n        // Remember what we are moving.\n        moveSource = competency.id;\n\n        // Load data for the template.\n        var requests = ajax.call([\n            {\n                methodname: 'core_competency_search_competencies',\n                args: {\n                    competencyframeworkid: competency.competencyframeworkid,\n                    searchtext: ''\n                }\n            }, {\n                methodname: 'core_competency_read_competency_framework',\n                args: {\n                    id: competency.competencyframeworkid\n                }\n            }\n        ]);\n\n        // When all data has arrived, continue.\n        $.when.apply(null, requests).done(function(competencies, framework) {\n\n            // Expand the list of competencies into a tree.\n            var i;\n            var competenciestree = [];\n            for (i = 0; i < competencies.length; i++) {\n                var onecompetency = competencies[i];\n                if (onecompetency.parentid == \"0\") {\n                    onecompetency.children = [];\n                    onecompetency.haschildren = 0;\n                    competenciestree[competenciestree.length] = onecompetency;\n                    addCompetencyChildren(onecompetency, competencies);\n                }\n            }\n\n            str.get_strings([\n                {key: 'movecompetency', component: 'tool_lp', param: competency.shortname},\n                {key: 'move', component: 'tool_lp'},\n                {key: 'cancel', component: 'moodle'}\n            ]).done(function(strings) {\n\n                var context = {\n                    framework: framework,\n                    competencies: competenciestree\n                };\n\n                templates.render('tool_lp/competencies_move_tree', context)\n                   .done(function(tree) {\n                       new Dialogue(\n                           strings[0], // Move competency x.\n                           tree, // The move tree.\n                           initMovePopup\n                       );\n\n                   }).fail(notification.exception);\n\n           }).fail(notification.exception);\n\n        }).fail(notification.exception);\n\n    };\n\n    /**\n     * Edit the selected competency.\n     * @method editHandler\n     */\n    var editHandler = function() {\n        var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n        var params = {\n            competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n            id: competency.id,\n            parentid: competency.parentid,\n            pagecontextid: pageContextId\n        };\n\n        var queryparams = $.param(params);\n        window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n    };\n\n    /**\n     * Re-render the page with the latest data.\n     * @param {Object} context\n     * @method reloadPage\n     */\n    var reloadPage = function(context) {\n        templates.render('tool_lp/manage_competencies_page', context)\n            .done(function(newhtml, newjs) {\n                $('[data-region=\"managecompetencies\"]').replaceWith(newhtml);\n                templates.runTemplateJS(newjs);\n            })\n           .fail(notification.exception);\n    };\n\n    /**\n     * Perform a search and render the page with the new search results.\n     * @param {Event} e\n     * @method updateSearchHandler\n     */\n    var updateSearchHandler = function(e) {\n        e.preventDefault();\n\n        var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n\n        var requests = ajax.call([{\n            methodname: 'tool_lp_data_for_competencies_manage_page',\n            args: {competencyframeworkid: frameworkid,\n                    search: $('[data-region=\"filtercompetencies\"] input').val()}\n        }]);\n        requests[0].done(reloadPage).fail(notification.exception);\n    };\n\n    /**\n     * Move a competency \"up\". This only affects the sort order within the same branch of the tree.\n     * @method moveUpHandler\n     */\n    var moveUpHandler = function() {\n        // We are chaining ajax requests here.\n        var competency = $('[data-region=\"competencyactions\"]').data('competency');\n        var requests = ajax.call([{\n            methodname: 'core_competency_move_up_competency',\n            args: {id: competency.id}\n        }, {\n            methodname: 'tool_lp_data_for_competencies_manage_page',\n            args: {competencyframeworkid: competency.competencyframeworkid,\n                    search: $('[data-region=\"filtercompetencies\"] input').val()}\n        }]);\n        requests[1].done(reloadPage).fail(notification.exception);\n    };\n\n    /**\n     * Move a competency \"down\". This only affects the sort order within the same branch of the tree.\n     * @method moveDownHandler\n     */\n    var moveDownHandler = function() {\n        // We are chaining ajax requests here.\n        var competency = $('[data-region=\"competencyactions\"]').data('competency');\n        var requests = ajax.call([{\n            methodname: 'core_competency_move_down_competency',\n            args: {id: competency.id}\n        }, {\n            methodname: 'tool_lp_data_for_competencies_manage_page',\n            args: {competencyframeworkid: competency.competencyframeworkid,\n                    search: $('[data-region=\"filtercompetencies\"] input').val()}\n        }]);\n        requests[1].done(reloadPage).fail(notification.exception);\n    };\n\n    /**\n     * Open a dialogue to show all the courses using the selected competency.\n     * @method seeCoursesHandler\n     */\n    var seeCoursesHandler = function() {\n        var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n        var requests = ajax.call([{\n            methodname: 'tool_lp_list_courses_using_competency',\n            args: {id: competency.id}\n        }]);\n\n        requests[0].done(function(courses) {\n            var context = {\n                courses: courses\n            };\n            templates.render('tool_lp/linked_courses_summary', context).done(function(html) {\n                str.get_string('linkedcourses', 'tool_lp').done(function(linkedcourses) {\n                    new Dialogue(\n                        linkedcourses, // Title.\n                        html, // The linked courses.\n                        initMovePopup\n                    );\n                }).fail(notification.exception);\n            }).fail(notification.exception);\n        }).fail(notification.exception);\n    };\n\n    /**\n     * Open a competencies popup to relate competencies.\n     *\n     * @method relateCompetenciesHandler\n     */\n    var relateCompetenciesHandler = function() {\n        relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n\n        if (!pickerInstance) {\n            pickerInstance = new Picker(pageContextId, relatedTarget.competencyframeworkid);\n            pickerInstance.on('save', function(e, data) {\n                var pendingPromise = new Pending();\n                var compIds = data.competencyIds;\n\n                var calls = [];\n                $.each(compIds, function(index, value) {\n                    calls.push({\n                        methodname: 'core_competency_add_related_competency',\n                        args: {competencyid: value, relatedcompetencyid: relatedTarget.id}\n                    });\n                });\n\n                calls.push({\n                    methodname: 'tool_lp_data_for_related_competencies_section',\n                    args: {competencyid: relatedTarget.id}\n                });\n\n                var promises = ajax.call(calls);\n\n                promises[calls.length - 1].then(function(context) {\n                    return templates.render('tool_lp/related_competencies', context);\n                }).then(function(html, js) {\n                    $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n                    templates.runTemplateJS(js);\n                    updatedRelatedCompetencies();\n                    return;\n                })\n                .then(pendingPromise.resolve)\n                .catch(notification.exception);\n            });\n        }\n\n        pickerInstance.setDisallowedCompetencyIDs([relatedTarget.id]);\n        pickerInstance.display();\n    };\n\n    var ruleConfigHandler = function(e) {\n        e.preventDefault();\n        relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n        ruleConfigInstance.setTargetCompetencyId(relatedTarget.id);\n        ruleConfigInstance.display();\n    };\n\n    var ruleConfigSaveHandler = function(e, config) {\n        var update = {\n            id: relatedTarget.id,\n            shortname: relatedTarget.shortname,\n            idnumber: relatedTarget.idnumber,\n            description: relatedTarget.description,\n            descriptionformat: relatedTarget.descriptionformat,\n            ruletype: config.ruletype,\n            ruleoutcome: config.ruleoutcome,\n            ruleconfig: config.ruleconfig\n        };\n        var promise = ajax.call([{\n            methodname: 'core_competency_update_competency',\n            args: {competency: update}\n        }]);\n        promise[0].then(function(result) {\n            if (result) {\n                relatedTarget.ruletype = config.ruletype;\n                relatedTarget.ruleoutcome = config.ruleoutcome;\n                relatedTarget.ruleconfig = config.ruleconfig;\n                renderCompetencySummary(relatedTarget);\n            }\n            return;\n        }).catch(notification.exception);\n    };\n\n    /**\n     * Delete a competency.\n     * @method doDelete\n     */\n    var doDelete = function() {\n        // We are chaining ajax requests here.\n        var competency = $('[data-region=\"competencyactions\"]').data('competency');\n        var requests = ajax.call([{\n            methodname: 'core_competency_delete_competency',\n            args: {id: competency.id}\n        }, {\n            methodname: 'tool_lp_data_for_competencies_manage_page',\n            args: {competencyframeworkid: competency.competencyframeworkid,\n                    search: $('[data-region=\"filtercompetencies\"] input').val()}\n        }]);\n        requests[0].done(function(success) {\n            if (success === false) {\n                str.get_strings([\n                {key: 'competencycannotbedeleted', component: 'tool_lp', param: competency.shortname},\n                {key: 'cancel', component: 'moodle'}\n                ]).done(function(strings) {\n                    notification.alert(\n                        null,\n                        strings[0]\n                    );\n                }).fail(notification.exception);\n            }\n        }).fail(notification.exception);\n        requests[1].done(reloadPage).fail(notification.exception);\n    };\n\n    /**\n     * Show a confirm dialogue before deleting a competency.\n     * @method deleteCompetencyHandler\n     */\n    var deleteCompetencyHandler = function() {\n        var competency = $('[data-region=\"competencyactions\"]').data('competency'),\n            confirmMessage = 'deletecompetency';\n\n        if (treeModel.hasRule(competency.parentid)) {\n            confirmMessage = 'deletecompetencyparenthasrule';\n        }\n\n        str.get_strings([\n            {key: 'confirm', component: 'moodle'},\n            {key: confirmMessage, component: 'tool_lp', param: competency.shortname},\n            {key: 'delete', component: 'moodle'},\n            {key: 'cancel', component: 'moodle'}\n        ]).done(function(strings) {\n            notification.confirm(\n                strings[0], // Confirm.\n                strings[1], // Delete competency X?\n                strings[2], // Delete.\n                strings[3], // Cancel.\n                doDelete\n            );\n        }).fail(notification.exception);\n    };\n\n    /**\n     * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n     * @method dragStart\n     * @param {Event} e\n     */\n    var dragStart = function(e) {\n        e.originalEvent.dataTransfer.setData('text', $(e.target).parent().data('id'));\n    };\n\n    /**\n     * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n     * @method allowDrop\n     * @param {Event} e\n     */\n    var allowDrop = function(e) {\n        e.originalEvent.dataTransfer.dropEffect = 'move';\n        e.preventDefault();\n    };\n\n    /**\n     * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n     * @method dragEnter\n     * @param {Event} e\n     */\n    var dragEnter = function(e) {\n        e.preventDefault();\n        $(this).addClass('currentdragtarget');\n    };\n\n    /**\n     * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n     * @method dragLeave\n     * @param {Event} e\n     */\n    var dragLeave = function(e) {\n        e.preventDefault();\n        $(this).removeClass('currentdragtarget');\n    };\n\n    /**\n     * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n     * @method dropOver\n     * @param {Event} e\n     */\n    var dropOver = function(e) {\n        e.preventDefault();\n        moveSource = e.originalEvent.dataTransfer.getData('text');\n        moveTarget = $(e.target).parent().data('id');\n        $(this).removeClass('currentdragtarget');\n\n        confirmMove();\n    };\n\n    /**\n     * Deletes a related competency without confirmation.\n     *\n     * @param {Event} e The event that triggered the action.\n     * @method deleteRelatedHandler\n     */\n    var deleteRelatedHandler = function(e) {\n        e.preventDefault();\n\n        var relatedid = this.id.substr(11);\n        var competency = $('[data-region=\"competencyactions\"]').data('competency');\n        var removeRelated = ajax.call([\n            {methodname: 'core_competency_remove_related_competency',\n              args: {relatedcompetencyid: relatedid, competencyid: competency.id}},\n            {methodname: 'tool_lp_data_for_related_competencies_section',\n              args: {competencyid: competency.id}}\n        ]);\n\n        removeRelated[1].done(function(context) {\n            templates.render('tool_lp/related_competencies', context).done(function(html) {\n                $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n                updatedRelatedCompetencies();\n            }).fail(notification.exception);\n        }).fail(notification.exception);\n    };\n\n    /**\n     * Updates the competencies list (with relations) and add listeners.\n     *\n     * @method updatedRelatedCompetencies\n     */\n    var updatedRelatedCompetencies = function() {\n\n        // Listeners to newly loaded related competencies.\n        $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n\n    };\n\n    /**\n     * Log the competency viewed event.\n     *\n     * @param  {Object} competency The competency.\n     * @method triggerCompetencyViewedEvent\n     */\n    var triggerCompetencyViewedEvent = function(competency) {\n        if (competency.id !== selectedCompetencyId) {\n            // Set the selected competency id.\n            selectedCompetencyId = competency.id;\n            ajax.call([{\n                    methodname: 'core_competency_competency_viewed',\n                    args: {id: competency.id}\n            }]);\n        }\n    };\n\n    /**\n     * Return the taxonomy constant for a level.\n     *\n     * @param  {Number} level The level.\n     * @return {String}\n     * @function getTaxonomyAtLevel\n     */\n    var getTaxonomyAtLevel = function(level) {\n        var constant = taxonomiesConstants[level];\n        if (!constant) {\n            constant = 'competency';\n        }\n        return constant;\n    };\n\n    /**\n     * Render the competency summary.\n     *\n     * @param  {Object} competency The competency.\n     */\n    var renderCompetencySummary = function(competency) {\n        var promise = $.Deferred().resolve().promise(),\n            context = {};\n\n        context.competency = competency;\n        context.showdeleterelatedaction = true;\n        context.showrelatedcompetencies = true;\n        context.showrule = false;\n        context.pluginbaseurl = url.relativeUrl('/admin/tool/lp');\n\n        if (competency.ruleoutcome != Outcomes.NONE) {\n            // Get the outcome and rule name.\n            promise = Outcomes.getString(competency.ruleoutcome).then(function(str) {\n                var name;\n                $.each(rulesModules, function(index, modInfo) {\n                    if (modInfo.type == competency.ruletype) {\n                        name = modInfo.name;\n                    }\n                });\n                return [str, name];\n            });\n        }\n\n        promise.then(function(strs) {\n            if (typeof strs !== 'undefined') {\n                context.showrule = true;\n                context.rule = {\n                    outcome: strs[0],\n                    type: strs[1]\n                };\n            }\n            return context;\n        }).then(function(context) {\n            return templates.render('tool_lp/competency_summary', context);\n        }).then(function(html) {\n            $('[data-region=\"competencyinfo\"]').html(html);\n            $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n            return templates.render('tool_lp/loading', {});\n        }).then(function(html, js) {\n            templates.replaceNodeContents('[data-region=\"relatedcompetencies\"]', html, js);\n            return ajax.call([{\n                methodname: 'tool_lp_data_for_related_competencies_section',\n                args: {competencyid: competency.id}\n            }])[0];\n        }).then(function(context) {\n            return templates.render('tool_lp/related_competencies', context);\n        }).then(function(html, js) {\n            $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n            templates.runTemplateJS(js);\n            updatedRelatedCompetencies();\n            return;\n        }).catch(notification.exception);\n    };\n\n    /**\n     * Return the string \"Add <taxonomy>\".\n     *\n     * @param  {Number} level The level.\n     * @return {String}\n     * @function strAddTaxonomy\n     */\n    var strAddTaxonomy = function(level) {\n        return str.get_string('taxonomy_add_' + getTaxonomyAtLevel(level), 'tool_lp');\n    };\n\n    /**\n     * Return the string \"Selected <taxonomy>\".\n     *\n     * @param  {Number} level The level.\n     * @return {String}\n     * @function strSelectedTaxonomy\n     */\n    var strSelectedTaxonomy = function(level) {\n        return str.get_string('taxonomy_selected_' + getTaxonomyAtLevel(level), 'tool_lp');\n    };\n\n    /**\n     * Handler when a node in the aria tree is selected.\n     * @method selectionChanged\n     * @param {Event} evt The event that triggered the selection change.\n     * @param {Object} params The parameters for the event. Contains a list of selected nodes.\n     * @return {Boolean}\n     */\n    var selectionChanged = function(evt, params) {\n        var node = params.selected,\n            id = $(node).data('id'),\n            btn = $('[data-region=\"competencyactions\"] [data-action=\"add\"]'),\n            actionMenu = $('[data-region=\"competencyactionsmenu\"]'),\n            selectedTitle = $('[data-region=\"selected-competency\"]'),\n            level = 0,\n            sublevel = 1;\n\n        menubar.closeAll();\n\n        if (typeof id === \"undefined\") {\n            // Assume this is the root of the tree.\n            // Here we are only getting the text from the top of the tree, to do it we clone the tree,\n            // remove all children and then call text on the result.\n            $('[data-region=\"competencyinfo\"]').html(node.clone().children().remove().end().text());\n            $('[data-region=\"competencyactions\"]').data('competency', null);\n            actionMenu.hide();\n\n        } else {\n            var competency = treeModel.getCompetency(id);\n\n            level = treeModel.getCompetencyLevel(id);\n            sublevel = level + 1;\n\n            actionMenu.show();\n            $('[data-region=\"competencyactions\"]').data('competency', competency);\n            renderCompetencySummary(competency);\n            // Log Competency viewed event.\n            triggerCompetencyViewedEvent(competency);\n        }\n        strSelectedTaxonomy(level).then(function(str) {\n            selectedTitle.text(str);\n            return;\n        }).catch(notification.exception);\n\n        strAddTaxonomy(sublevel).then(function(str) {\n            btn.show()\n                .find('[data-region=\"term\"]')\n                .text(str);\n            return;\n        }).catch(notification.exception);\n\n        // We handled this event so consume it.\n        evt.preventDefault();\n        return false;\n    };\n\n    /**\n     * Return the string \"Selected <taxonomy>\".\n     *\n     * @function parseTaxonomies\n     * @param  {String} taxonomiesstr Comma separated list of taxonomies.\n     * @return {Array} of level => taxonomystr\n     */\n    var parseTaxonomies = function(taxonomiesstr) {\n        var all = taxonomiesstr.split(',');\n        all.unshift(\"\");\n        delete all[0];\n\n        // Note we don't need to fill holes, because other functions check for empty anyway.\n        return all;\n    };\n\n    return {\n        /**\n         * Initialise this page (attach event handlers etc).\n         *\n         * @method init\n         * @param {Object} model The tree model provides some useful functions for loading and searching competencies.\n         * @param {Number} pagectxid The page context ID.\n         * @param {Object} taxonomies Constants indexed by level.\n         * @param {Object} rulesMods The modules of the rules.\n         */\n        init: function(model, pagectxid, taxonomies, rulesMods) {\n            treeModel = model;\n            pageContextId = pagectxid;\n            taxonomiesConstants = parseTaxonomies(taxonomies);\n            rulesModules = rulesMods;\n\n            $('[data-region=\"competencyactions\"] [data-action=\"add\"]').on('click', addHandler);\n\n            menubar.enhance('.competencyactionsmenu', {\n                '[data-action=\"edit\"]': editHandler,\n                '[data-action=\"delete\"]': deleteCompetencyHandler,\n                '[data-action=\"move\"]': moveHandler,\n                '[data-action=\"moveup\"]': moveUpHandler,\n                '[data-action=\"movedown\"]': moveDownHandler,\n                '[data-action=\"linkedcourses\"]': seeCoursesHandler,\n                '[data-action=\"relatedcompetencies\"]': relateCompetenciesHandler.bind(this),\n                '[data-action=\"competencyrules\"]': ruleConfigHandler.bind(this)\n            });\n            $('[data-region=\"competencyactionsmenu\"]').hide();\n            $('[data-region=\"competencyactions\"] [data-action=\"add\"]').hide();\n\n            $('[data-region=\"filtercompetencies\"]').on('submit', updateSearchHandler);\n            // Simple html5 drag drop because we already added an accessible alternative.\n            var top = $('[data-region=\"managecompetencies\"] [data-enhance=\"tree\"]');\n            top.on('dragstart', 'li>span', dragStart)\n                .on('dragover', 'li>span', allowDrop)\n                .on('dragenter', 'li>span', dragEnter)\n                .on('dragleave', 'li>span', dragLeave)\n                .on('drop', 'li>span', dropOver);\n\n            model.on('selectionchanged', selectionChanged);\n\n            // Prepare the configuration tool.\n            ruleConfigInstance = new RuleConfig(treeModel, rulesModules);\n            ruleConfigInstance.on('save', ruleConfigSaveHandler.bind(this));\n        }\n    };\n});\n"],"names":["define","$","url","templates","notification","str","ajax","dragdrop","Ariatree","Dialogue","menubar","Picker","Outcomes","RuleConfig","Pending","pageContextId","pickerInstance","ruleConfigInstance","relatedTarget","taxonomiesConstants","rulesModules","treeModel","moveSource","moveTarget","selectedCompetencyId","addHandler","parent","data","params","competencyframeworkid","getCompetencyFrameworkId","pagecontextid","parentid","id","relocate","queryparams","param","window","location","relativeUrl","hasRule","get_strings","key","component","shortname","done","strings","confirm","fail","exception","doMove","frameworkid","call","methodname","args","competencyid","search","val","reloadPage","confirmMove","targetComp","getCompetency","sourceComp","confirmMessage","showConfirm","path","indexOf","initMovePopup","popup","body","getContent","treeRoot","find","on","evt","target","selected","show","close","addCompetencyChildren","competencies","i","length","haschildren","children","moveHandler","e","preventDefault","competency","requests","searchtext","when","apply","framework","competenciestree","onecompetency","context","render","tree","editHandler","newhtml","newjs","replaceWith","runTemplateJS","updateSearchHandler","moveUpHandler","moveDownHandler","seeCoursesHandler","courses","html","get_string","linkedcourses","relateCompetenciesHandler","pendingPromise","compIds","competencyIds","calls","each","index","value","push","relatedcompetencyid","then","js","updatedRelatedCompetencies","resolve","catch","setDisallowedCompetencyIDs","display","ruleConfigHandler","setTargetCompetencyId","ruleConfigSaveHandler","config","update","idnumber","description","descriptionformat","ruletype","ruleoutcome","ruleconfig","result","renderCompetencySummary","doDelete","success","alert","deleteCompetencyHandler","dragStart","originalEvent","dataTransfer","setData","allowDrop","dropEffect","dragEnter","this","addClass","dragLeave","removeClass","dropOver","getData","deleteRelatedHandler","relatedid","substr","getTaxonomyAtLevel","level","constant","promise","Deferred","showdeleterelatedaction","showrelatedcompetencies","showrule","pluginbaseurl","NONE","getString","name","modInfo","type","strs","rule","outcome","replaceNodeContents","selectionChanged","node","btn","actionMenu","selectedTitle","sublevel","closeAll","clone","remove","end","text","hide","getCompetencyLevel","triggerCompetencyViewedEvent","strSelectedTaxonomy","strAddTaxonomy","init","model","pagectxid","taxonomies","rulesMods","all","split","unshift","enhance","bind"],"mappings":"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"}