Sindbad~EG File Manager
{"version":3,"file":"grading_navigation.min.js","sources":["../src/grading_navigation.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 to handle changing users via the user selector in the header.\n *\n * @module mod_assign/grading_navigation\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/notification', 'core/str', 'core/form-autocomplete',\n 'core/ajax', 'mod_assign/grading_form_change_checker'],\n function($, notification, str, autocomplete, ajax, checker) {\n\n /**\n * GradingNavigation class.\n *\n * @class mod_assign/grading_navigation\n * @param {String} selector The selector for the page region containing the user navigation.\n */\n var GradingNavigation = function(selector) {\n this._regionSelector = selector;\n this._region = $(selector);\n this._filters = [];\n this._users = [];\n this._filteredUsers = [];\n this._lastXofYUpdate = 0;\n this._firstLoadUsers = true;\n\n // Get the current user list from a webservice.\n this._loadAllUsers();\n\n // We do not allow navigation while ajax requests are pending.\n // Attach listeners to the select and arrow buttons.\n\n this._region.find('[data-action=\"previous-user\"]').on('click', this._handlePreviousUser.bind(this));\n this._region.find('[data-action=\"next-user\"]').on('click', this._handleNextUser.bind(this));\n this._region.find('[data-action=\"change-user\"]').on('change', this._handleChangeUser.bind(this));\n this._region.find('[data-region=\"user-filters\"]').on('click', this._toggleExpandFilters.bind(this));\n\n $(document).on('user-changed', this._refreshSelector.bind(this));\n $(document).on('done-saving-show-next', this._handleNextUser.bind(this));\n\n // Position the configure filters panel under the link that expands it.\n var toggleLink = this._region.find('[data-region=\"user-filters\"]');\n var configPanel = $(document.getElementById(toggleLink.attr('aria-controls')));\n\n configPanel.on('change', 'select', this._filterChanged.bind(this));\n\n var userid = $('[data-region=\"grading-navigation-panel\"]').data('first-userid');\n if (userid) {\n this._selectUserById(userid);\n }\n\n str.get_string('changeuser', 'mod_assign').done(function(s) {\n autocomplete.enhance('[data-action=change-user]', false, 'mod_assign/participant_selector', s);\n }\n ).fail(notification.exception);\n\n $(document).bind(\"start-loading-user\", function() {\n this._isLoading = true;\n }.bind(this));\n $(document).bind(\"finish-loading-user\", function() {\n this._isLoading = false;\n }.bind(this));\n };\n\n /** @property {Boolean} Boolean tracking active ajax requests. */\n GradingNavigation.prototype._isLoading = false;\n\n /** @property {String} Selector for the page region containing the user navigation. */\n GradingNavigation.prototype._regionSelector = null;\n\n /** @property {Array} The list of active filter keys */\n GradingNavigation.prototype._filters = null;\n\n /** @property {Array} The list of users */\n GradingNavigation.prototype._users = null;\n\n /** @property {JQuery} JQuery node for the page region containing the user navigation. */\n GradingNavigation.prototype._region = null;\n\n /** @property {String} Last active filters */\n GradingNavigation.prototype._lastFilters = '';\n\n /**\n * Load the list of all users for this assignment.\n *\n * @private\n * @method _loadAllUsers\n * @return {Boolean} True if the user list was fetched.\n */\n GradingNavigation.prototype._loadAllUsers = function() {\n var select = this._region.find('[data-action=change-user]');\n var assignmentid = select.attr('data-assignmentid');\n var groupid = select.attr('data-groupid');\n\n var filterPanel = this._region.find('[data-region=\"configure-filters\"]');\n var filter = filterPanel.find('select[name=\"filter\"]').val();\n var workflowFilter = filterPanel.find('select[name=\"workflowfilter\"]');\n if (workflowFilter) {\n filter += ',' + workflowFilter.val();\n }\n var markerFilter = filterPanel.find('select[name=\"markerfilter\"]');\n if (markerFilter) {\n filter += ',' + markerFilter.val();\n }\n\n if (this._lastFilters == filter) {\n return false;\n }\n this._lastFilters = filter;\n\n ajax.call([{\n methodname: 'mod_assign_list_participants',\n args: {assignid: assignmentid, groupid: groupid, filter: '', onlyids: true, tablesort: true},\n done: this._usersLoaded.bind(this),\n fail: notification.exception\n }]);\n return true;\n };\n\n /**\n * Call back to rebuild the user selector and x of y info when the user list is updated.\n *\n * @private\n * @method _usersLoaded\n * @param {Array} users\n */\n GradingNavigation.prototype._usersLoaded = function(users) {\n this._firstLoadUsers = false;\n this._filteredUsers = this._users = users;\n if (this._users.length) {\n // Position the configure filters panel under the link that expands it.\n var toggleLink = this._region.find('[data-region=\"user-filters\"]');\n var configPanel = $(document.getElementById(toggleLink.attr('aria-controls')));\n\n configPanel.find('select[name=\"filter\"]').trigger('change');\n } else {\n this._selectNoUser();\n }\n this._triggerNextUserEvent();\n };\n\n /**\n * Close the configure filters panel if a click is detected outside of it.\n *\n * @private\n * @method _checkClickOutsideConfigureFilters\n * @param {Event} event\n */\n GradingNavigation.prototype._checkClickOutsideConfigureFilters = function(event) {\n var configPanel = this._region.find('[data-region=\"configure-filters\"]');\n\n if (!configPanel.is(event.target) && configPanel.has(event.target).length === 0) {\n var toggleLink = this._region.find('[data-region=\"user-filters\"]');\n\n configPanel.hide();\n configPanel.attr('aria-hidden', 'true');\n toggleLink.attr('aria-expanded', 'false');\n $(document).unbind('click.mod_assign_grading_navigation');\n }\n };\n\n /**\n * Close the configure filters panel if a click is detected outside of it.\n *\n * @private\n * @method _updateFilterPreference\n * @param {Number} userId The current user id.\n * @param {Array} filterList The list of current filter values.\n * @param {Array} preferenceNames The names of the preferences to update\n * @return {Promise} Resolved when all the preferences are updated.\n */\n GradingNavigation.prototype._updateFilterPreferences = function(userId, filterList, preferenceNames) {\n var preferences = [],\n i = 0;\n\n if (filterList.length == 0 || this._firstLoadUsers) {\n // Nothing to update.\n var deferred = $.Deferred();\n deferred.resolve();\n return deferred;\n }\n // General filter.\n // Set the user preferences to the current filters.\n for (i = 0; i < filterList.length; i++) {\n var newValue = filterList[i];\n if (newValue == 'none') {\n newValue = '';\n }\n\n preferences.push({\n userid: userId,\n name: preferenceNames[i],\n value: newValue\n });\n }\n\n return ajax.call([{\n methodname: 'core_user_set_user_preferences',\n args: {\n preferences: preferences\n }\n }])[0];\n };\n /**\n * Turn a filter on or off.\n *\n * @private\n * @method _filterChanged\n */\n GradingNavigation.prototype._filterChanged = function() {\n // There are 3 types of filter right now.\n var filterPanel = this._region.find('[data-region=\"configure-filters\"]');\n var filters = filterPanel.find('select');\n var preferenceNames = [];\n\n this._filters = [];\n filters.each(function(idx, ele) {\n var element = $(ele);\n this._filters.push(element.val());\n preferenceNames.push('assign_' + element.prop('name'));\n }.bind(this));\n\n // Update the active filter string.\n var filterlist = [];\n filterPanel.find('option:checked').each(function(idx, ele) {\n filterlist[filterlist.length] = $(ele).text();\n });\n if (filterlist.length) {\n this._region.find('[data-region=\"user-filters\"] span').text(filterlist.join(', '));\n } else {\n str.get_string('nofilters', 'mod_assign').done(function(s) {\n this._region.find('[data-region=\"user-filters\"] span').text(s);\n }.bind(this)).fail(notification.exception);\n }\n\n var select = this._region.find('[data-action=change-user]');\n var currentUserID = select.data('currentuserid');\n this._updateFilterPreferences(currentUserID, this._filters, preferenceNames).done(function() {\n // Reload the list of users to apply the new filters.\n if (!this._loadAllUsers()) {\n var userid = parseInt(select.attr('data-selected'));\n var foundIndex = 0;\n // Search the returned users for the current selection.\n $.each(this._filteredUsers, function(index, user) {\n if (userid == user.id) {\n foundIndex = index;\n }\n });\n\n if (this._filteredUsers.length) {\n this._selectUserById(this._filteredUsers[foundIndex].id);\n } else {\n this._selectNoUser();\n }\n\n }\n }.bind(this)).fail(notification.exception);\n this._refreshCount();\n };\n\n /**\n * Select no users, because no users match the filters.\n *\n * @private\n * @method _selectNoUser\n */\n GradingNavigation.prototype._selectNoUser = function() {\n // Detect unsaved changes, and offer to save them - otherwise change user right now.\n if (this._isLoading) {\n return;\n }\n if (checker.checkFormForChanges('[data-region=\"grade-panel\"] .gradeform')) {\n // Form has changes, so we need to confirm before switching users.\n str.get_strings([\n {key: 'unsavedchanges', component: 'mod_assign'},\n {key: 'unsavedchangesquestion', component: 'mod_assign'},\n {key: 'saveandcontinue', component: 'mod_assign'},\n {key: 'cancel', component: 'core'},\n ]).done(function(strs) {\n notification.confirm(strs[0], strs[1], strs[2], strs[3], function() {\n $(document).trigger('save-changes', -1);\n });\n });\n } else {\n $(document).trigger('user-changed', -1);\n }\n };\n\n /**\n * Select the specified user by id.\n *\n * @private\n * @method _selectUserById\n * @param {Number} userid\n */\n GradingNavigation.prototype._selectUserById = function(userid) {\n var select = this._region.find('[data-action=change-user]');\n var useridnumber = parseInt(userid, 10);\n\n // Detect unsaved changes, and offer to save them - otherwise change user right now.\n if (this._isLoading) {\n return;\n }\n if (checker.checkFormForChanges('[data-region=\"grade-panel\"] .gradeform')) {\n // Form has changes, so we need to confirm before switching users.\n str.get_strings([\n {key: 'unsavedchanges', component: 'mod_assign'},\n {key: 'unsavedchangesquestion', component: 'mod_assign'},\n {key: 'saveandcontinue', component: 'mod_assign'},\n {key: 'cancel', component: 'core'},\n ]).done(function(strs) {\n notification.confirm(strs[0], strs[1], strs[2], strs[3], function() {\n $(document).trigger('save-changes', useridnumber);\n });\n });\n } else {\n select.attr('data-selected', userid);\n\n if (!isNaN(useridnumber) && useridnumber > 0) {\n $(document).trigger('user-changed', userid);\n }\n }\n };\n\n /**\n * Expand or collapse the filter config panel.\n *\n * @private\n * @method _toggleExpandFilters\n * @param {Event} event\n */\n GradingNavigation.prototype._toggleExpandFilters = function(event) {\n event.preventDefault();\n var toggleLink = $(event.target).closest('[data-region=\"user-filters\"]');\n var expanded = toggleLink.attr('aria-expanded') == 'true';\n var configPanel = $(document.getElementById(toggleLink.attr('aria-controls')));\n\n if (expanded) {\n configPanel.hide();\n configPanel.attr('aria-hidden', 'true');\n toggleLink.attr('aria-expanded', 'false');\n $(document).unbind('click.mod_assign_grading_navigation');\n } else {\n configPanel.css('display', 'inline-block');\n configPanel.attr('aria-hidden', 'false');\n toggleLink.attr('aria-expanded', 'true');\n event.stopPropagation();\n $(document).on('click.mod_assign_grading_navigation', this._checkClickOutsideConfigureFilters.bind(this));\n }\n };\n\n /**\n * Change to the previous user in the grading list.\n *\n * @private\n * @method _handlePreviousUser\n * @param {Event} e\n */\n GradingNavigation.prototype._handlePreviousUser = function(e) {\n e.preventDefault();\n var select = this._region.find('[data-action=change-user]');\n var currentUserId = select.attr('data-selected');\n var i = 0;\n var currentIndex = 0;\n\n for (i = 0; i < this._filteredUsers.length; i++) {\n if (this._filteredUsers[i].id == currentUserId) {\n currentIndex = i;\n break;\n }\n }\n\n var count = this._filteredUsers.length;\n var newIndex = (currentIndex - 1);\n if (newIndex < 0) {\n newIndex = count - 1;\n }\n\n if (count) {\n this._selectUserById(this._filteredUsers[newIndex].id);\n }\n };\n\n /**\n * Change to the next user in the grading list.\n *\n * @param {Event} e\n * @param {Boolean} saved Has the form already been saved? Skips checking for changes if true.\n */\n GradingNavigation.prototype._handleNextUser = function(e, saved) {\n e.preventDefault();\n var select = this._region.find('[data-action=change-user]');\n var currentUserId = select.attr('data-selected');\n var i = 0;\n var currentIndex = 0;\n\n for (i = 0; i < this._filteredUsers.length; i++) {\n if (this._filteredUsers[i].id == currentUserId) {\n currentIndex = i;\n break;\n }\n }\n\n var count = this._filteredUsers.length;\n var newIndex = (currentIndex + 1) % count;\n\n if (saved && count) {\n // If we've already saved the grade, skip checking if we've made any changes.\n var userid = this._filteredUsers[newIndex].id;\n var useridnumber = parseInt(userid, 10);\n select.attr('data-selected', userid);\n if (!isNaN(useridnumber) && useridnumber > 0) {\n $(document).trigger('user-changed', userid);\n }\n } else if (count) {\n this._selectUserById(this._filteredUsers[newIndex].id);\n }\n };\n\n /**\n * Set count string. This method only sets the value for the last time it was ever called to deal\n * with promises that return in a non-predictable order.\n *\n * @private\n * @method _setCountString\n * @param {Number} x\n * @param {Number} y\n */\n GradingNavigation.prototype._setCountString = function(x, y) {\n var updateNumber = 0;\n this._lastXofYUpdate++;\n updateNumber = this._lastXofYUpdate;\n\n var param = {x: x, y: y};\n str.get_string('xofy', 'mod_assign', param).done(function(s) {\n if (updateNumber == this._lastXofYUpdate) {\n this._region.find('[data-region=\"user-count-summary\"]').text(s);\n }\n }.bind(this)).fail(notification.exception);\n };\n\n /**\n * Rebuild the x of y string.\n *\n * @private\n * @method _refreshCount\n */\n GradingNavigation.prototype._refreshCount = function() {\n var select = this._region.find('[data-action=change-user]');\n var userid = select.attr('data-selected');\n var i = 0;\n var currentIndex = 0;\n\n if (isNaN(userid) || userid <= 0) {\n this._region.find('[data-region=\"user-count\"]').hide();\n } else {\n this._region.find('[data-region=\"user-count\"]').show();\n\n for (i = 0; i < this._filteredUsers.length; i++) {\n if (this._filteredUsers[i].id == userid) {\n currentIndex = i;\n break;\n }\n }\n var count = this._filteredUsers.length;\n if (count) {\n currentIndex += 1;\n }\n this._setCountString(currentIndex, count);\n // Update window URL\n if (currentIndex > 0) {\n var url = new URL(window.location);\n if (parseInt(url.searchParams.get('blindid')) > 0) {\n var newid = this._filteredUsers[currentIndex - 1].recordid;\n url.searchParams.set('blindid', newid);\n } else {\n url.searchParams.set('userid', userid);\n }\n // We do this so a browser refresh will return to the same user.\n window.history.replaceState({}, \"\", url);\n }\n }\n };\n\n /**\n * Respond to a user-changed event by updating the selector.\n *\n * @private\n * @method _refreshSelector\n * @param {Event} event\n * @param {String} userid\n */\n GradingNavigation.prototype._refreshSelector = function(event, userid) {\n var select = this._region.find('[data-action=change-user]');\n userid = parseInt(userid, 10);\n\n if (!isNaN(userid) && userid > 0) {\n select.attr('data-selected', userid);\n }\n this._refreshCount();\n };\n\n /**\n * Trigger the next user event depending on the number of filtered users\n *\n * @private\n * @method _triggerNextUserEvent\n */\n GradingNavigation.prototype._triggerNextUserEvent = function() {\n if (this._filteredUsers.length > 1) {\n $(document).trigger('next-user', {nextUserId: null, nextUser: true});\n } else {\n $(document).trigger('next-user', {nextUser: false});\n }\n };\n\n /**\n * Change to a different user in the grading list.\n *\n * @private\n * @method _handleChangeUser\n */\n GradingNavigation.prototype._handleChangeUser = function() {\n var select = this._region.find('[data-action=change-user]');\n var userid = parseInt(select.val(), 10);\n\n if (this._isLoading) {\n return;\n }\n if (checker.checkFormForChanges('[data-region=\"grade-panel\"] .gradeform')) {\n // Form has changes, so we need to confirm before switching users.\n str.get_strings([\n {key: 'unsavedchanges', component: 'mod_assign'},\n {key: 'unsavedchangesquestion', component: 'mod_assign'},\n {key: 'saveandcontinue', component: 'mod_assign'},\n {key: 'cancel', component: 'core'},\n ]).done(function(strs) {\n notification.confirm(strs[0], strs[1], strs[2], strs[3], function() {\n $(document).trigger('save-changes', userid);\n });\n });\n } else {\n if (!isNaN(userid) && userid > 0) {\n select.attr('data-selected', userid);\n\n $(document).trigger('user-changed', userid);\n }\n }\n };\n\n return GradingNavigation;\n});\n"],"names":["define","$","notification","str","autocomplete","ajax","checker","GradingNavigation","selector","_regionSelector","_region","_filters","_users","_filteredUsers","_lastXofYUpdate","_firstLoadUsers","_loadAllUsers","find","on","this","_handlePreviousUser","bind","_handleNextUser","_handleChangeUser","_toggleExpandFilters","document","_refreshSelector","toggleLink","getElementById","attr","_filterChanged","userid","data","_selectUserById","get_string","done","s","enhance","fail","exception","_isLoading","prototype","_lastFilters","select","assignmentid","groupid","filterPanel","filter","val","workflowFilter","markerFilter","call","methodname","args","assignid","onlyids","tablesort","_usersLoaded","users","length","trigger","_selectNoUser","_triggerNextUserEvent","_checkClickOutsideConfigureFilters","event","configPanel","is","target","has","hide","unbind","_updateFilterPreferences","userId","filterList","preferenceNames","preferences","i","deferred","Deferred","resolve","newValue","push","name","value","filters","each","idx","ele","element","prop","filterlist","text","join","currentUserID","parseInt","foundIndex","index","user","id","_refreshCount","checkFormForChanges","get_strings","key","component","strs","confirm","useridnumber","isNaN","preventDefault","closest","expanded","css","stopPropagation","e","currentUserId","currentIndex","count","newIndex","saved","_setCountString","x","y","updateNumber","param","show","url","URL","window","location","searchParams","get","newid","recordid","set","history","replaceState","nextUserId","nextUser"],"mappings":"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"}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists