enketo-core
Version:
Extensible Enketo form engine
49 lines (45 loc) • 1.64 kB
JavaScript
// @ts-check
/**
* @typedef {import('../form').Form} Form
*/
/**
* Detects statically identifiable (during init) features which may used by a
* given form, allowing forms without certain features to skip
* unused-but-expensive functionality.
*
* @param {HTMLFormElement} formElement
*/
export const detectFeatures = (formElement) => {
const action = formElement.querySelector('.action') != null;
const calculate =
action || formElement.querySelector('[data-calculate]') != null;
const instanceFirstLoadAction =
action && formElement.querySelector('.odk-instance-first-load') != null;
const itemset = formElement.querySelector('.itemset-template') != null;
const newRepeatAction =
action && formElement.querySelector('.odk-new-repeat') != null;
const output = formElement.querySelector('.or-output') != null;
const pagination = formElement.classList.contains('pages');
const relevant = formElement.querySelector('[data-relevant]') != null;
const repeat = formElement.querySelector('.or-repeat') != null;
const repeatCount =
repeat &&
formElement.querySelector('.or-repeat-info[data-repeat-count]') != null;
const required = formElement.querySelector('[data-required]') != null;
const valueChangedAction =
formElement.querySelector('.xforms-value-changed') != null;
return {
action,
calculate,
instanceFirstLoadAction,
itemset,
newRepeatAction,
output,
pagination,
relevant,
repeatCount,
repeat,
required,
valueChangedAction,
};
};