Ignore required questions in hidden sections

pull/1/head
yflory 3 years ago
parent fe03da5bdd
commit 9304d7bb2a

@ -2271,7 +2271,7 @@ define([
var getFormResults = function () { var getFormResults = function () {
if (!Array.isArray(APP.formBlocks)) { return; } if (!Array.isArray(APP.formBlocks)) { return; }
var results = {}; var results = {};
APP.formBlocks.forEach(function (data) { APP.formBlocks.some(function (data) {
if (!data.getValue) { return; } if (!data.getValue) { return; }
results[data.uid] = data.getValue(); results[data.uid] = data.getValue();
}); });
@ -2281,6 +2281,104 @@ define([
Messages.form_anonAnswer = "All answers to this form are anonymous"; // XXX Messages.form_anonAnswer = "All answers to this form are anonymous"; // XXX
Messages.form_authAnswer = "You can't answer anonymously to this form"; // XXX Messages.form_authAnswer = "You can't answer anonymously to this form"; // XXX
var getSections = function (content) {
var uids = Object.keys(content.form).filter(function (uid) {
return content.form[uid].type === 'section';
});
return uids;
};
var getSectionFromQ = function (content, uid) {
var arr = content.order;
var idx = content.order.indexOf(uid);
var sectionUid;
if (idx === -1) { // If it's not in the main array, check in sections
getSections(content).some(function (_uid) {
var block = content.form[_uid];
if (!block.opts || !Array.isArray(block.opts.questions)) { return; }
var _idx = block.opts.questions.indexOf(uid);
if (_idx !== -1) {
arr = block.opts.questions;
sectionUid = _uid;
idx = _idx;
return true;
}
});
}
return {
uid: sectionUid,
arr: arr,
idx: idx
};
};
var removeQuestion = function (content, uid) {
delete content.form[uid];
var idx = content.order.indexOf(uid);
if (idx !== -1) {
content.order.splice(idx, 1);
} else {
getSections(content).some(function (_uid) {
var block = content.form[_uid];
if (!block.opts || !Array.isArray(block.opts.questions)) { return; }
var _idx = block.opts.questions.indexOf(uid);
if (_idx !== -1) {
block.opts.questions.splice(_idx, 1);
return true;
}
});
}
};
var getFullOrder = function (content) {
var order = content.order.slice();
getSections(content).forEach(function (uid) {
var block = content.form[uid];
if (!block.opts || !Array.isArray(block.opts.questions)) { return; }
var idx = order.indexOf(uid);
if (idx === -1) { return; }
idx++;
block.opts.questions.forEach(function (el, i) {
order.splice(idx+i, 0, el);
});
});
return order;
};
var checkResults = {};
var checkCondition = function (block) {
if (!block || block.type !== 'section') { return; }
if (!block.opts || !Array.isArray(block.opts.questions) || !block.opts.when) {
return true;
}
// This function may be called multiple times synchronously to check the conditions
// of multiple sections. These sections may require the result of the same question
// so we store the results in an object outside.
// To make sure the results are cleared on the next change in the form, we
// clear it just after the current synchronous actions are done.
setTimeout(function () { checkResults = {}; });
var results = checkResults;
var findResult = function (uid) {
if (results.hasOwnProperty(uid)) { return results[uid]; }
APP.formBlocks.some(function (data) {
if (!data.getValue) { return; }
if (data.uid === uid) {
results[uid] = data.getValue();
return true;
}
});
return results[uid];
};
var w = block.opts.when;
return !w.length || w.some(function (rules) {
return rules.every(function (rule) {
var res = findResult(rule.q);
return rule.is ? res === rule.v
: res !== rule.v;
});
});
};
var makeFormControls = function (framework, content, update, evOnChange) { var makeFormControls = function (framework, content, update, evOnChange) {
var loggedIn = framework._.sfCommon.isLoggedIn(); var loggedIn = framework._.sfCommon.isLoggedIn();
var metadataMgr = framework._.cpNfInner.metadataMgr; var metadataMgr = framework._.cpNfInner.metadataMgr;
@ -2455,6 +2553,17 @@ define([
if (!data.isEmpty) { return; } if (!data.isEmpty) { return; }
if (!block) { return; } if (!block) { return; }
if (!block.opts || !block.opts.required) { return; } if (!block.opts || !block.opts.required) { return; }
// Don't require questions that are in a hidden section
var section = getSectionFromQ(content, uid);
if (section.uid) {
// Check if section is hidden
var sBlock = form[section.uid];
var visible = checkCondition(sBlock);
if (!visible) { return; }
}
var isEmpty = data.isEmpty(); var isEmpty = data.isEmpty();
var $el = $(data.tag).closest('.cp-form-block'); var $el = $(data.tag).closest('.cp-form-block');
$el.find('.cp-form-required-tag').toggleClass('cp-is-empty', isEmpty); $el.find('.cp-form-required-tag').toggleClass('cp-is-empty', isEmpty);
@ -2489,64 +2598,6 @@ define([
reset, send reset, send
]); ]);
}; };
var getSections = function (content) {
var uids = Object.keys(content.form).filter(function (uid) {
return content.form[uid].type === 'section';
});
return uids;
};
var getSectionFromQ = function (content, uid) {
var arr = content.order;
var idx = content.order.indexOf(uid);
if (idx === -1) { // If it's not in the main array, check in sections
getSections(content).some(function (_uid) {
var block = content.form[_uid];
if (!block.opts || !Array.isArray(block.opts.questions)) { return; }
var _idx = block.opts.questions.indexOf(uid);
if (_idx !== -1) {
arr = block.opts.questions;
idx = _idx;
return true;
}
});
}
return {
arr: arr,
idx: idx
};
};
var removeQuestion = function (content, uid) {
delete content.form[uid];
var idx = content.order.indexOf(uid);
if (idx !== -1) {
content.order.splice(idx, 1);
} else {
getSections(content).some(function (_uid) {
var block = content.form[_uid];
if (!block.opts || !Array.isArray(block.opts.questions)) { return; }
var _idx = block.opts.questions.indexOf(uid);
if (_idx !== -1) {
block.opts.questions.splice(_idx, 1);
return true;
}
});
}
};
var getFullOrder = function (content) {
var order = content.order.slice();
getSections(content).forEach(function (uid) {
var block = content.form[uid];
if (!block.opts || !Array.isArray(block.opts.questions)) { return; }
var idx = order.indexOf(uid);
if (idx === -1) { return; }
idx++;
block.opts.questions.forEach(function (el, i) {
order.splice(idx+i, 0, el);
});
});
return order;
};
var updateForm = function (framework, content, editable, answers, temp) { var updateForm = function (framework, content, editable, answers, temp) {
var $container = $('div.cp-form-creator-content'); var $container = $('div.cp-form-creator-content');
if (!$container.length) { return; } // Not ready if (!$container.length) { return; } // Not ready
@ -3317,17 +3368,13 @@ define([
// In view mode, hide sections when conditions aren't met // In view mode, hide sections when conditions aren't met
evOnChange.reg(function (reset, save, condition) { evOnChange.reg(function (reset, save, condition) {
if (!reset && !condition) { return; } if (!reset && !condition) { return; }
var results = getFormResults();
getSections(content).forEach(function (uid) { getSections(content).forEach(function (uid) {
var block = content.form[uid]; var block = content.form[uid];
if (!block.opts || !Array.isArray(block.opts.questions) || !block.opts.when) { return; } if (block.type !== 'section') { return; }
var w = block.opts.when; if (!block.opts || !Array.isArray(block.opts.questions) || !block.opts.when) {
var show = !w.length || w.some(function (rules) { return;
return rules.every(function (rule) { }
return rule.is ? results[rule.q] === rule.v var show = checkCondition(block);
: results[rule.q] !== rule.v;
});
});
block.opts.questions.forEach(function (_uid) { block.opts.questions.forEach(function (_uid) {
$container.find('.cp-form-block[data-id="'+_uid+'"]').toggle(show); $container.find('.cp-form-block[data-id="'+_uid+'"]').toggle(show);
}); });

Loading…
Cancel
Save