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(); };