Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

{"version":3,"file":"planactions.min.js","sources":["../src/planactions.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 * Plan actions via ajax.\n *\n * @module     tool_lp/planactions\n * @copyright  2015 David Monllao\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n        'core/templates',\n        'core/ajax',\n        'core/notification',\n        'core/str',\n        'tool_lp/menubar',\n        'tool_lp/dialogue'],\n        function($, templates, ajax, notification, str, Menubar, Dialogue) {\n\n    /**\n     * PlanActions class.\n     *\n     * Note that presently this cannot be instantiated more than once per page.\n     *\n     * @param {String} type The type of page we're in.\n     */\n    var PlanActions = function(type) {\n        this._type = type;\n\n        if (type === 'plan') {\n            // This is the page to view one plan.\n            this._region = '[data-region=\"plan-page\"]';\n            this._planNode = '[data-region=\"plan-page\"]';\n            this._template = 'tool_lp/plan_page';\n            this._contextMethod = 'tool_lp_data_for_plan_page';\n\n        } else if (type === 'plans') {\n            // This is the page to view a list of plans.\n            this._region = '[data-region=\"plans\"]';\n            this._planNode = '[data-region=\"plan-node\"]';\n            this._template = 'tool_lp/plans_page';\n            this._contextMethod = 'tool_lp_data_for_plans_page';\n\n        } else {\n            throw new TypeError('Unexpected type.');\n        }\n    };\n\n    /** @property {String} Ajax method to fetch the page data from. */\n    PlanActions.prototype._contextMethod = null;\n    /** @property {String} Selector to find the node describing the plan. */\n    PlanActions.prototype._planNode = null;\n    /** @property {String} Selector mapping to the region to update. Usually similar to wrapper. */\n    PlanActions.prototype._region = null;\n    /** @property {String} Name of the template used to render the region. */\n    PlanActions.prototype._template = null;\n    /** @property {String} Type of page/region we're in. */\n    PlanActions.prototype._type = null;\n\n    /**\n     * Resolve the arguments to refresh the region.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @return {Object} List of arguments.\n     */\n    PlanActions.prototype._getContextArgs = function(planData) {\n        var self = this,\n            args = {};\n\n        if (self._type === 'plan') {\n            args = {\n                planid: planData.id\n            };\n\n        } else if (self._type === 'plans') {\n            args = {\n                userid: planData.userid\n            };\n        }\n\n        return args;\n    };\n\n    /**\n     * Refresh the plan view.\n     *\n     * This is useful when you only want to refresh the view.\n     *\n     * @param  {String} selector The node to search the plan data from.\n     */\n    PlanActions.prototype.refresh = function(selector) {\n        var planData = this._findPlanData($(selector));\n        this._callAndRefresh([], planData);\n    };\n\n    /**\n     * Callback to render the region template.\n     *\n     * @param {Object} context The context for the template.\n     * @return {Promise}\n     */\n    PlanActions.prototype._renderView = function(context) {\n        var self = this;\n        return templates.render(self._template, context)\n            .then(function(newhtml, newjs) {\n                $(self._region).replaceWith(newhtml);\n                templates.runTemplateJS(newjs);\n                return;\n            });\n    };\n\n    /**\n     * Call multiple ajax methods, and refresh.\n     *\n     * @param  {Array}  calls    List of Ajax calls.\n     * @param  {Object} planData Plan data from plan node.\n     * @return {Promise}\n     */\n    PlanActions.prototype._callAndRefresh = function(calls, planData) {\n        // Because this function causes a refresh, we must track the JS completion from start to finish to prevent\n        // stale reference issues in Behat.\n        var callKey = 'tool_lp/planactions:_callAndRefresh-' + Math.floor(Math.random() * Math.floor(1000));\n        M.util.js_pending(callKey);\n\n        var self = this;\n        calls.push({\n            methodname: self._contextMethod,\n            args: self._getContextArgs(planData)\n        });\n\n        // Apply all the promises, and refresh when the last one is resolved.\n        return $.when.apply($, ajax.call(calls))\n            .then(function() {\n                return self._renderView(arguments[arguments.length - 1]);\n            })\n            .fail(notification.exception)\n            .always(function() {\n                return M.util.js_complete(callKey);\n            });\n    };\n\n    /**\n     * Delete a plan and reload the region.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype._doDelete = function(planData) {\n        var self = this,\n            calls = [{\n                methodname: 'core_competency_delete_plan',\n                args: {id: planData.id}\n            }];\n        self._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Delete a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype.deletePlan = function(planData) {\n        var self = this,\n            requests;\n\n        requests = ajax.call([{\n            methodname: 'core_competency_read_plan',\n            args: {id: planData.id}\n        }]);\n\n        requests[0].done(function(plan) {\n            str.get_strings([\n                {key: 'confirm', component: 'moodle'},\n                {key: 'deleteplan', component: 'tool_lp', param: plan.name},\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 plan X?\n                    strings[2], // Delete.\n                    strings[3], // Cancel.\n                    function() {\n                        self._doDelete(planData);\n                    }\n                );\n            }).fail(notification.exception);\n        }).fail(notification.exception);\n\n    };\n\n    /**\n     * Reopen plan and reload the region.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype._doReopenPlan = function(planData) {\n        var self = this,\n            calls = [{\n                methodname: 'core_competency_reopen_plan',\n                args: {planid: planData.id}\n            }];\n        self._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Reopen a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype.reopenPlan = function(planData) {\n        var self = this,\n            requests = ajax.call([{\n                methodname: 'core_competency_read_plan',\n                args: {id: planData.id}\n            }]);\n\n        requests[0].done(function(plan) {\n            str.get_strings([\n                {key: 'confirm', component: 'moodle'},\n                {key: 'reopenplanconfirm', component: 'tool_lp', param: plan.name},\n                {key: 'reopenplan', component: 'tool_lp'},\n                {key: 'cancel', component: 'moodle'}\n            ]).done(function(strings) {\n                notification.confirm(\n                    strings[0], // Confirm.\n                    strings[1], // Reopen plan X?\n                    strings[2], // Reopen.\n                    strings[3], // Cancel.\n                    function() {\n                        self._doReopenPlan(planData);\n                    }\n                );\n            }).fail(notification.exception);\n        }).fail(notification.exception);\n\n    };\n\n    /**\n     * Complete plan and reload the region.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype._doCompletePlan = function(planData) {\n        var self = this,\n            calls = [{\n                methodname: 'core_competency_complete_plan',\n                args: {planid: planData.id}\n            }];\n        self._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Complete a plan process.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype.completePlan = function(planData) {\n        var self = this,\n            requests = ajax.call([{\n                methodname: 'core_competency_read_plan',\n                args: {id: planData.id}\n            }]);\n\n        requests[0].done(function(plan) {\n            str.get_strings([\n                {key: 'confirm', component: 'moodle'},\n                {key: 'completeplanconfirm', component: 'tool_lp', param: plan.name},\n                {key: 'completeplan', component: 'tool_lp'},\n                {key: 'cancel', component: 'moodle'}\n            ]).done(function(strings) {\n                notification.confirm(\n                    strings[0], // Confirm.\n                    strings[1], // Complete plan X?\n                    strings[2], // Complete.\n                    strings[3], // Cancel.\n                    function() {\n                        self._doCompletePlan(planData);\n                    }\n                );\n            }).fail(notification.exception);\n        }).fail(notification.exception);\n    };\n\n    /**\n     * Unlink plan and reload the region.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype._doUnlinkPlan = function(planData) {\n        var self = this,\n            calls = [{\n                methodname: 'core_competency_unlink_plan_from_template',\n                args: {planid: planData.id}\n            }];\n        self._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Unlink a plan process.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     */\n    PlanActions.prototype.unlinkPlan = function(planData) {\n        var self = this,\n            requests = ajax.call([{\n                methodname: 'core_competency_read_plan',\n                args: {id: planData.id}\n            }]);\n\n        requests[0].done(function(plan) {\n            str.get_strings([\n                {key: 'confirm', component: 'moodle'},\n                {key: 'unlinkplantemplateconfirm', component: 'tool_lp', param: plan.name},\n                {key: 'unlinkplantemplate', component: 'tool_lp'},\n                {key: 'cancel', component: 'moodle'}\n            ]).done(function(strings) {\n                notification.confirm(\n                    strings[0], // Confirm.\n                    strings[1], // Unlink plan X?\n                    strings[2], // Unlink.\n                    strings[3], // Cancel.\n                    function() {\n                        self._doUnlinkPlan(planData);\n                    }\n                );\n            }).fail(notification.exception);\n        }).fail(notification.exception);\n    };\n\n    /**\n     * Request review of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method _doRequestReview\n     */\n    PlanActions.prototype._doRequestReview = function(planData) {\n        var calls = [{\n            methodname: 'core_competency_plan_request_review',\n            args: {\n                id: planData.id\n            }\n        }];\n        this._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Request review of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method requestReview\n     */\n    PlanActions.prototype.requestReview = function(planData) {\n        this._doRequestReview(planData);\n    };\n\n    /**\n     * Cancel review request of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method _doCancelReviewRequest\n     */\n    PlanActions.prototype._doCancelReviewRequest = function(planData) {\n        var calls = [{\n            methodname: 'core_competency_plan_cancel_review_request',\n            args: {\n                id: planData.id\n            }\n        }];\n        this._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Cancel review request of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method cancelReviewRequest\n     */\n    PlanActions.prototype.cancelReviewRequest = function(planData) {\n        this._doCancelReviewRequest(planData);\n    };\n\n    /**\n     * Start review of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method _doStartReview\n     */\n    PlanActions.prototype._doStartReview = function(planData) {\n        var calls = [{\n            methodname: 'core_competency_plan_start_review',\n            args: {\n                id: planData.id\n            }\n        }];\n        this._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Start review of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method startReview\n     */\n    PlanActions.prototype.startReview = function(planData) {\n        this._doStartReview(planData);\n    };\n\n    /**\n     * Stop review of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method _doStopReview\n     */\n    PlanActions.prototype._doStopReview = function(planData) {\n        var calls = [{\n            methodname: 'core_competency_plan_stop_review',\n            args: {\n                id: planData.id\n            }\n        }];\n        this._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Stop review of a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method stopReview\n     */\n    PlanActions.prototype.stopReview = function(planData) {\n        this._doStopReview(planData);\n    };\n\n    /**\n     * Approve a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method _doApprove\n     */\n    PlanActions.prototype._doApprove = function(planData) {\n        var calls = [{\n            methodname: 'core_competency_approve_plan',\n            args: {\n                id: planData.id\n            }\n        }];\n        this._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Approve a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method approve\n     */\n    PlanActions.prototype.approve = function(planData) {\n        this._doApprove(planData);\n    };\n\n    /**\n     * Unapprove a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method _doUnapprove\n     */\n    PlanActions.prototype._doUnapprove = function(planData) {\n        var calls = [{\n            methodname: 'core_competency_unapprove_plan',\n            args: {\n                id: planData.id\n            }\n        }];\n        this._callAndRefresh(calls, planData);\n    };\n\n    /**\n     * Unapprove a plan.\n     *\n     * @param  {Object} planData Plan data from plan node.\n     * @method unapprove\n     */\n    PlanActions.prototype.unapprove = function(planData) {\n        this._doUnapprove(planData);\n    };\n\n    /**\n     * Display list of linked courses on a modal dialogue.\n     *\n     * @param  {Event} e The event.\n     */\n    PlanActions.prototype._showLinkedCoursesHandler = function(e) {\n        e.preventDefault();\n\n        var competencyid = $(e.target).data('id');\n        var requests = ajax.call([{\n            methodname: 'tool_lp_list_courses_using_competency',\n            args: {id: competencyid}\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                    );\n                }).fail(notification.exception);\n            }).fail(notification.exception);\n        }).fail(notification.exception);\n    };\n\n    /**\n     * Plan event handler.\n     *\n     * @param  {String} method The method to call.\n     * @param  {Event} e The event.\n     * @method _eventHandler\n     */\n    PlanActions.prototype._eventHandler = function(method, e) {\n        e.preventDefault();\n        var data = this._findPlanData($(e.target));\n        this[method](data);\n    };\n\n    /**\n     * Find the plan data from the plan node.\n     *\n     * @param  {Node} node The node to search from.\n     * @return {Object} Plan data.\n     */\n    PlanActions.prototype._findPlanData = function(node) {\n        var parent = node.parentsUntil($(this._region).parent(), this._planNode),\n            data;\n\n        if (parent.length != 1) {\n            throw new Error('The plan node was not located.');\n        }\n\n        data = parent.data();\n        if (typeof data === 'undefined' || typeof data.id === 'undefined') {\n            throw new Error('Plan data could not be found.');\n        }\n\n        return data;\n    };\n\n    /**\n     * Enhance a menu bar.\n     *\n     * @param  {String} selector Menubar selector.\n     */\n    PlanActions.prototype.enhanceMenubar = function(selector) {\n        Menubar.enhance(selector, {\n            '[data-action=\"plan-delete\"]': this._eventHandler.bind(this, 'deletePlan'),\n            '[data-action=\"plan-complete\"]': this._eventHandler.bind(this, 'completePlan'),\n            '[data-action=\"plan-reopen\"]': this._eventHandler.bind(this, 'reopenPlan'),\n            '[data-action=\"plan-unlink\"]': this._eventHandler.bind(this, 'unlinkPlan'),\n            '[data-action=\"plan-request-review\"]': this._eventHandler.bind(this, 'requestReview'),\n            '[data-action=\"plan-cancel-review-request\"]': this._eventHandler.bind(this, 'cancelReviewRequest'),\n            '[data-action=\"plan-start-review\"]': this._eventHandler.bind(this, 'startReview'),\n            '[data-action=\"plan-stop-review\"]': this._eventHandler.bind(this, 'stopReview'),\n            '[data-action=\"plan-approve\"]': this._eventHandler.bind(this, 'approve'),\n            '[data-action=\"plan-unapprove\"]': this._eventHandler.bind(this, 'unapprove'),\n        });\n    };\n\n    /**\n     * Register the events in the region.\n     *\n     * At this stage this cannot be used with enhanceMenubar or multiple handlers\n     * will be added to the same node.\n     */\n    PlanActions.prototype.registerEvents = function() {\n        var wrapper = $(this._region);\n\n        wrapper.find('[data-action=\"plan-delete\"]').click(this._eventHandler.bind(this, 'deletePlan'));\n        wrapper.find('[data-action=\"plan-complete\"]').click(this._eventHandler.bind(this, 'completePlan'));\n        wrapper.find('[data-action=\"plan-reopen\"]').click(this._eventHandler.bind(this, 'reopenPlan'));\n        wrapper.find('[data-action=\"plan-unlink\"]').click(this._eventHandler.bind(this, 'unlinkPlan'));\n\n        wrapper.find('[data-action=\"plan-request-review\"]').click(this._eventHandler.bind(this, 'requestReview'));\n        wrapper.find('[data-action=\"plan-cancel-review-request\"]').click(this._eventHandler.bind(this, 'cancelReviewRequest'));\n        wrapper.find('[data-action=\"plan-start-review\"]').click(this._eventHandler.bind(this, 'startReview'));\n        wrapper.find('[data-action=\"plan-stop-review\"]').click(this._eventHandler.bind(this, 'stopReview'));\n        wrapper.find('[data-action=\"plan-approve\"]').click(this._eventHandler.bind(this, 'approve'));\n        wrapper.find('[data-action=\"plan-unapprove\"]').click(this._eventHandler.bind(this, 'unapprove'));\n\n        wrapper.find('[data-action=\"find-courses-link\"]').click(this._showLinkedCoursesHandler.bind(this));\n    };\n\n    return PlanActions;\n});\n"],"names":["define","$","templates","ajax","notification","str","Menubar","Dialogue","PlanActions","type","_type","_region","_planNode","_template","_contextMethod","TypeError","prototype","_getContextArgs","planData","args","this","planid","id","userid","refresh","selector","_findPlanData","_callAndRefresh","_renderView","context","self","render","then","newhtml","newjs","replaceWith","runTemplateJS","calls","callKey","Math","floor","random","M","util","js_pending","push","methodname","when","apply","call","arguments","length","fail","exception","always","js_complete","_doDelete","deletePlan","done","plan","get_strings","key","component","param","name","strings","confirm","_doReopenPlan","reopenPlan","_doCompletePlan","completePlan","_doUnlinkPlan","unlinkPlan","_doRequestReview","requestReview","_doCancelReviewRequest","cancelReviewRequest","_doStartReview","startReview","_doStopReview","stopReview","_doApprove","approve","_doUnapprove","unapprove","_showLinkedCoursesHandler","e","preventDefault","competencyid","target","data","courses","html","get_string","linkedcourses","_eventHandler","method","node","parent","parentsUntil","Error","enhanceMenubar","enhance","bind","registerEvents","wrapper","find","click"],"mappings":"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"}