AutorÃa | Ultima modificación | Ver Log |
YUI.add('moodle-form-shortforms', function (Y, NAME) {
/**
* Provides the form shortforms class.
*
* @module moodle-form-shortforms
*/
/**
* A class for a shortforms.
*
* @class M.form.shortforms
* @constructor
* @extends Base
*/
function SHORTFORMS() {
SHORTFORMS.superclass.constructor.apply(this, arguments);
}
var SELECTORS = {
COLLAPSED: '.collapsed',
FIELDSETCOLLAPSIBLE: 'fieldset.collapsible',
FIELDSETLEGENDLINK: 'fieldset.collapsible .fheader',
FHEADER: '.fheader',
LEGENDFTOGGLER: 'legend.ftoggler'
},
CSS = {
COLLAPSEALL: 'collapse-all',
COLLAPSED: 'collapsed',
FHEADER: 'fheader'
},
ATTRS = {};
/**
* The form ID attribute definition.
*
* @attribute formid
* @type String
* @default ''
* @writeOnce
*/
ATTRS.formid = {
value: null
};
Y.extend(SHORTFORMS, Y.Base, {
/**
* A reference to the form.
*
* @property form
* @protected
* @type Node
* @default null
*/
form: null,
/**
* The initializer for the shortforms instance.
*
* @method initializer
* @protected
*/
initializer: function() {
var form = Y.one('#' + this.get('formid'));
if (!form) {
return;
}
// Stores the form in the object.
this.form = form;
// Subscribe collapsible fieldsets and buttons to click events.
form.delegate('click', this.switch_state, SELECTORS.FIELDSETLEGENDLINK, this);
// Handle event, when there's an error in collapsed section.
Y.Global.on(M.core.globalEvents.FORM_ERROR, this.expand_fieldset, this);
},
/**
* Set the collapsed state for the specified fieldset.
*
* @method set_state
* @param {Node} fieldset The Node relating to the fieldset to set state on.
* @param {Boolean} [collapsed] Whether the fieldset is collapsed.
* @chainable
*/
set_state: function(fieldset, collapsed) {
var headerlink = fieldset.one(SELECTORS.FHEADER);
if (collapsed) {
fieldset.addClass(CSS.COLLAPSED);
if (headerlink) {
headerlink.setAttribute('aria-expanded', 'false');
}
} else {
fieldset.removeClass(CSS.COLLAPSED);
if (headerlink) {
headerlink.setAttribute('aria-expanded', 'true');
}
}
var statuselement = this.form.one('input[name=mform_isexpanded_' + fieldset.get('id') + ']');
if (!statuselement) {
return this;
}
statuselement.set('value', collapsed ? 0 : 1);
return this;
},
/**
* Toggle the state for the fieldset that was clicked.
*
* @method switch_state
* @param {EventFacade} e
*/
switch_state: function(e) {
e.preventDefault();
var fieldset = e.target.ancestor(SELECTORS.FIELDSETCOLLAPSIBLE);
this.set_state(fieldset, !fieldset.hasClass(CSS.COLLAPSED));
},
/**
* Expand the fieldset, which contains an error.
*
* @method expand_fieldset
* @param {EventFacade} e
*/
expand_fieldset: function(e) {
e.stopPropagation();
var formid = e.formid;
if (formid === this.form.getAttribute('id')) {
var errorfieldset = Y.one('#' + e.elementid).ancestor('fieldset');
if (errorfieldset) {
this.set_state(errorfieldset, false);
}
}
}
}, {
NAME: 'moodle-form-shortforms',
ATTRS: ATTRS
});
M.form = M.form || {};
M.form.shortforms = M.form.shortforms || function(params) {
return new SHORTFORMS(params);
};
}, '@VERSION@', {"requires": ["node", "base", "selector-css3", "moodle-core-event"]});