Sindbad~EG File Manager
{"version":3,"file":"grading_panel.min.js","sources":["../src/grading_panel.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 * Javascript controller for the \"Grading\" panel at the right of the page.\n *\n * @module mod_assign/grading_panel\n * @copyright 2016 Damyon Wiese <damyon@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['jquery', 'core/yui', 'core/notification', 'core/templates', 'core/fragment',\n 'core/ajax', 'core/str', 'mod_assign/grading_form_change_checker',\n 'mod_assign/grading_events', 'core/event', 'core/toast'],\n function($, Y, notification, templates, fragment, ajax, str, checker, GradingEvents, Event, Toast) {\n\n /**\n * GradingPanel class.\n *\n * @class mod_assign/grading_panel\n * @param {String} selector The selector for the page region containing the user navigation.\n */\n var GradingPanel = function(selector) {\n this._regionSelector = selector;\n this._region = $(selector);\n this._userCache = [];\n\n this.registerEventListeners();\n };\n\n /** @property {String} Selector for the page region containing the user navigation. */\n GradingPanel.prototype._regionSelector = null;\n\n /** @property {Integer} Remember the last user id to prevent unnessecary reloads. */\n GradingPanel.prototype._lastUserId = 0;\n\n /** @property {Integer} Remember the last attempt number to prevent unnessecary reloads. */\n GradingPanel.prototype._lastAttemptNumber = -1;\n\n /** @property {JQuery} JQuery node for the page region containing the user navigation. */\n GradingPanel.prototype._region = null;\n\n /** @property {Integer} The id of the next user in the grading list */\n GradingPanel.prototype.nextUserId = null;\n\n /** @property {Boolean} Next user exists in the grading list */\n GradingPanel.prototype.nextUser = false;\n\n /**\n * Fade the dom node out, update it, and fade it back.\n *\n * @private\n * @method _niceReplaceNodeContents\n * @param {JQuery} node\n * @param {String} html\n * @param {String} js\n * @return {Deferred} promise resolved when the animations are complete.\n */\n GradingPanel.prototype._niceReplaceNodeContents = function(node, html, js) {\n var promise = $.Deferred();\n\n node.fadeOut(\"fast\", function() {\n templates.replaceNodeContents(node, html, js);\n node.fadeIn(\"fast\", function() {\n promise.resolve();\n });\n });\n\n return promise.promise();\n };\n\n /**\n * Make sure all form fields have the latest saved state.\n * @private\n * @method _saveFormState\n */\n GradingPanel.prototype._saveFormState = function() {\n // Copy data from notify students checkbox which was moved out of the form.\n var checked = $('[data-region=\"grading-actions-form\"] [name=\"sendstudentnotifications\"]').prop(\"checked\");\n $('.gradeform [name=\"sendstudentnotifications\"]').val(checked);\n };\n\n /**\n * Make form submit via ajax.\n *\n * @private\n * @param {Object} event\n * @param {Integer} nextUserId\n * @param {Boolean} nextUser optional. Load next user in the grading list.\n * @method _submitForm\n */\n GradingPanel.prototype._submitForm = function(event, nextUserId, nextUser) {\n // If the form has data in comment-area, then we need to save that comment\n var commentAreaElement = document.querySelector('.comment-area');\n if (commentAreaElement) {\n var commentTextAreaElement = commentAreaElement.querySelector('.db > textarea');\n if (commentTextAreaElement.value !== '') {\n var commentActionPostElement = commentAreaElement.querySelector('.fd a[id^=\"comment-action-post-\"]');\n commentActionPostElement.click();\n }\n }\n\n // The form was submitted - send it via ajax instead.\n var form = $(this._region.find('form.gradeform'));\n\n $('[data-region=\"overlay\"]').show();\n\n // We call this, so other modules can update the form with the latest state.\n form.trigger('save-form-state');\n\n // Tell all form fields we are about to submit the form.\n Event.notifyFormSubmitAjax(form[0]);\n\n // Now we get all the current values from the form.\n var data = form.serialize();\n var assignmentid = this._region.attr('data-assignmentid');\n\n // Now we can continue...\n ajax.call([{\n methodname: 'mod_assign_submit_grading_form',\n args: {assignmentid: assignmentid, userid: this._lastUserId, jsonformdata: JSON.stringify(data)},\n done: this._handleFormSubmissionResponse.bind(this, data, nextUserId, nextUser),\n fail: notification.exception\n }]);\n };\n\n /**\n * Handle form submission response.\n *\n * @private\n * @method _handleFormSubmissionResponse\n * @param {Array} formdata - submitted values\n * @param {Integer} nextUserId - optional. The id of the user to load after the form is saved.\n * @param {Boolean} nextUser - optional. If true, switch to next user in the grading list.\n * @param {Array} response List of errors.\n */\n GradingPanel.prototype._handleFormSubmissionResponse = function(formdata, nextUserId, nextUser, response) {\n if (typeof nextUserId === \"undefined\") {\n nextUserId = this._lastUserId;\n }\n if (response.length) {\n // There was an error saving the grade. Re-render the form using the submitted data so we can show\n // validation errors.\n $(document).trigger('reset', [this._lastUserId, formdata]);\n } else {\n str.get_strings([\n {key: 'gradechangessaveddetail', component: 'mod_assign'},\n ]).done(function(strs) {\n Toast.add(strs[0]);\n }).fail(notification.exception);\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n if (nextUserId == this._lastUserId) {\n $(document).trigger('reset', nextUserId);\n } else if (nextUser) {\n $(document).trigger('done-saving-show-next', true);\n } else {\n $(document).trigger('user-changed', nextUserId);\n }\n }\n $('[data-region=\"overlay\"]').hide();\n };\n\n /**\n * Refresh form with default values.\n *\n * @private\n * @method _resetForm\n * @param {Event} e\n * @param {Integer} userid\n * @param {Array} formdata\n */\n GradingPanel.prototype._resetForm = function(e, userid, formdata) {\n // The form was cancelled - refresh with default values.\n var event = $.Event(\"custom\");\n if (typeof userid == \"undefined\") {\n userid = this._lastUserId;\n }\n this._lastUserId = 0;\n this._refreshGradingPanel(event, userid, formdata);\n };\n\n /**\n * Open a picker to choose an older attempt.\n *\n * @private\n * @param {Object} e\n * @method _chooseAttempt\n */\n GradingPanel.prototype._chooseAttempt = function(e) {\n // Show a dialog.\n\n // The form is in the element pointed to by data-submissions.\n var link = $(e.target);\n var submissionsId = link.data('submissions');\n var submissionsform = $(document.getElementById(submissionsId));\n var formcopy = submissionsform.clone();\n var formhtml = formcopy.wrap($('<form/>')).html();\n\n str.get_strings([\n {key: 'viewadifferentattempt', component: 'mod_assign'},\n {key: 'view', component: 'core'},\n {key: 'cancel', component: 'core'},\n ]).done(function(strs) {\n notification.confirm(strs[0], formhtml, strs[1], strs[2], function() {\n var attemptnumber = $(\"input:radio[name='select-attemptnumber']:checked\").val();\n\n this._refreshGradingPanel(null, this._lastUserId, '', attemptnumber);\n }.bind(this));\n }.bind(this)).fail(notification.exception);\n };\n\n /**\n * Add popout buttons\n *\n * @private\n * @method _addPopoutButtons\n * @param {JQuery} selector The region selector to add popout buttons to.\n */\n GradingPanel.prototype._addPopoutButtons = function(selector) {\n var region = $(selector);\n\n templates.render('mod_assign/popout_button', {}).done(function(html) {\n var parents = region.find('[data-fieldtype=\"filemanager\"],[data-fieldtype=\"editor\"],[data-fieldtype=\"grading\"]')\n .closest('.fitem');\n parents.addClass('has-popout').find('label').parent().append(html);\n\n region.on('click', '[data-region=\"popout-button\"]', this._togglePopout.bind(this));\n }.bind(this)).fail(notification.exception);\n };\n\n /**\n * Make a div \"popout\" or \"popback\".\n *\n * @private\n * @method _togglePopout\n * @param {Event} event\n */\n GradingPanel.prototype._togglePopout = function(event) {\n event.preventDefault();\n var container = $(event.target).closest('.fitem');\n if (container.hasClass('popout')) {\n $('.popout').removeClass('popout');\n } else {\n $('.popout').removeClass('popout');\n container.addClass('popout');\n container.addClass('moodle-has-zindex');\n }\n };\n\n /**\n * Get the user context - re-render the template in the page.\n *\n * @private\n * @method _refreshGradingPanel\n * @param {Event} event\n * @param {Number} userid\n * @param {String} submissiondata serialised submission data.\n * @param {Integer} attemptnumber\n */\n GradingPanel.prototype._refreshGradingPanel = function(event, userid, submissiondata, attemptnumber) {\n var contextid = this._region.attr('data-contextid');\n if (typeof submissiondata === 'undefined') {\n submissiondata = '';\n }\n if (typeof attemptnumber === 'undefined') {\n attemptnumber = -1;\n }\n // Skip reloading if it is the same user.\n if (this._lastUserId == userid && this._lastAttemptNumber == attemptnumber && submissiondata === '') {\n return;\n }\n this._lastUserId = userid;\n this._lastAttemptNumber = attemptnumber;\n $(document).trigger('start-loading-user');\n // Tell behat to back off too.\n window.M.util.js_pending('mod-assign-loading-user');\n // First insert the loading template.\n templates.render('mod_assign/loading', {}).done(function(html, js) {\n // Update the page.\n this._niceReplaceNodeContents(this._region, html, js).done(function() {\n if (userid > 0) {\n this._region.show();\n // Reload the grading form \"fragment\" for this user.\n var params = {userid: userid, attemptnumber: attemptnumber, jsonformdata: JSON.stringify(submissiondata)};\n fragment.loadFragment('mod_assign', 'gradingpanel', contextid, params).done(function(html, js) {\n this._niceReplaceNodeContents(this._region, html, js)\n .done(function() {\n checker.saveFormState('[data-region=\"grade-panel\"] .gradeform');\n $(document).on('editor-content-restored', function() {\n // If the editor has some content that has been restored\n // then save the form state again for comparison.\n checker.saveFormState('[data-region=\"grade-panel\"] .gradeform');\n });\n $('[data-region=\"attempt-chooser\"]').on('click', this._chooseAttempt.bind(this));\n this._addPopoutButtons('[data-region=\"grade-panel\"] .gradeform');\n $(document).trigger('finish-loading-user');\n // Tell behat we are friends again.\n window.M.util.js_complete('mod-assign-loading-user');\n }.bind(this))\n .fail(notification.exception);\n }.bind(this)).fail(notification.exception);\n $('[data-region=\"review-panel\"]').show();\n } else {\n this._region.hide();\n $('[data-region=\"review-panel\"]').hide();\n $(document).trigger('finish-loading-user');\n // Tell behat we are friends again.\n window.M.util.js_complete('mod-assign-loading-user');\n }\n }.bind(this));\n }.bind(this)).fail(notification.exception);\n };\n\n /**\n * Get next user data and store it in global variables\n *\n * @private\n * @method _getNextUser\n * @param {Event} event\n * @param {Object} data Next user's data\n */\n GradingPanel.prototype._getNextUser = function(event, data) {\n this.nextUserId = data.nextUserId;\n this.nextUser = data.nextUser;\n };\n\n /**\n * Handle the save-and-show-next event\n *\n * @private\n * @method _handleSaveAndShowNext\n */\n GradingPanel.prototype._handleSaveAndShowNext = function() {\n this._submitForm(null, this.nextUserId, this.nextUser);\n };\n\n /**\n * Get the grade panel element.\n *\n * @method getPanelElement\n * @return {jQuery}\n */\n GradingPanel.prototype.getPanelElement = function() {\n return $('[data-region=\"grade-panel\"]');\n };\n\n /**\n * Hide the grade panel.\n *\n * @method collapsePanel\n */\n GradingPanel.prototype.collapsePanel = function() {\n this.getPanelElement().addClass('collapsed');\n };\n\n /**\n * Show the grade panel.\n *\n * @method expandPanel\n */\n GradingPanel.prototype.expandPanel = function() {\n this.getPanelElement().removeClass('collapsed');\n };\n\n /**\n * Register event listeners for the grade panel.\n *\n * @method registerEventListeners\n */\n GradingPanel.prototype.registerEventListeners = function() {\n var docElement = $(document);\n var region = $(this._region);\n // Add an event listener to prevent form submission when pressing enter key.\n region.on('submit', 'form', function(e) {\n e.preventDefault();\n });\n\n docElement.on('next-user', this._getNextUser.bind(this));\n docElement.on('user-changed', this._refreshGradingPanel.bind(this));\n docElement.on('save-changes', this._submitForm.bind(this));\n docElement.on('save-and-show-next', this._handleSaveAndShowNext.bind(this));\n docElement.on('reset', this._resetForm.bind(this));\n\n docElement.on('save-form-state', this._saveFormState.bind(this));\n\n docElement.on(GradingEvents.COLLAPSE_GRADE_PANEL, function() {\n this.collapsePanel();\n }.bind(this));\n\n // We should expand if the review panel is collapsed.\n docElement.on(GradingEvents.COLLAPSE_REVIEW_PANEL, function() {\n this.expandPanel();\n }.bind(this));\n\n docElement.on(GradingEvents.EXPAND_GRADE_PANEL, function() {\n this.expandPanel();\n }.bind(this));\n };\n\n return GradingPanel;\n});\n"],"names":["define","$","Y","notification","templates","fragment","ajax","str","checker","GradingEvents","Event","Toast","GradingPanel","selector","_regionSelector","_region","_userCache","registerEventListeners","prototype","_lastUserId","_lastAttemptNumber","nextUserId","nextUser","_niceReplaceNodeContents","node","html","js","promise","Deferred","fadeOut","replaceNodeContents","fadeIn","resolve","_saveFormState","checked","prop","val","_submitForm","event","commentAreaElement","document","querySelector","value","click","form","this","find","show","trigger","notifyFormSubmitAjax","data","serialize","assignmentid","attr","call","methodname","args","userid","jsonformdata","JSON","stringify","done","_handleFormSubmissionResponse","bind","fail","exception","formdata","response","length","get_strings","key","component","strs","add","use","M","core_formchangechecker","reset_form_dirty_state","hide","_resetForm","e","_refreshGradingPanel","_chooseAttempt","submissionsId","target","formhtml","getElementById","clone","wrap","confirm","attemptnumber","_addPopoutButtons","region","render","closest","addClass","parent","append","on","_togglePopout","preventDefault","container","hasClass","removeClass","submissiondata","contextid","window","util","js_pending","params","loadFragment","saveFormState","js_complete","_getNextUser","_handleSaveAndShowNext","getPanelElement","collapsePanel","expandPanel","docElement","COLLAPSE_GRADE_PANEL","COLLAPSE_REVIEW_PANEL","EXPAND_GRADE_PANEL"],"mappings":"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"}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists