179 lines
5.3 KiB
JavaScript
179 lines
5.3 KiB
JavaScript
var GFPageConditionalLogic = function (args) {
|
|
var self = this,
|
|
$ = jQuery;
|
|
|
|
/**
|
|
* Initialize Feed Ordering
|
|
*/
|
|
self.init = function () {
|
|
|
|
// Assign options to instance.
|
|
self.options = args;
|
|
|
|
self.triggerInputIds = self.getTriggerInputIds(self.options.pages);
|
|
|
|
self.formWrapper = '#gform_wrapper_' + self.options.formId;
|
|
|
|
self.startAtZero = $(self.formWrapper + ' .gf_progressbar_wrapper').data('startAtZero');
|
|
|
|
self.evaluatePages();
|
|
|
|
self.bindEvents();
|
|
|
|
};
|
|
|
|
self.bindEvents = function () {
|
|
|
|
gform.addAction('gform_input_change', function (elem, formId, inputId) {
|
|
|
|
var fieldId = parseInt(inputId, 10) + '';
|
|
var isTriggeredInput = $.inArray(inputId, self.triggerInputIds) !== -1 || $.inArray(fieldId, self.triggerInputIds) !== -1;
|
|
|
|
if (self.options.formId == formId && isTriggeredInput) {
|
|
self.evaluatePages();
|
|
}
|
|
});
|
|
|
|
};
|
|
|
|
self.evaluatePages = function () {
|
|
|
|
let page, isMatch, isVisible;
|
|
|
|
for ( let i = 0; i < self.options.pages.length; i++ ) {
|
|
|
|
page = self.options.pages[i];
|
|
isMatch = self.evaluatePage( page, self.options.formId );
|
|
isVisible = self.isPageVisible( page );
|
|
|
|
if ( ! isMatch && isVisible !== false ) {
|
|
self.hidePage( page );
|
|
} else if ( isMatch && !isVisible ) {
|
|
self.showPage( page );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Fires after the conditional logic on the form has been evaluated.
|
|
*
|
|
* @since 2.5
|
|
*
|
|
* @param array $pages A collection of page field objects.
|
|
* @param int $formId The form id.
|
|
*/
|
|
gform.doAction('gform_frontend_pages_evaluated', self.options.pages, self.options.formId, self);
|
|
gform.doAction('gform_frontend_pages_evaluated_{0}'.gformFormat(self.options.formId), self.options.pages, self.options.formId, self);
|
|
gform.utils.trigger( {
|
|
event: 'gform/frontend_pages/evaluated',
|
|
data: {
|
|
formId: self.options.formId,
|
|
pages: self.options.pages
|
|
},
|
|
native: false
|
|
} );
|
|
|
|
};
|
|
|
|
self.evaluatePage = function (page, formId) {
|
|
|
|
// Pages with no configured conditional logic always a match.
|
|
if (!page.conditionalLogic) {
|
|
return true;
|
|
}
|
|
|
|
return gf_get_field_action(formId, page.conditionalLogic) === 'show';
|
|
};
|
|
|
|
self.getTriggerInputIds = function () {
|
|
var inputIds = [];
|
|
for (var i = 0; i < self.options.pages.length; i++) {
|
|
|
|
var page = self.options.pages[i];
|
|
|
|
if (!page.conditionalLogic) {
|
|
continue;
|
|
}
|
|
|
|
for (var j = 0; j < page.conditionalLogic.rules.length; j++) {
|
|
var rule = self.options.pages[i].conditionalLogic.rules[j];
|
|
if ($.inArray(rule.fieldId, inputIds) === -1) {
|
|
inputIds.push(rule.fieldId);
|
|
}
|
|
}
|
|
|
|
}
|
|
return inputIds;
|
|
};
|
|
|
|
self.isPageVisible = function (page) {
|
|
|
|
if (typeof page != 'object') {
|
|
page = self.getPage(page);
|
|
if (!page) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return typeof page.isVisible != 'undefined' ? page.isVisible : null;
|
|
};
|
|
|
|
self.getPage = function (fieldId) {
|
|
for (var i = 0; i < self.options.pages.length; i++) {
|
|
var page = self.options.pages[i];
|
|
if (page.fieldId == fieldId) {
|
|
return page;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
self.showPage = function ( page ) {
|
|
|
|
var isVisible = self.isPageVisible(page);
|
|
|
|
if (isVisible === true) {
|
|
return;
|
|
}
|
|
|
|
page.isVisible = true;
|
|
$('#gform_' + self.options.formId + ' div[data-js="page-field-id-' + page.fieldId + '"]').attr('data-conditional-logic', 'visible');
|
|
/**
|
|
* Fires after the conditional logic on the form has been evaluated and the page has been found to be visible.
|
|
*
|
|
* @since 2.5
|
|
*
|
|
* @param array $pages A collection of page field objects.
|
|
* @param int $formId The form id.
|
|
*/
|
|
gform.doAction('gform_frontend_page_visible', page, self.options.formId);
|
|
gform.doAction('gform_frontend_page_visible_{0}'.gformFormat(self.options.formId), page, self.options.formId);
|
|
|
|
};
|
|
|
|
self.hidePage = function ( page ) {
|
|
|
|
var isVisible = self.isPageVisible( page );
|
|
|
|
if (isVisible === false) {
|
|
return;
|
|
}
|
|
|
|
page.isVisible = false;
|
|
$('#gform_' + self.options.formId + ' div[data-js="page-field-id-' + page.fieldId + '"]').attr('data-conditional-logic', 'hidden');
|
|
|
|
/**
|
|
* Fires after the conditional logic on the form has been evaluated and the page has become hidden.
|
|
*
|
|
* @since 2.5
|
|
*
|
|
* @param array $pages A collection of page field objects.
|
|
* @param int $formId The form id.
|
|
*/
|
|
gform.doAction('gform_frontend_page_hidden', page, self.options.formId);
|
|
gform.doAction('gform_frontend_page_hidden_{0}'.gformFormat(self.options.formId), page, self.options.formId);
|
|
|
|
};
|
|
|
|
this.init();
|
|
};
|