Proyectos de Subversion Moodle

Rev

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

{"version":3,"file":"showadvanced.min.js","sources":["../src/showadvanced.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 * A class to help show and hide advanced form content.\n *\n * @module     core_form/showadvanced\n * @copyright  2016 Damyon Wiese <damyon@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/str', 'core/notification'], function($, Log, Strings, Notification) {\n\n    var SELECTORS = {\n            FIELDSETCONTAINSADVANCED: 'fieldset.containsadvancedelements',\n            DIVFITEMADVANCED: 'div.fitem.advanced',\n            DIVADVANCEDSECTION: 'div#form-advanced-div',\n            DIVFCONTAINER: 'div.fcontainer',\n            MORELESSLINK: 'fieldset.containsadvancedelements .moreless-toggler'\n        },\n        CSS = {\n            SHOW: 'show',\n            MORELESSACTIONS: 'moreless-actions',\n            MORELESSTOGGLER: 'moreless-toggler',\n            SHOWLESS: 'moreless-less'\n        },\n        WRAPPERS = {\n            FITEM: '<div class=\"fitem\"></div>',\n            FELEMENT: '<div class=\"felement\"></div>',\n            ADVANCEDDIV: '<div id=\"form-advanced-div\"></div>'\n        },\n        IDPREFIX = 'showadvancedid-';\n\n    /** @property {Integer} uniqIdSeed Auto incrementing number used to generate ids. */\n    var uniqIdSeed = 0;\n\n    /**\n     * ShowAdvanced behaviour class.\n     *\n     * @class core_form/showadvanced\n     * @param {String} id The id of the form.\n     */\n    var ShowAdvanced = function(id) {\n        this.id = id;\n\n        var form = $(document.getElementById(id));\n        this.enhanceForm(form);\n    };\n\n    /** @property {String} id The form id to enhance. */\n    ShowAdvanced.prototype.id = '';\n\n    /**\n     * @method enhanceForm\n     * @param {JQuery} form JQuery selector representing the form\n     * @return {ShowAdvanced}\n     */\n    ShowAdvanced.prototype.enhanceForm = function(form) {\n        var fieldsets = form.find(SELECTORS.FIELDSETCONTAINSADVANCED);\n\n        // Enhance each fieldset in the form matching the selector.\n        fieldsets.each(function(index, item) {\n            this.enhanceFieldset($(item));\n        }.bind(this));\n\n        // Attach some event listeners.\n        // Subscribe more/less links to click event.\n        form.on('click', SELECTORS.MORELESSLINK, this.switchState);\n\n        // Subscribe to key events but filter for space or enter.\n        form.on('keydown', SELECTORS.MORELESSLINK, function(e) {\n            // Enter or space.\n            if (e.which == 13 || e.which == 32) {\n                return this.switchState(e);\n            }\n            return true;\n        }.bind(this));\n        return this;\n    };\n\n\n    /**\n     * Generates a uniq id for the dom element it's called on unless the element already has an id.\n     * The id is set on the dom node before being returned.\n     *\n     * @method generateId\n     * @param {JQuery} node JQuery selector representing a single DOM Node.\n     * @return {String}\n     */\n    ShowAdvanced.prototype.generateId = function(node) {\n        var id = node.prop('id');\n        if (typeof id === 'undefined') {\n            id = IDPREFIX + (uniqIdSeed++);\n            node.prop('id', id);\n        }\n        return id;\n    };\n\n    /**\n     * @method enhanceFieldset\n     * @param {JQuery} fieldset JQuery selector representing a fieldset\n     * @return {ShowAdvanced}\n     */\n    ShowAdvanced.prototype.enhanceFieldset = function(fieldset) {\n        var statuselement = $('input[name=mform_showmore_' + fieldset.prop('id') + ']');\n        if (!statuselement.length) {\n            Log.debug(\"M.form.showadvanced::processFieldset was called on an fieldset without a status field: '\" +\n                fieldset.prop('id') + \"'\");\n            return this;\n        }\n\n        // Fetch some strings.\n        Strings.get_strings([{\n            key: 'showmore',\n            component: 'core_form'\n        }, {\n            key: 'showless',\n            component: 'core_form'\n        }]).then(function(results) {\n            var showmore = results[0],\n                showless = results[1];\n\n            // Generate more/less links.\n            var morelesslink = $('<a href=\"#\"></a>');\n            morelesslink.addClass(CSS.MORELESSTOGGLER);\n            if (statuselement.val() === '0') {\n                morelesslink.html(showmore);\n                morelesslink.attr('aria-expanded', 'false');\n            } else {\n                morelesslink.html(showless);\n                morelesslink.attr('aria-expanded', 'true');\n                morelesslink.addClass(CSS.SHOWLESS);\n                fieldset.find(SELECTORS.DIVFITEMADVANCED).addClass(CSS.SHOW);\n            }\n            // Build a list of advanced fieldsets.\n            var idlist = [];\n            fieldset.find(SELECTORS.DIVFITEMADVANCED).each(function(index, node) {\n                idlist[idlist.length] = this.generateId($(node));\n            }.bind(this));\n\n            // Set aria attributes.\n            morelesslink.attr('role', 'button');\n            morelesslink.attr('aria-controls', 'form-advanced-div');\n\n            var formadvancedsection = $(WRAPPERS.ADVANCEDDIV);\n            fieldset.find(SELECTORS.DIVFITEMADVANCED).wrapAll(formadvancedsection);\n            // Add elements to the DOM.\n            var fitem = $(WRAPPERS.FITEM);\n            fitem.addClass(CSS.MORELESSACTIONS);\n            var felement = $(WRAPPERS.FELEMENT);\n            felement.append(morelesslink);\n            fitem.append(felement);\n\n            fieldset.find(SELECTORS.DIVADVANCEDSECTION).before(fitem);\n            return true;\n        }.bind(this)).fail(Notification.exception);\n\n        return this;\n    };\n\n    /**\n     * @method switchState\n     * @param {Event} e Event that triggered this action.\n     * @return {Boolean}\n     */\n    ShowAdvanced.prototype.switchState = function(e) {\n        e.preventDefault();\n\n        // Fetch some strings.\n        Strings.get_strings([{\n            key: 'showmore',\n            component: 'core_form'\n        }, {\n            key: 'showless',\n            component: 'core_form'\n        }]).then(function(results) {\n            var showmore = results[0],\n                showless = results[1],\n                fieldset = $(e.target).closest(SELECTORS.FIELDSETCONTAINSADVANCED);\n\n            // Toggle collapsed class.\n            fieldset.find(SELECTORS.DIVFITEMADVANCED).toggleClass(CSS.SHOW);\n\n            // Get corresponding hidden variable.\n            var statuselement = $('input[name=mform_showmore_' + fieldset.prop('id') + ']');\n\n            // Invert it and change the link text.\n            if (statuselement.val() === '0') {\n                statuselement.val(1);\n                $(e.target).addClass(CSS.SHOWLESS);\n                $(e.target).html(showless);\n                $(e.target).attr('aria-expanded', 'true');\n            } else {\n                statuselement.val(0);\n                $(e.target).removeClass(CSS.SHOWLESS);\n                $(e.target).html(showmore);\n                $(e.target).attr('aria-expanded', 'false');\n            }\n            return true;\n        }).fail(Notification.exception);\n\n        return this;\n    };\n\n    return {\n        /**\n         * Initialise this module.\n         * @method init\n         * @param {String} formid\n         * @return {ShowAdvanced}\n         */\n        init: function(formid) {\n            return new ShowAdvanced(formid);\n        }\n    };\n});\n"],"names":["define","$","Log","Strings","Notification","SELECTORS","CSS","WRAPPERS","uniqIdSeed","ShowAdvanced","id","form","document","getElementById","enhanceForm","prototype","find","each","index","item","enhanceFieldset","bind","this","on","switchState","e","which","generateId","node","prop","fieldset","statuselement","length","get_strings","key","component","then","results","showmore","showless","morelesslink","addClass","val","html","attr","idlist","formadvancedsection","wrapAll","fitem","felement","append","before","fail","exception","debug","preventDefault","target","closest","toggleClass","removeClass","init","formid"],"mappings":";;;;;;;AAsBAA,gCAAO,CAAC,SAAU,WAAY,WAAY,sBAAsB,SAASC,EAAGC,IAAKC,QAASC,kBAElFC,mCAC8B,oCAD9BA,2BAEsB,qBAFtBA,6BAGwB,wBAHxBA,uBAKkB,sDAElBC,SACU,OADVA,oBAEqB,mBAFrBA,oBAGqB,mBAHrBA,aAIc,gBAEdC,eACW,4BADXA,kBAEc,+BAFdA,qBAGiB,qCAKjBC,WAAa,EAQbC,aAAe,SAASC,SACnBA,GAAKA,OAENC,KAAOV,EAAEW,SAASC,eAAeH,UAChCI,YAAYH,cAIrBF,aAAaM,UAAUL,GAAK,GAO5BD,aAAaM,UAAUD,YAAc,SAASH,aAC1BA,KAAKK,KAAKX,oCAGhBY,KAAK,SAASC,MAAOC,WACtBC,gBAAgBnB,EAAEkB,QACzBE,KAAKC,OAIPX,KAAKY,GAAG,QAASlB,uBAAwBiB,KAAKE,aAG9Cb,KAAKY,GAAG,UAAWlB,uBAAwB,SAASoB,UAEjC,IAAXA,EAAEC,OAA0B,IAAXD,EAAEC,OACZJ,KAAKE,YAAYC,IAG9BJ,KAAKC,OACAA,MAYXb,aAAaM,UAAUY,WAAa,SAASC,UACrClB,GAAKkB,KAAKC,KAAK,kBACD,IAAPnB,KACPA,GA7DO,kBA6DUF,aACjBoB,KAAKC,KAAK,KAAMnB,KAEbA,IAQXD,aAAaM,UAAUK,gBAAkB,SAASU,cAC1CC,cAAgB9B,EAAE,6BAA+B6B,SAASD,KAAK,MAAQ,YACtEE,cAAcC,QAOnB7B,QAAQ8B,YAAY,CAAC,CACjBC,IAAK,WACLC,UAAW,aACZ,CACCD,IAAK,WACLC,UAAW,eACXC,KAAK,SAASC,aACVC,SAAWD,QAAQ,GACnBE,SAAWF,QAAQ,GAGnBG,aAAevC,EAAE,oBACrBuC,aAAaC,SAASnC,qBACM,MAAxByB,cAAcW,OACdF,aAAaG,KAAKL,UAClBE,aAAaI,KAAK,gBAAiB,WAEnCJ,aAAaG,KAAKJ,UAClBC,aAAaI,KAAK,gBAAiB,QACnCJ,aAAaC,SAASnC,cACtBwB,SAASd,KAAKX,4BAA4BoC,SAASnC,eAGnDuC,OAAS,GACbf,SAASd,KAAKX,4BAA4BY,KAAK,SAASC,MAAOU,MAC3DiB,OAAOA,OAAOb,QAAUV,KAAKK,WAAW1B,EAAE2B,QAC5CP,KAAKC,OAGPkB,aAAaI,KAAK,OAAQ,UAC1BJ,aAAaI,KAAK,gBAAiB,yBAE/BE,oBAAsB7C,EAAEM,sBAC5BuB,SAASd,KAAKX,4BAA4B0C,QAAQD,yBAE9CE,MAAQ/C,EAAEM,gBACdyC,MAAMP,SAASnC,yBACX2C,SAAWhD,EAAEM,0BACjB0C,SAASC,OAAOV,cAChBQ,MAAME,OAAOD,UAEbnB,SAASd,KAAKX,8BAA8B8C,OAAOH,QAC5C,GACT3B,KAAKC,OAAO8B,KAAKhD,aAAaiD,WAEzB/B,OAnDHpB,IAAIoD,MAAM,2FACNxB,SAASD,KAAK,MAAQ,KACnBP,OAyDfb,aAAaM,UAAUS,YAAc,SAASC,UAC1CA,EAAE8B,iBAGFpD,QAAQ8B,YAAY,CAAC,CACjBC,IAAK,WACLC,UAAW,aACZ,CACCD,IAAK,WACLC,UAAW,eACXC,MAAK,SAASC,aACVC,SAAWD,QAAQ,GACnBE,SAAWF,QAAQ,GACnBP,SAAW7B,EAAEwB,EAAE+B,QAAQC,QAAQpD,oCAGnCyB,SAASd,KAAKX,4BAA4BqD,YAAYpD,cAGlDyB,cAAgB9B,EAAE,6BAA+B6B,SAASD,KAAK,MAAQ,WAG/C,MAAxBE,cAAcW,OACdX,cAAcW,IAAI,GAClBzC,EAAEwB,EAAE+B,QAAQf,SAASnC,cACrBL,EAAEwB,EAAE+B,QAAQb,KAAKJ,UACjBtC,EAAEwB,EAAE+B,QAAQZ,KAAK,gBAAiB,UAElCb,cAAcW,IAAI,GAClBzC,EAAEwB,EAAE+B,QAAQG,YAAYrD,cACxBL,EAAEwB,EAAE+B,QAAQb,KAAKL,UACjBrC,EAAEwB,EAAE+B,QAAQZ,KAAK,gBAAiB,WAE/B,KACRQ,KAAKhD,aAAaiD,WAEd/B,MAGJ,CAOHsC,KAAM,SAASC,eACJ,IAAIpD,aAAaoD"}