Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
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
});