summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/bureaucracy/script/fieldsets.js
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/bureaucracy/script/fieldsets.js')
-rw-r--r--platform/www/lib/plugins/bureaucracy/script/fieldsets.js84
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
+
+ });
+});