1 |
efrain |
1 |
{"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":"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"}
|