diff options
Diffstat (limited to 'platform/www/lib/plugins/bureaucracy/script/fieldsets.js')
-rw-r--r-- | platform/www/lib/plugins/bureaucracy/script/fieldsets.js | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/bureaucracy/script/fieldsets.js b/platform/www/lib/plugins/bureaucracy/script/fieldsets.js new file mode 100644 index 0000000..2a3c12d --- /dev/null +++ b/platform/www/lib/plugins/bureaucracy/script/fieldsets.js @@ -0,0 +1,84 @@ +/** + * Handle display of dependent, i. e. optional fieldsets + * + * Fieldsets may be defined as dependent on the value of a certain input. In + * this case they contain a p element with the CSS class “bureaucracy_depends”. + * This p element holds a span with the class “bureaucracy_depends_fname” + * and optionally another span with “bureaucracy_depends_fvalue”. They + * specify the target input (fname) and the target value for which the fieldset + * is to be shown. + * + * This function adds onchange handlers to the relevant inputs for showing and + * heading the respective fieldsets. + * + * @author Adrian Lang <dokuwiki@cosmocode.de> + **/ + +jQuery(function () { + + jQuery('form.bureaucracy__plugin').each(function () { + + //show/hide fieldset and trigger depending children + function updateFieldset(input) { + jQuery.each(jQuery(input).data('dparray'), function (i, dp) { + var showOrHide = + input.parentNode.parentNode.style.display !== 'none' && // input/checkbox is displayed AND + ((input.checked === dp.tval) || // ( checkbox is checked + (input.type !== 'checkbox' && (dp.tval === true && input.value !== '')) || // OR no checkbox, but input is set + input.value === dp.tval); // OR input === dp.tval ) + + dp.fset.toggle(showOrHide); + + dp.fset.find('input,select') + .each(function () { + //toggle required attribute + var $inputelem = jQuery(this); + if($inputelem.hasClass('required')) { + if(showOrHide) { + $inputelem.attr('required', 'required'); + } else { + $inputelem.removeAttr('required') + } + } + //update dependencies + if ($inputelem.data('dparray')) { + $inputelem.change(); + } + }); + }); + } + + //look for p (with info about controller) in depending fieldsets + jQuery('p.bureaucracy_depends', this) + .each(function () { + //get controller info + var fname = jQuery(this).find('span.bureaucracy_depends_fname').html(), + fvalue = jQuery(this).find('span.bureaucracy_depends_fvalue'); + fvalue = (fvalue.length ? fvalue.html() : true); + + //get controller field and add info and change event to the input that controls depending fieldset + var fieldsetinfo = { + fset: jQuery(this).parent(), + tval: fvalue + }; + + jQuery("label") + .has(":first-child:contains('" + fname + "')").first() + .find("select,input:last") //yesno field contains first a hidden input + .each(function () { + if (!jQuery(this).data('dparray')) { + jQuery(this).data('dparray', [fieldsetinfo]); + } else { + jQuery(this).data('dparray').push(fieldsetinfo); + } + }) + .bind('change keyup', function () { + updateFieldset(this); + }) + .change(); + + }) + .hide(); //hide p.bureaucracy_depends in fieldset + + }); +}); |