AutorÃa | Ultima modificación | Ver Log |
{"version":3,"file":"filetypes.min.js","sources":["../src/filetypes.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 * This module allows to enhance the form elements MoodleQuickForm_filetypes\n *\n * @module core_form/filetypes\n * @copyright 2017 David Mudrak <david@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU
GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery', 'core/log', 'core/modal_events', 'core/modal_save_cancel', 'core/ajax',\n 'core/templates', 'core/tree'],\n function($, Log, ModalEvents, ModalSaveCancel, Ajax, Templates, Tree) {\n\n \"use strict\";\n\n /**\n * Constructor of the FileTypes instances.\n *\n * @constructor\n * @param {String} elementId The id of the form element to enhance\n * @param {String} elementLabel The label of the form element used as the modal selector title\n * @param {String} onlyTypes Limit the list of offered types to this\n * @param {Bool} allowAll Allow presence of the \"All file types\" item\n */\n var FileTypes = function(elementId, elementLabel, onlyTypes, allowAll) {\n\n this.elementId = elementId;\n this.elementLabel = elementLabel;\n this.onlyTypes = onlyTypes;\n this.allowAll = allowAll;\n\n this.inputField = $('#' + elementId);\n this.wrapperBrowserTrigger = $('[data-fi
letypesbrowser=\"' + elementId + '\"]');\n this.wrapperDescriptions = $('[data-filetypesdescriptions=\"' + elementId + '\"]');\n\n if (!this.wrapperBrowserTrigger.length) {\n // This is a valid case. Most probably the element is frozen and\n // the filetypes browser should not be available.\n return;\n }\n\n if (!this.inputField.length || !this.wrapperDescriptions.length) {\n Log.error('core_form/filetypes: Unexpected DOM structure, unable to enhance filetypes field ' + elementId);\n return;\n }\n\n this.prepareBrowserTrigger()\n .then(function() {\n return this.prepareBrowserModal();\n }.bind(this))\n\n .then(function() {\n return this.prepareBrowserTree();\n }.bind(this));\n };\n\n /**\n * Create and set the browser trigger widget (this.browserTrigger).\n *\n * @method prepareBrowserTrigger\n * @returns {Promise}\n
*/\n FileTypes.prototype.prepareBrowserTrigger = function() {\n return Templates.render('core_form/filetypes-trigger', {})\n .then(function(html) {\n this.wrapperBrowserTrigger.html(html);\n this.browserTrigger = this.wrapperBrowserTrigger.find('[data-filetypeswidget=\"browsertrigger\"]');\n }.bind(this));\n };\n\n /**\n * Create and set the modal for displaying the browser (this.browserModal).\n *\n * @method prepareBrowserModal\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserModal = function() {\n return ModalSaveCancel.create({\n title: this.elementLabel,\n })\n .then(function(modal) {\n this.browserModal = modal;\n return modal;\n }.bind(this))\n .then(function() {\n // Because we have custom conditional modal trigger, we need to\n // handle the focus after closing ourselves, too.\n this.browserMo
dal.getRoot().on(ModalEvents.hidden, function() {\n this.browserTrigger.focus();\n }.bind(this));\n\n this.browserModal.getRoot().on(ModalEvents.save, function() {\n this.saveBrowserModal();\n }.bind(this));\n }.bind(this));\n\n };\n\n /**\n * Create and set the tree in the browser modal's body.\n *\n * @method prepareBrowserTree\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserTree = function() {\n\n this.browserTrigger.on('click', function(e) {\n e.preventDefault();\n\n // We want to display the browser modal only when the associated input\n // field is not frozen (disabled).\n if (this.inputField.is('[disabled]')) {\n return;\n }\n\n var bodyContent = this.loadBrowserModalBody();\n\n bodyContent.then(function() {\n\n // Turn the list of groups and extensions into the tree.\n
this.browserTree = new Tree(this.browserModal.getBody());\n\n // Override the behaviour of the Enter and Space keys to toggle our checkbox,\n // rather than toggle the tree node expansion status.\n this.browserTree.handleKeyDown = function(item, e) {\n if (e.keyCode == this.browserTree.keys.enter || e.keyCode == this.browserTree.keys.space) {\n e.preventDefault();\n e.stopPropagation();\n this.toggleCheckbox(item.attr('data-filetypesbrowserkey'));\n } else {\n Tree.prototype.handleKeyDown.call(this.browserTree, item, e);\n }\n }.bind(this);\n\n if (this.allowAll) {\n // Hide all other items if \"All file types\" is enabled.\n this.hideOrShowItemsDependingOnAllowAll(this.browserModal.getRoot()\n .find('input[type=\"check
box\"][data-filetypesbrowserkey=\"*\"]').first());\n // And do the same whenever we click that checkbox.\n this.browserModal.getRoot().on('change', 'input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]', function(e) {\n this.hideOrShowItemsDependingOnAllowAll($(e.currentTarget));\n }.bind(this));\n }\n\n // Synchronize checked status if the file extension is present in multiple groups.\n this.browserModal.getRoot().on('change', 'input[type=\"checkbox\"][data-filetypesbrowserkey]', function(e) {\n var checkbox = $(e.currentTarget);\n var key = checkbox.attr('data-filetypesbrowserkey');\n this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"' + key + '\"]')\n .prop('checked', checkbox.prop('checked'));\n }.bind(this));\n\n }.bind(this))\n\n
.then(function() {\n this.browserModal.show();\n }.bind(this));\n\n this.browserModal.setBody(bodyContent);\n\n }.bind(this));\n\n // Return a resolved promise.\n return $.when();\n };\n\n /**\n * Load the browser modal body contents.\n *\n * @returns {Promise}\n */\n FileTypes.prototype.loadBrowserModalBody = function() {\n\n var args = {\n onlytypes: this.onlyTypes.join(),\n allowall: this.allowAll,\n current: this.inputField.val()\n };\n\n return Ajax.call([{\n methodname: 'core_form_get_filetypes_browser_data',\n args: args\n\n }])[0].then(function(browserData) {\n return Templates.render('core_form/filetypes-browser', {\n elementid: this.elementId,\n groups: browserData.groups\n });\n }.bind(this));\n };\n\n /**\n * Change the checked status of the given file type (gr
oup or extension).\n *\n * @method toggleCheckbox\n * @param {String} key\n */\n FileTypes.prototype.toggleCheckbox = function(key) {\n\n var checkbox = this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"' + key + '\"]').first();\n\n checkbox.prop('checked', !checkbox.prop('checked'));\n };\n\n /**\n * Update the associated input field with selected file types.\n *\n * @method saveBrowserModal\n */\n FileTypes.prototype.saveBrowserModal = function() {\n\n // Check the \"All file types\" first.\n if (this.allowAll) {\n var allcheckbox = this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]');\n if (allcheckbox.length && allcheckbox.prop('checked')) {\n this.inputField.val('*');\n this.updateDescriptions(['*']);\n return;\n }\n }\n\n // Iterate over all checked boxes and populat
e the list.\n var newvalue = [];\n\n this.browserModal.getRoot().find('input[type=\"checkbox\"]').each(/** @this represents the checkbox */ function() {\n var checkbox = $(this);\n var key = checkbox.attr('data-filetypesbrowserkey');\n\n if (checkbox.prop('checked')) {\n newvalue.push(key);\n }\n });\n\n // Remove duplicates (e.g. file types present in multiple groups).\n newvalue = newvalue.filter(function(x, i, a) {\n return a.indexOf(x) == i;\n });\n\n this.inputField.val(newvalue.join(' '));\n this.updateDescriptions(newvalue);\n };\n\n /**\n * Describe the selected filetypes in the form when saving the browser.\n *\n * @param {Array} keys List of keys to describe\n * @returns {Promise}\n */\n FileTypes.prototype.updateDescriptions = function(keys) {\n\n var descriptions = [];\n\n keys.forEach(function(key) {\n descriptions.pus
h({\n description: this.browserModal.getRoot().find('[data-filetypesname=\"' + key + '\"]').first().text().trim(),\n extensions: this.browserModal.getRoot().find('[data-filetypesextensions=\"' + key + '\"]').first().text().trim()\n });\n }.bind(this));\n\n var templatedata = {\n hasdescriptions: (descriptions.length > 0),\n descriptions: descriptions\n };\n\n return Templates.render('core_form/filetypes-descriptions', templatedata)\n .then(function(html) {\n this.wrapperDescriptions.html(html);\n }.bind(this));\n };\n\n /**\n * If \"All file types\" is checked, all other browser items are made hidden, and vice versa.\n *\n * @param {jQuery} allcheckbox The \"All file types\" checkbox.\n */\n FileTypes.prototype.hideOrShowItemsDependingOnAllowAll = function(allcheckbox) {\n var others = this.browserModal.getRoot().find('[role=\"treeitem\"][data-filetyp
esbrowserkey!=\"*\"]');\n if (allcheckbox.prop('checked')) {\n others.hide();\n } else {\n others.show();\n }\n };\n\n return {\n init: function(elementId, elementLabel, onlyTypes, allowAll) {\n new FileTypes(elementId, elementLabel, onlyTypes, allowAll);\n }\n };\n});\n"],"names":["define","$","Log","ModalEvents","ModalSaveCancel","Ajax","Templates","Tree","FileTypes","elementId","elementLabel","onlyTypes","allowAll","inputField","wrapperBrowserTrigger","wrapperDescriptions","this","length","prepareBrowserTrigger","then","prepareBrowserModal","bind","prepareBrowserTree","error","prototype","render","html","browserTrigger","find","create","title","modal","browserModal","getRoot","on","hidden","focus","save","saveBrowserModal","e","preventDefault","is","bodyContent","loadBrowserModalBody","browserTree","getBody","handleKeyDown","item","keyCode","keys","enter","space","stopPropagation","toggleCheckbox","attr","call","hideOrShowItemsDe
pendingOnAllowAll","first","currentTarget","checkbox","key","prop","show","setBody","when","args","onlytypes","join","allowall","current","val","methodname","browserData","elementid","groups","allcheckbox","updateDescriptions","newvalue","each","push","filter","x","i","a","indexOf","descriptions","forEach","description","text","trim","extensions","templatedata","hasdescriptions","others","hide","init"],"mappings":"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"}