| 1 | efrain | 1 | // This file is part of Moodle - http://moodle.org/
 | 
        
           |  |  | 2 | //
 | 
        
           |  |  | 3 | // Moodle is free software: you can redistribute it and/or modify
 | 
        
           |  |  | 4 | // it under the terms of the GNU General Public License as published by
 | 
        
           |  |  | 5 | // the Free Software Foundation, either version 3 of the License, or
 | 
        
           |  |  | 6 | // (at your option) any later version.
 | 
        
           |  |  | 7 | //
 | 
        
           |  |  | 8 | // Moodle is distributed in the hope that it will be useful,
 | 
        
           |  |  | 9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
        
           |  |  | 10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
        
           |  |  | 11 | // GNU General Public License for more details.
 | 
        
           |  |  | 12 | //
 | 
        
           |  |  | 13 | // You should have received a copy of the GNU General Public License
 | 
        
           |  |  | 14 | // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 | 
        
           |  |  | 15 |   | 
        
           |  |  | 16 | /**
 | 
        
           |  |  | 17 |  * User evidence actions.
 | 
        
           |  |  | 18 |  *
 | 
        
           |  |  | 19 |  * @module     tool_lp/user_evidence_actions
 | 
        
           |  |  | 20 |  * @copyright  2015 Frédéric Massart - FMCorz.net
 | 
        
           |  |  | 21 |  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | 
        
           |  |  | 22 |  */
 | 
        
           |  |  | 23 | define(['jquery',
 | 
        
           |  |  | 24 |         'core/templates',
 | 
        
           |  |  | 25 |         'core/ajax',
 | 
        
           |  |  | 26 |         'core/notification',
 | 
        
           |  |  | 27 |         'core/str',
 | 
        
           |  |  | 28 |         'tool_lp/menubar',
 | 
        
           |  |  | 29 |         'tool_lp/competencypicker_user_plans'],
 | 
        
           |  |  | 30 |         function($, templates, ajax, notification, str, Menubar, PickerUserPlans) {
 | 
        
           |  |  | 31 |   | 
        
           |  |  | 32 |     /**
 | 
        
           |  |  | 33 |      * UserEvidenceActions class.
 | 
        
           |  |  | 34 |      *
 | 
        
           |  |  | 35 |      * Note that presently this cannot be instantiated more than once per page.
 | 
        
           |  |  | 36 |      *
 | 
        
           |  |  | 37 |      * @param {String} type The type of page we're in.
 | 
        
           |  |  | 38 |      */
 | 
        
           |  |  | 39 |     var UserEvidenceActions = function(type) {
 | 
        
           |  |  | 40 |         this._type = type;
 | 
        
           |  |  | 41 |   | 
        
           |  |  | 42 |         if (type === 'evidence') {
 | 
        
           |  |  | 43 |             // This is the page to view one evidence.
 | 
        
           |  |  | 44 |             this._region = '[data-region="user-evidence-page"]';
 | 
        
           |  |  | 45 |             this._evidenceNode = '[data-region="user-evidence-page"]';
 | 
        
           |  |  | 46 |             this._template = 'tool_lp/user_evidence_page';
 | 
        
           |  |  | 47 |             this._contextMethod = 'tool_lp_data_for_user_evidence_page';
 | 
        
           |  |  | 48 |   | 
        
           |  |  | 49 |         } else if (type === 'list') {
 | 
        
           |  |  | 50 |             // This is the page to view a list of evidence.
 | 
        
           |  |  | 51 |             this._region = '[data-region="user-evidence-list"]';
 | 
        
           |  |  | 52 |             this._evidenceNode = '[data-region="user-evidence-node"]';
 | 
        
           |  |  | 53 |             this._template = 'tool_lp/user_evidence_list_page';
 | 
        
           |  |  | 54 |             this._contextMethod = 'tool_lp_data_for_user_evidence_list_page';
 | 
        
           |  |  | 55 |   | 
        
           |  |  | 56 |         } else {
 | 
        
           |  |  | 57 |             throw new TypeError('Unexpected type.');
 | 
        
           |  |  | 58 |         }
 | 
        
           |  |  | 59 |     };
 | 
        
           |  |  | 60 |   | 
        
           |  |  | 61 |     /** @property {String} Ajax method to fetch the page data from. */
 | 
        
           |  |  | 62 |     UserEvidenceActions.prototype._contextMethod = null;
 | 
        
           |  |  | 63 |     /** @property {String} Selector to find the node describing the evidence. */
 | 
        
           |  |  | 64 |     UserEvidenceActions.prototype._evidenceNode = null;
 | 
        
           |  |  | 65 |     /** @property {String} Selector mapping to the region to update. Usually similar to wrapper. */
 | 
        
           |  |  | 66 |     UserEvidenceActions.prototype._region = null;
 | 
        
           |  |  | 67 |     /** @property {String} Name of the template used to render the region. */
 | 
        
           |  |  | 68 |     UserEvidenceActions.prototype._template = null;
 | 
        
           |  |  | 69 |     /** @property {String} Type of page/region we're in. */
 | 
        
           |  |  | 70 |     UserEvidenceActions.prototype._type = null;
 | 
        
           |  |  | 71 |   | 
        
           |  |  | 72 |     /**
 | 
        
           |  |  | 73 |      * Resolve the arguments to refresh the region.
 | 
        
           |  |  | 74 |      *
 | 
        
           |  |  | 75 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 76 |      * @return {Object} List of arguments.
 | 
        
           |  |  | 77 |      */
 | 
        
           |  |  | 78 |     UserEvidenceActions.prototype._getContextArgs = function(evidenceData) {
 | 
        
           |  |  | 79 |         var self = this,
 | 
        
           |  |  | 80 |             args = {};
 | 
        
           |  |  | 81 |   | 
        
           |  |  | 82 |         if (self._type === 'evidence') {
 | 
        
           |  |  | 83 |             args = {
 | 
        
           |  |  | 84 |                 id: evidenceData.id
 | 
        
           |  |  | 85 |             };
 | 
        
           |  |  | 86 |   | 
        
           |  |  | 87 |         } else if (self._type === 'list') {
 | 
        
           |  |  | 88 |             args = {
 | 
        
           |  |  | 89 |                 userid: evidenceData.userid
 | 
        
           |  |  | 90 |             };
 | 
        
           |  |  | 91 |         }
 | 
        
           |  |  | 92 |   | 
        
           |  |  | 93 |         return args;
 | 
        
           |  |  | 94 |     };
 | 
        
           |  |  | 95 |   | 
        
           |  |  | 96 |     /**
 | 
        
           |  |  | 97 |      * Callback to render the region template.
 | 
        
           |  |  | 98 |      *
 | 
        
           |  |  | 99 |      * @param {Object} context The context for the template.
 | 
        
           |  |  | 100 |      * @return {Promise}
 | 
        
           |  |  | 101 |      */
 | 
        
           |  |  | 102 |     UserEvidenceActions.prototype._renderView = function(context) {
 | 
        
           |  |  | 103 |         var self = this;
 | 
        
           |  |  | 104 |         return templates.render(self._template, context)
 | 
        
           |  |  | 105 |             .then(function(newhtml, newjs) {
 | 
        
           |  |  | 106 |                 templates.replaceNode($(self._region), newhtml, newjs);
 | 
        
           |  |  | 107 |                 return;
 | 
        
           |  |  | 108 |             });
 | 
        
           |  |  | 109 |     };
 | 
        
           |  |  | 110 |   | 
        
           |  |  | 111 |     /**
 | 
        
           |  |  | 112 |      * Call multiple ajax methods, and refresh.
 | 
        
           |  |  | 113 |      *
 | 
        
           |  |  | 114 |      * @param  {Array}  calls    List of Ajax calls.
 | 
        
           |  |  | 115 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 116 |      * @return {Promise}
 | 
        
           |  |  | 117 |      */
 | 
        
           |  |  | 118 |     UserEvidenceActions.prototype._callAndRefresh = function(calls, evidenceData) {
 | 
        
           |  |  | 119 |         var self = this;
 | 
        
           |  |  | 120 |         calls.push({
 | 
        
           |  |  | 121 |             methodname: self._contextMethod,
 | 
        
           |  |  | 122 |             args: self._getContextArgs(evidenceData)
 | 
        
           |  |  | 123 |         });
 | 
        
           |  |  | 124 |   | 
        
           |  |  | 125 |         // Apply all the promises, and refresh when the last one is resolved.
 | 
        
           |  |  | 126 |         return $.when.apply($.when, ajax.call(calls))
 | 
        
           |  |  | 127 |             .then(function() {
 | 
        
           |  |  | 128 |                 return self._renderView(arguments[arguments.length - 1]);
 | 
        
           |  |  | 129 |             })
 | 
        
           |  |  | 130 |             .fail(notification.exception);
 | 
        
           |  |  | 131 |     };
 | 
        
           |  |  | 132 |   | 
        
           |  |  | 133 |     /**
 | 
        
           |  |  | 134 |      * Delete a plan and reload the region.
 | 
        
           |  |  | 135 |      *
 | 
        
           |  |  | 136 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 137 |      */
 | 
        
           |  |  | 138 |     UserEvidenceActions.prototype._doDelete = function(evidenceData) {
 | 
        
           |  |  | 139 |         var self = this,
 | 
        
           |  |  | 140 |             calls = [{
 | 
        
           |  |  | 141 |                 methodname: 'core_competency_delete_user_evidence',
 | 
        
           |  |  | 142 |                 args: {id: evidenceData.id}
 | 
        
           |  |  | 143 |             }];
 | 
        
           |  |  | 144 |         self._callAndRefresh(calls, evidenceData);
 | 
        
           |  |  | 145 |     };
 | 
        
           |  |  | 146 |   | 
        
           |  |  | 147 |     /**
 | 
        
           |  |  | 148 |      * Delete a plan.
 | 
        
           |  |  | 149 |      *
 | 
        
           |  |  | 150 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 151 |      */
 | 
        
           |  |  | 152 |     UserEvidenceActions.prototype.deleteEvidence = function(evidenceData) {
 | 
        
           |  |  | 153 |         var self = this,
 | 
        
           |  |  | 154 |             requests;
 | 
        
           |  |  | 155 |   | 
        
           |  |  | 156 |         requests = ajax.call([{
 | 
        
           |  |  | 157 |             methodname: 'core_competency_read_user_evidence',
 | 
        
           |  |  | 158 |             args: {id: evidenceData.id}
 | 
        
           |  |  | 159 |         }]);
 | 
        
           |  |  | 160 |   | 
        
           |  |  | 161 |         requests[0].done(function(evidence) {
 | 
        
           |  |  | 162 |             str.get_strings([
 | 
        
           |  |  | 163 |                 {key: 'confirm', component: 'moodle'},
 | 
        
           |  |  | 164 |                 {key: 'deleteuserevidence', component: 'tool_lp', param: evidence.name},
 | 
        
           |  |  | 165 |                 {key: 'delete', component: 'moodle'},
 | 
        
           |  |  | 166 |                 {key: 'cancel', component: 'moodle'}
 | 
        
           |  |  | 167 |             ]).done(function(strings) {
 | 
        
           |  |  | 168 |                 notification.confirm(
 | 
        
           |  |  | 169 |                     strings[0], // Confirm.
 | 
        
           |  |  | 170 |                     strings[1], // Delete evidence X?
 | 
        
           |  |  | 171 |                     strings[2], // Delete.
 | 
        
           |  |  | 172 |                     strings[3], // Cancel.
 | 
        
           |  |  | 173 |                     function() {
 | 
        
           |  |  | 174 |                         self._doDelete(evidenceData);
 | 
        
           |  |  | 175 |                     }
 | 
        
           |  |  | 176 |                 );
 | 
        
           |  |  | 177 |             }).fail(notification.exception);
 | 
        
           |  |  | 178 |         }).fail(notification.exception);
 | 
        
           |  |  | 179 |   | 
        
           |  |  | 180 |     };
 | 
        
           |  |  | 181 |   | 
        
           |  |  | 182 |     /**
 | 
        
           |  |  | 183 |      * Delete evidence handler.
 | 
        
           |  |  | 184 |      *
 | 
        
           |  |  | 185 |      * @param  {Event} e The event.
 | 
        
           |  |  | 186 |      */
 | 
        
           |  |  | 187 |     UserEvidenceActions.prototype._deleteEvidenceHandler = function(e) {
 | 
        
           |  |  | 188 |         e.preventDefault();
 | 
        
           |  |  | 189 |         var data = this._findEvidenceData($(e.target));
 | 
        
           |  |  | 190 |         this.deleteEvidence(data);
 | 
        
           |  |  | 191 |     };
 | 
        
           |  |  | 192 |   | 
        
           |  |  | 193 |     /**
 | 
        
           |  |  | 194 |      * Link a competency and reload.
 | 
        
           |  |  | 195 |      *
 | 
        
           |  |  | 196 |      * @param {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 197 |      * @param {Number} competencyIds The competency IDs.
 | 
        
           |  |  | 198 |      */
 | 
        
           |  |  | 199 |     UserEvidenceActions.prototype._doCreateUserEvidenceCompetency = function(evidenceData, competencyIds) {
 | 
        
           |  |  | 200 |         var self = this,
 | 
        
           |  |  | 201 |             calls = [];
 | 
        
           |  |  | 202 |   | 
        
           |  |  | 203 |         $.each(competencyIds, function(index, competencyId) {
 | 
        
           |  |  | 204 |             calls.push({
 | 
        
           |  |  | 205 |                 methodname: 'core_competency_create_user_evidence_competency',
 | 
        
           |  |  | 206 |                 args: {
 | 
        
           |  |  | 207 |                     userevidenceid: evidenceData.id,
 | 
        
           |  |  | 208 |                     competencyid: competencyId,
 | 
        
           |  |  | 209 |                 }
 | 
        
           |  |  | 210 |             });
 | 
        
           |  |  | 211 |         });
 | 
        
           |  |  | 212 |   | 
        
           |  |  | 213 |         self._callAndRefresh(calls, evidenceData);
 | 
        
           |  |  | 214 |     };
 | 
        
           |  |  | 215 |   | 
        
           |  |  | 216 |     /**
 | 
        
           |  |  | 217 |      * Create a user evidence competency.
 | 
        
           |  |  | 218 |      *
 | 
        
           |  |  | 219 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 220 |      */
 | 
        
           |  |  | 221 |     UserEvidenceActions.prototype.createUserEvidenceCompetency = function(evidenceData) {
 | 
        
           |  |  | 222 |         var self = this,
 | 
        
           |  |  | 223 |             picker = new PickerUserPlans(evidenceData.userid);
 | 
        
           |  |  | 224 |   | 
        
           |  |  | 225 |         picker.on('save', function(e, data) {
 | 
        
           |  |  | 226 |             var competencyIds = data.competencyIds;
 | 
        
           |  |  | 227 |             self._doCreateUserEvidenceCompetency(evidenceData, competencyIds, data.requestReview);
 | 
        
           |  |  | 228 |         });
 | 
        
           |  |  | 229 |   | 
        
           |  |  | 230 |         picker.display();
 | 
        
           |  |  | 231 |     };
 | 
        
           |  |  | 232 |   | 
        
           |  |  | 233 |     /**
 | 
        
           |  |  | 234 |      * Create user evidence competency handler.
 | 
        
           |  |  | 235 |      *
 | 
        
           |  |  | 236 |      * @param  {Event} e The event.
 | 
        
           |  |  | 237 |      */
 | 
        
           |  |  | 238 |     UserEvidenceActions.prototype._createUserEvidenceCompetencyHandler = function(e) {
 | 
        
           |  |  | 239 |         e.preventDefault();
 | 
        
           |  |  | 240 |         var data = this._findEvidenceData($(e.target));
 | 
        
           |  |  | 241 |         this.createUserEvidenceCompetency(data);
 | 
        
           |  |  | 242 |     };
 | 
        
           |  |  | 243 |   | 
        
           |  |  | 244 |     /**
 | 
        
           |  |  | 245 |      * Remove a linked competency and reload.
 | 
        
           |  |  | 246 |      *
 | 
        
           |  |  | 247 |      * @param {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 248 |      * @param {Number} competencyId The competency ID.
 | 
        
           |  |  | 249 |      */
 | 
        
           |  |  | 250 |     UserEvidenceActions.prototype._doDeleteUserEvidenceCompetency = function(evidenceData, competencyId) {
 | 
        
           |  |  | 251 |         var self = this,
 | 
        
           |  |  | 252 |             calls = [];
 | 
        
           |  |  | 253 |   | 
        
           |  |  | 254 |         calls.push({
 | 
        
           |  |  | 255 |             methodname: 'core_competency_delete_user_evidence_competency',
 | 
        
           |  |  | 256 |             args: {
 | 
        
           |  |  | 257 |                 userevidenceid: evidenceData.id,
 | 
        
           |  |  | 258 |                 competencyid: competencyId,
 | 
        
           |  |  | 259 |             }
 | 
        
           |  |  | 260 |         });
 | 
        
           |  |  | 261 |   | 
        
           |  |  | 262 |         self._callAndRefresh(calls, evidenceData);
 | 
        
           |  |  | 263 |     };
 | 
        
           |  |  | 264 |   | 
        
           |  |  | 265 |     /**
 | 
        
           |  |  | 266 |      * Delete a user evidence competency.
 | 
        
           |  |  | 267 |      *
 | 
        
           |  |  | 268 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 269 |      * @param  {Number} competencyId The competency ID.
 | 
        
           |  |  | 270 |      */
 | 
        
           |  |  | 271 |     UserEvidenceActions.prototype.deleteUserEvidenceCompetency = function(evidenceData, competencyId) {
 | 
        
           |  |  | 272 |         this._doDeleteUserEvidenceCompetency(evidenceData, competencyId);
 | 
        
           |  |  | 273 |     };
 | 
        
           |  |  | 274 |   | 
        
           |  |  | 275 |     /**
 | 
        
           |  |  | 276 |      * Delete user evidence competency handler.
 | 
        
           |  |  | 277 |      *
 | 
        
           |  |  | 278 |      * @param  {Event} e The event.
 | 
        
           |  |  | 279 |      */
 | 
        
           |  |  | 280 |     UserEvidenceActions.prototype._deleteUserEvidenceCompetencyHandler = function(e) {
 | 
        
           |  |  | 281 |         var data = this._findEvidenceData($(e.currentTarget)),
 | 
        
           |  |  | 282 |             competencyId = $(e.currentTarget).data('id');
 | 
        
           |  |  | 283 |         e.preventDefault();
 | 
        
           |  |  | 284 |         this.deleteUserEvidenceCompetency(data, competencyId);
 | 
        
           |  |  | 285 |     };
 | 
        
           |  |  | 286 |   | 
        
           |  |  | 287 |     /**
 | 
        
           |  |  | 288 |      * Send request review for user evidence competencies and reload the region.
 | 
        
           |  |  | 289 |      *
 | 
        
           |  |  | 290 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 291 |      */
 | 
        
           |  |  | 292 |     UserEvidenceActions.prototype._doReviewUserEvidenceCompetencies = function(evidenceData) {
 | 
        
           |  |  | 293 |         var self = this,
 | 
        
           |  |  | 294 |             calls = [{
 | 
        
           |  |  | 295 |                 methodname: 'core_competency_request_review_of_user_evidence_linked_competencies',
 | 
        
           |  |  | 296 |                 args: {id: evidenceData.id}
 | 
        
           |  |  | 297 |             }];
 | 
        
           |  |  | 298 |         self._callAndRefresh(calls, evidenceData);
 | 
        
           |  |  | 299 |     };
 | 
        
           |  |  | 300 |   | 
        
           |  |  | 301 |     /**
 | 
        
           |  |  | 302 |      * Send request review for user evidence competencies.
 | 
        
           |  |  | 303 |      *
 | 
        
           |  |  | 304 |      * @param  {Object} evidenceData Evidence data from evidence node.
 | 
        
           |  |  | 305 |      */
 | 
        
           |  |  | 306 |     UserEvidenceActions.prototype.reviewUserEvidenceCompetencies = function(evidenceData) {
 | 
        
           |  |  | 307 |         var self = this,
 | 
        
           |  |  | 308 |             requests;
 | 
        
           |  |  | 309 |   | 
        
           |  |  | 310 |         requests = ajax.call([{
 | 
        
           |  |  | 311 |             methodname: 'core_competency_read_user_evidence',
 | 
        
           |  |  | 312 |             args: {id: evidenceData.id}
 | 
        
           |  |  | 313 |         }]);
 | 
        
           |  |  | 314 |   | 
        
           |  |  | 315 |         requests[0].done(function(evidence) {
 | 
        
           |  |  | 316 |             str.get_strings([
 | 
        
           |  |  | 317 |                 {key: 'confirm', component: 'moodle'},
 | 
        
           |  |  | 318 |                 {key: 'sendallcompetenciestoreview', component: 'tool_lp', param: evidence.name},
 | 
        
           |  |  | 319 |                 {key: 'confirm', component: 'moodle'},
 | 
        
           |  |  | 320 |                 {key: 'cancel', component: 'moodle'}
 | 
        
           |  |  | 321 |             ]).done(function(strings) {
 | 
        
           |  |  | 322 |                 notification.confirm(
 | 
        
           |  |  | 323 |                     strings[0], // Confirm.
 | 
        
           |  |  | 324 |                     strings[1], // Send all competencies in review for X?
 | 
        
           |  |  | 325 |                     strings[2], // Confirm.
 | 
        
           |  |  | 326 |                     strings[3], // Cancel.
 | 
        
           |  |  | 327 |                     function() {
 | 
        
           |  |  | 328 |                         self._doReviewUserEvidenceCompetencies(evidenceData);
 | 
        
           |  |  | 329 |                     }
 | 
        
           |  |  | 330 |                 );
 | 
        
           |  |  | 331 |             }).fail(notification.exception);
 | 
        
           |  |  | 332 |         }).fail(notification.exception);
 | 
        
           |  |  | 333 |   | 
        
           |  |  | 334 |     };
 | 
        
           |  |  | 335 |   | 
        
           |  |  | 336 |     /**
 | 
        
           |  |  | 337 |      * Send request review for user evidence competencies handler.
 | 
        
           |  |  | 338 |      *
 | 
        
           |  |  | 339 |      * @param  {Event} e The event.
 | 
        
           |  |  | 340 |      */
 | 
        
           |  |  | 341 |     UserEvidenceActions.prototype._reviewUserEvidenceCompetenciesHandler = function(e) {
 | 
        
           |  |  | 342 |         e.preventDefault();
 | 
        
           |  |  | 343 |         var data = this._findEvidenceData($(e.target));
 | 
        
           |  |  | 344 |         this.reviewUserEvidenceCompetencies(data);
 | 
        
           |  |  | 345 |     };
 | 
        
           |  |  | 346 |   | 
        
           |  |  | 347 |     /**
 | 
        
           |  |  | 348 |      * Find the evidence data from the evidence node.
 | 
        
           |  |  | 349 |      *
 | 
        
           |  |  | 350 |      * @param  {Node} node The node to search from.
 | 
        
           |  |  | 351 |      * @return {Object} Evidence data.
 | 
        
           |  |  | 352 |      */
 | 
        
           |  |  | 353 |     UserEvidenceActions.prototype._findEvidenceData = function(node) {
 | 
        
           |  |  | 354 |         var parent = node.parentsUntil($(this._region).parent(), this._evidenceNode),
 | 
        
           |  |  | 355 |             data;
 | 
        
           |  |  | 356 |   | 
        
           |  |  | 357 |         if (parent.length != 1) {
 | 
        
           |  |  | 358 |             throw new Error('The evidence node was not located.');
 | 
        
           |  |  | 359 |         }
 | 
        
           |  |  | 360 |   | 
        
           |  |  | 361 |         data = parent.data();
 | 
        
           |  |  | 362 |         if (typeof data === 'undefined' || typeof data.id === 'undefined') {
 | 
        
           |  |  | 363 |             throw new Error('Evidence data could not be found.');
 | 
        
           |  |  | 364 |         }
 | 
        
           |  |  | 365 |   | 
        
           |  |  | 366 |         return data;
 | 
        
           |  |  | 367 |     };
 | 
        
           |  |  | 368 |   | 
        
           |  |  | 369 |     /**
 | 
        
           |  |  | 370 |      * Enhance a menu bar.
 | 
        
           |  |  | 371 |      *
 | 
        
           |  |  | 372 |      * @param  {String} selector Menubar selector.
 | 
        
           |  |  | 373 |      */
 | 
        
           |  |  | 374 |     UserEvidenceActions.prototype.enhanceMenubar = function(selector) {
 | 
        
           |  |  | 375 |         var self = this;
 | 
        
           |  |  | 376 |         Menubar.enhance(selector, {
 | 
        
           |  |  | 377 |             '[data-action="user-evidence-delete"]': self._deleteEvidenceHandler.bind(self),
 | 
        
           |  |  | 378 |             '[data-action="link-competency"]': self._createUserEvidenceCompetencyHandler.bind(self),
 | 
        
           |  |  | 379 |             '[data-action="send-competencies-review"]': self._reviewUserEvidenceCompetenciesHandler.bind(self),
 | 
        
           |  |  | 380 |         });
 | 
        
           |  |  | 381 |     };
 | 
        
           |  |  | 382 |   | 
        
           |  |  | 383 |     /**
 | 
        
           |  |  | 384 |      * Register the events in the region.
 | 
        
           |  |  | 385 |      *
 | 
        
           |  |  | 386 |      * At this stage this cannot be used with enhanceMenubar or multiple handlers
 | 
        
           |  |  | 387 |      * will be added to the same node.
 | 
        
           |  |  | 388 |      */
 | 
        
           |  |  | 389 |     UserEvidenceActions.prototype.registerEvents = function() {
 | 
        
           |  |  | 390 |         var wrapper = $(this._region),
 | 
        
           |  |  | 391 |             self = this;
 | 
        
           |  |  | 392 |   | 
        
           |  |  | 393 |         wrapper.find('[data-action="user-evidence-delete"]').click(self._deleteEvidenceHandler.bind(self));
 | 
        
           |  |  | 394 |         wrapper.find('[data-action="link-competency"]').click(self._createUserEvidenceCompetencyHandler.bind(self));
 | 
        
           |  |  | 395 |         wrapper.find('[data-action="delete-competency-link"]').click(self._deleteUserEvidenceCompetencyHandler.bind(self));
 | 
        
           |  |  | 396 |         wrapper.find('[data-action="send-competencies-review"]').click(self._reviewUserEvidenceCompetenciesHandler.bind(self));
 | 
        
           |  |  | 397 |     };
 | 
        
           |  |  | 398 |   | 
        
           |  |  | 399 |     return /** @alias module:tool_lp/user_evidence_actions */ UserEvidenceActions;
 | 
        
           |  |  | 400 | });
 |