refactor Interactive Fieldset JS utility
This commit is contained in:
parent
0fcafcb618
commit
4ef7d5f93a
@ -177,51 +177,95 @@
|
|||||||
setup: reactiveButtonUtil,
|
setup: reactiveButtonUtil,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Interactive Fieldset Utility
|
||||||
|
* shows/hides inputs based on value of particular input
|
||||||
|
*
|
||||||
|
* Attribute: uw-interactive-fieldset
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* data-conditional-input: string
|
||||||
|
* Selector for the input that this fieldset watches for changes
|
||||||
|
* data-conditional-value: string
|
||||||
|
* The value the conditional input needs to be set to for this fieldset to be shown
|
||||||
|
*
|
||||||
|
* Example usage:
|
||||||
|
* <input id="input-0" type="text">
|
||||||
|
* <fieldset uw-interactive-fieldset data-conditional-input="#input-0" data-conditional-value="yes">...</fieldset>
|
||||||
|
* <fieldset uw-interactive-fieldset data-conditional-input="#input-0" data-conditional-value="no">...</fieldset>
|
||||||
|
* ## example with <select>
|
||||||
|
* <select id="select-0">
|
||||||
|
* <option value="0">Zero
|
||||||
|
* <option value="1">One
|
||||||
|
* <fieldset uw-interactive-fieldset data-conditional-input="#select-0" data-conditional-value="0">...</fieldset>
|
||||||
|
* <fieldset uw-interactive-fieldset data-conditional-input="#select-0" data-conditional-value="1">...</fieldset>
|
||||||
|
*/
|
||||||
|
|
||||||
|
var INTERACTIVE_FIELDSET_UTIL_NAME = 'interactiveFieldset';
|
||||||
|
var INTERACTIVE_FIELDSET_UTIL_SELECTOR = '[uw-interactive-fieldset]';
|
||||||
|
|
||||||
|
var INTERACTIVE_FIELDSET_INITIALIZED_CLASS = 'interactive-fieldset--initialized';
|
||||||
|
|
||||||
window.utils.interactiveFieldset = function(form, options) {
|
var interactiveFieldsetUtil = function(element) {
|
||||||
options = options || {};
|
var conditionalInput;
|
||||||
var fieldSets = options.fieldSets;
|
var conditionalValue;
|
||||||
|
|
||||||
if (!fieldSets) {
|
function init() {
|
||||||
throw new Error('interactiveFieldset must be passed fieldSets via options');
|
if (!element) {
|
||||||
|
throw new Error('Interactive Fieldset utility cannot be setup without an element!');
|
||||||
}
|
}
|
||||||
|
|
||||||
var fields = fieldSets.map(function(fs) {
|
if (element.classList.contains(INTERACTIVE_FIELDSET_INITIALIZED_CLASS)) {
|
||||||
return {
|
throw new Error('Interactive Fieldset utility already initialized!');
|
||||||
fieldSet: fs,
|
}
|
||||||
condId: fs.dataset.conditionalId,
|
|
||||||
condValue: fs.dataset.conditionalValue,
|
|
||||||
condEl: form.querySelector('#' + fs.dataset.conditionalId),
|
|
||||||
};
|
|
||||||
}).filter(function(field) {
|
|
||||||
return !!field.condEl;
|
|
||||||
});
|
|
||||||
|
|
||||||
function updateFields() {
|
// param conditionalInput
|
||||||
fields.forEach(function(field) {
|
if (!element.dataset.conditionalInput) {
|
||||||
field.fieldSet.classList.toggle('hidden', field.condEl.value !== field.condValue);
|
throw new Error('Interactive Fieldset needs a selector for a conditional input!');
|
||||||
});
|
}
|
||||||
|
conditionalInput = document.querySelector(element.dataset.conditionalInput);
|
||||||
|
if (!conditionalInput) {
|
||||||
|
// abort if form has no required inputs
|
||||||
|
throw new Error('Couldn\'t find the conditional input. Aborting setup for interactive fieldset.');
|
||||||
}
|
}
|
||||||
|
|
||||||
function addEventListeners() {
|
// param conditionalValue
|
||||||
fields.forEach(function(field) {
|
if (!element.dataset.conditionalValue) {
|
||||||
field.condEl.addEventListener('input', updateFields)
|
throw new Error('Interactive Fieldset needs a conditional value!');
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
conditionalValue = element.dataset.conditionalValue;
|
||||||
|
|
||||||
if (fieldSets.length) {
|
// add event listener
|
||||||
addEventListeners();
|
conditionalInput.addEventListener('input', updateVisibility);
|
||||||
updateFields();
|
|
||||||
}
|
// initial visibility update
|
||||||
|
updateVisibility();
|
||||||
|
|
||||||
|
// mark as initialized
|
||||||
|
element.classList.add(INTERACTIVE_FIELDSET_INITIALIZED_CLASS);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
scope: form,
|
name: INTERACTIVE_FIELDSET_UTIL_NAME,
|
||||||
|
element: element,
|
||||||
destroy: function() {},
|
destroy: function() {},
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateVisibility() {
|
||||||
|
element.classList.toggle('hidden', conditionalInput.value !== conditionalValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return init();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
formUtilities.push({
|
||||||
|
name: INTERACTIVE_FIELDSET_UTIL_NAME,
|
||||||
|
selector: INTERACTIVE_FIELDSET_UTIL_SELECTOR,
|
||||||
|
setup: interactiveFieldsetUtil,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
window.utils.autoSubmit = function(form, options) {
|
window.utils.autoSubmit = function(form, options) {
|
||||||
var button = form.querySelector(AUTOSUBMIT_BUTTON_SELECTOR);
|
var button = form.querySelector(AUTOSUBMIT_BUTTON_SELECTOR);
|
||||||
if (button) {
|
if (button) {
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<fieldset data-conditional-id="#{fvId actionView}" data-conditional-value="#{toPathPiece act}">
|
<fieldset uw-interactive-fieldset data-conditional-input="##{fvId actionView}" data-conditional-value="#{toPathPiece act}">
|
||||||
<legend>
|
<legend>
|
||||||
_{act}
|
_{act}
|
||||||
^{w}
|
^{w}
|
||||||
|
|||||||
Reference in New Issue
Block a user