Proyectos de Subversion Moodle

Rev

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-filetypesbrowser=\"' + 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.browserModal.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=\"checkbox\"][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 (group 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 populate 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.push({\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-filetypesbrowserkey!=\"*\"]');\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","hideOrShowItemsDependingOnAllowAll","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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"}