first commit

This commit is contained in:
2023-09-12 21:41:04 +02:00
commit 3361a7f053
13284 changed files with 2116755 additions and 0 deletions

View File

@@ -0,0 +1,180 @@
/* global wpforms_challenge_admin, ajaxurl, WPFormsBuilder */
/**
* WPForms Challenge Admin function.
*
* @since 1.5.0
* @since 1.6.2 Challenge v2
*/
'use strict';
var WPFormsChallenge = window.WPFormsChallenge || {};
WPFormsChallenge.admin = window.WPFormsChallenge.admin || ( function( document, window, $ ) {
/**
* Public functions and properties.
*
* @since 1.5.0
*
* @type {object}
*/
var app = {
l10n: wpforms_challenge_admin,
/**
* Start the engine.
*
* @since 1.5.0
*/
init: function() {
$( app.ready );
},
/**
* Document ready.
*
* @since 1.5.0
*/
ready: function() {
app.events();
},
/**
* Register JS events.
*
* @since 1.5.0
*/
events: function() {
$( '.wpforms-challenge-list-block' )
.on( 'click', '.challenge-skip', app.skipChallenge )
.on( 'click', '.challenge-cancel', app.cancelChallenge )
.on( 'click', '.toggle-list', app.toggleList );
},
/**
* Toggle list icon click.
*
* @since 1.5.0
*
* @param {object} e Event object.
*/
toggleList: function( e ) {
var $icon = $( e.target ),
$listBlock = $( '.wpforms-challenge-list-block' );
if ( ! $listBlock.length || ! $icon.length ) {
return;
}
if ( $listBlock.hasClass( 'closed' ) ) {
wpforms_challenge_admin.option.window_closed = '0';
$listBlock.removeClass( 'closed' );
setTimeout( function() {
$listBlock.removeClass( 'transition-back' );
}, 600 );
} else {
wpforms_challenge_admin.option.window_closed = '1';
$listBlock.addClass( 'closed' );
// Add `transition-back` class when the forward transition is completed.
// It is needed to properly implement transitions order for some elements.
setTimeout( function() {
$listBlock.addClass( 'transition-back' );
}, 600 );
}
},
/**
* Skip the Challenge without starting it.
*
* @since 1.5.0
*/
skipChallenge: function() {
var optionData = {
status : 'skipped',
seconds_spent: 0,
seconds_left : app.l10n.minutes_left * 60,
};
$( '.wpforms-challenge' ).remove();
app.saveChallengeOption( optionData )
.done( location.reload.bind( location ) ); // Reload the page to remove WPForms Challenge JS.
},
/**
* Cancel Challenge after starting it.
*
* @since 1.6.2
*/
cancelChallenge: function() {
var core = WPFormsChallenge.core;
core.timer.pause();
/* eslint-disable camelcase */
var optionData = {
status : 'canceled',
seconds_spent: core.timer.getSecondsSpent(),
seconds_left : core.timer.getSecondsLeft(),
feedback_sent: false,
};
/* eslint-enable */
core.removeChallengeUI();
core.clearLocalStorage();
if ( typeof WPFormsBuilder !== 'undefined' ) {
WPFormsChallenge.admin.saveChallengeOption( optionData )
.done( WPFormsBuilder.formSave ) // Save the form before reloading if we're in a WPForms Builder.
.done( location.reload.bind( location ) ); // Reload the page to remove WPForms Challenge JS.
} else {
WPFormsChallenge.admin.saveChallengeOption( optionData )
.done( app.triggerPageSave ); // Assume we're on form embed page.
}
},
/**
* Set Challenge parameter(s) to Challenge option.
*
* @since 1.5.0
*
* @param {object} optionData Query using option schema keys.
*
* @returns {promise} jQuey.post() promise interface.
*/
saveChallengeOption: function( optionData ) {
var data = {
action : 'wpforms_challenge_save_option',
option_data: optionData,
_wpnonce : app.l10n.nonce,
};
// Save window closed (collapsed) state as well.
data.option_data.window_closed = wpforms_challenge_admin.option.window_closed;
$.extend( wpforms_challenge_admin.option, optionData );
return $.post( ajaxurl, data, function( response ) {
if ( ! response.success ) {
console.error( 'Error saving WPForms Challenge option.' );
}
} );
},
};
// Provide access to public functions/properties.
return app;
}( document, window, jQuery ) );
WPFormsChallenge.admin.init();

View File

@@ -0,0 +1 @@
"use strict";var WPFormsChallenge=window.WPFormsChallenge||{};WPFormsChallenge.admin=window.WPFormsChallenge.admin||function(o){var l={l10n:wpforms_challenge_admin,init:function(){o(l.ready)},ready:function(){l.events()},events:function(){o(".wpforms-challenge-list-block").on("click",".challenge-skip",l.skipChallenge).on("click",".challenge-cancel",l.cancelChallenge).on("click",".toggle-list",l.toggleList)},toggleList:function(e){var e=o(e.target),n=o(".wpforms-challenge-list-block");n.length&&e.length&&(n.hasClass("closed")?(wpforms_challenge_admin.option.window_closed="0",n.removeClass("closed"),setTimeout(function(){n.removeClass("transition-back")},600)):(wpforms_challenge_admin.option.window_closed="1",n.addClass("closed"),setTimeout(function(){n.addClass("transition-back")},600)))},skipChallenge:function(){var e={status:"skipped",seconds_spent:0,seconds_left:60*l.l10n.minutes_left};o(".wpforms-challenge").remove(),l.saveChallengeOption(e).done(location.reload.bind(location))},cancelChallenge:function(){var e=WPFormsChallenge.core;e.timer.pause();var n={status:"canceled",seconds_spent:e.timer.getSecondsSpent(),seconds_left:e.timer.getSecondsLeft(),feedback_sent:!1};e.removeChallengeUI(),e.clearLocalStorage(),"undefined"!=typeof WPFormsBuilder?WPFormsChallenge.admin.saveChallengeOption(n).done(WPFormsBuilder.formSave).done(location.reload.bind(location)):WPFormsChallenge.admin.saveChallengeOption(n).done(l.triggerPageSave)},saveChallengeOption:function(e){var n={action:"wpforms_challenge_save_option",option_data:e,_wpnonce:l.l10n.nonce};return n.option_data.window_closed=wpforms_challenge_admin.option.window_closed,o.extend(wpforms_challenge_admin.option,e),o.post(ajaxurl,n,function(e){e.success||console.error("Error saving WPForms Challenge option.")})}};return l}((document,window,jQuery)),WPFormsChallenge.admin.init();

View File

@@ -0,0 +1,274 @@
/* global WPForms, WPFormsBuilder, wpforms_challenge_admin, WPFormsFormEmbedWizard */
/**
* WPForms Challenge function.
*
* @since 1.5.0
* @since 1.6.2 Challenge v2
*/
'use strict';
var WPFormsChallenge = window.WPFormsChallenge || {};
WPFormsChallenge.builder = window.WPFormsChallenge.builder || ( function( document, window, $ ) {
/**
* Public functions and properties.
*
* @since 1.5.0
*
* @type {object}
*/
var app = {
/**
* Start the engine.
*
* @since 1.5.0
*/
init: function() {
$( app.ready );
$( window ).on( 'load', function() {
// in case of jQuery 3.+ we need to wait for an `ready` event first.
if ( typeof $.ready.then === 'function' ) {
$.ready.then( app.load );
} else {
app.load();
}
} );
},
/**
* Document ready.
*
* @since 1.5.0
*/
ready: function() {
app.setup();
app.events();
},
/**
* Window load.
*
* @since 1.5.0
*/
load: function() {
if ( [ 'started', 'paused' ].indexOf( wpforms_challenge_admin.option.status ) > -1 ) {
WPFormsChallenge.core.updateTooltipUI();
app.gotoStep();
}
$( '.wpforms-challenge' ).show();
},
/**
* Initial setup.
*
* @since 1.5.0
*/
setup: function() {
if ( wpforms_challenge_admin.option.status === 'inited' ) {
WPFormsChallenge.core.clearLocalStorage();
app.showWelcomePopup();
}
$( '#wpforms-embed' ).addClass( 'wpforms-disabled' );
var tooltipAnchors = [
'#wpforms-setup-name',
'.wpforms-setup-title .wpforms-setup-title-after',
'#add-fields a i',
'#wpforms-builder-settings-notifications-title',
];
$.each( tooltipAnchors, function( i, anchor ) {
WPFormsChallenge.core.initTooltips( i + 1, anchor, null );
} );
},
/**
* Register JS events.
*
* @since 1.5.0
*/
events: function() {
// Start the Challenge.
$( '#wpforms-challenge-welcome-builder-popup' ).on( 'click', 'button', app.startChallenge );
// Step 1.
$( '.wpforms-challenge-step1-done' ).on( 'click', function() {
WPFormsChallenge.core.stepCompleted( 1 );
} );
$( '#wpforms-builder' )
// Register select template event when the setup panel is ready.
.on( 'wpformsBuilderSetupReady', function() {
app.eventSelectTemplate();
} )
// Restore tooltips when switching builder panels/sections.
.on( 'wpformsPanelSwitch wpformsPanelSectionSwitch', function() {
WPFormsChallenge.core.updateTooltipUI();
} );
// Step 3 - Add fields.
$( '.wpforms-challenge-step3-done' ).on( 'click', function() {
WPFormsChallenge.core.stepCompleted( 3 );
app.gotoStep( 4 );
} );
// Step 4 - Notifications.
$( document ).on( 'click', '.wpforms-challenge-step4-done', app.showEmbedPopup );
// Tooltipster ready.
$.tooltipster.on( 'ready', app.tooltipsterReady );
},
/**
* Register select template event.
*
* @since 1.6.8
*/
eventSelectTemplate: function() {
$( '#wpforms-panel-setup' )
// Step 2 - Select the Form template.
.off( 'click', '.wpforms-template-select' ) // Intercept Form Builder's form template selection and apply own logic.
.on( 'click', '.wpforms-template-select', function( e ) {
app.builderTemplateSelect( this, e );
} );
},
/**
* Start the Challenge.
*
* @since 1.6.2
*/
startChallenge: function() {
WPFormsChallenge.admin.saveChallengeOption( { status: 'started' } );
WPFormsChallenge.core.initListUI( 'started' );
$( '.wpforms-challenge-popup-container' ).fadeOut( function() {
$( '#wpforms-challenge-welcome-builder-popup' ).hide();
} );
WPFormsChallenge.core.timer.run( WPFormsChallenge.core.timer.initialSecondsLeft );
WPFormsChallenge.core.updateTooltipUI();
},
/**
* Go to Step.
*
* @since 1.6.2
*
* @param {number|string} step Last saved step.
*/
gotoStep: function( step ) { // eslint-disable-line
step = step || ( WPFormsChallenge.core.loadStep() + 1 );
switch ( step ) {
case 1:
case 2:
WPFormsBuilder.panelSwitch( 'setup' );
break;
case 3:
WPFormsBuilder.panelSwitch( 'fields' );
break;
case 4:
WPFormsBuilder.panelSwitch( 'settings' );
WPFormsBuilder.panelSectionSwitch( $( '.wpforms-panel .wpforms-panel-sidebar-section-notifications' ) );
break;
case 5:
app.showEmbedPopup();
break;
}
},
/**
* Save the second step before a template is selected.
*
* @since 1.5.0
*
* @param {string} el Element selector.
* @param {object} e Event.
*/
builderTemplateSelect: function( el, e ) {
if ( wpforms_challenge_admin.option.status === 'paused' ) {
WPFormsChallenge.core.resumeChallenge();
}
var step = WPFormsChallenge.core.loadStep();
if ( step <= 1 ) {
WPFormsChallenge.core.stepCompleted( 2 )
.done( WPForms.Admin.Builder.Setup.selectTemplate.bind( null, e ) );
return;
}
WPForms.Admin.Builder.Setup.selectTemplate.bind( null, e );
},
/**
* Tooltipster ready event callback.
*
* @since 1.6.2
*
* @param {object} e Event object.
*/
tooltipsterReady: function( e ) {
var step = $( e.origin ).data( 'wpforms-challenge-step' );
var formId = $( '#wpforms-builder-form' ).data( 'id' );
step = parseInt( step, 10 ) || 0;
formId = parseInt( formId, 10 ) || 0;
// Save challenge form ID right after it's created.
if ( 3 === step && formId > 0 ) {
WPFormsChallenge.admin.saveChallengeOption( { form_id: formId } ); // eslint-disable-line camelcase
}
},
/**
* Display 'Welcome to the Form Builder' popup.
*
* @since 1.6.2
*/
showWelcomePopup: function() {
$( '#wpforms-challenge-welcome-builder-popup' ).show();
$( '.wpforms-challenge-popup-container' ).fadeIn();
},
/**
* Display 'Embed in a Page' popup.
*
* @since 1.6.2
*/
showEmbedPopup: function() {
WPFormsChallenge.core.stepCompleted( 4 );
WPFormsFormEmbedWizard.openPopup();
},
};
// Provide access to public functions/properties.
return app;
}( document, window, jQuery ) );
// Initialize.
WPFormsChallenge.builder.init();

View File

@@ -0,0 +1 @@
"use strict";var WPFormsChallenge=window.WPFormsChallenge||{};WPFormsChallenge.builder=window.WPFormsChallenge.builder||function(e,o,l){var t={init:function(){l(t.ready),l(o).on("load",function(){"function"==typeof l.ready.then?l.ready.then(t.load):t.load()})},ready:function(){t.setup(),t.events()},load:function(){-1<["started","paused"].indexOf(wpforms_challenge_admin.option.status)&&(WPFormsChallenge.core.updateTooltipUI(),t.gotoStep()),l(".wpforms-challenge").show()},setup:function(){"inited"===wpforms_challenge_admin.option.status&&(WPFormsChallenge.core.clearLocalStorage(),t.showWelcomePopup()),l("#wpforms-embed").addClass("wpforms-disabled");l.each(["#wpforms-setup-name",".wpforms-setup-title .wpforms-setup-title-after","#add-fields a i","#wpforms-builder-settings-notifications-title"],function(e,o){WPFormsChallenge.core.initTooltips(e+1,o,null)})},events:function(){l("#wpforms-challenge-welcome-builder-popup").on("click","button",t.startChallenge),l(".wpforms-challenge-step1-done").on("click",function(){WPFormsChallenge.core.stepCompleted(1)}),l("#wpforms-builder").on("wpformsBuilderSetupReady",function(){t.eventSelectTemplate()}).on("wpformsPanelSwitch wpformsPanelSectionSwitch",function(){WPFormsChallenge.core.updateTooltipUI()}),l(".wpforms-challenge-step3-done").on("click",function(){WPFormsChallenge.core.stepCompleted(3),t.gotoStep(4)}),l(e).on("click",".wpforms-challenge-step4-done",t.showEmbedPopup),l.tooltipster.on("ready",t.tooltipsterReady)},eventSelectTemplate:function(){l("#wpforms-panel-setup").off("click",".wpforms-template-select").on("click",".wpforms-template-select",function(e){t.builderTemplateSelect(this,e)})},startChallenge:function(){WPFormsChallenge.admin.saveChallengeOption({status:"started"}),WPFormsChallenge.core.initListUI("started"),l(".wpforms-challenge-popup-container").fadeOut(function(){l("#wpforms-challenge-welcome-builder-popup").hide()}),WPFormsChallenge.core.timer.run(WPFormsChallenge.core.timer.initialSecondsLeft),WPFormsChallenge.core.updateTooltipUI()},gotoStep:function(e){switch(e=e||WPFormsChallenge.core.loadStep()+1){case 1:case 2:WPFormsBuilder.panelSwitch("setup");break;case 3:WPFormsBuilder.panelSwitch("fields");break;case 4:WPFormsBuilder.panelSwitch("settings"),WPFormsBuilder.panelSectionSwitch(l(".wpforms-panel .wpforms-panel-sidebar-section-notifications"));break;case 5:t.showEmbedPopup()}},builderTemplateSelect:function(e,o){"paused"===wpforms_challenge_admin.option.status&&WPFormsChallenge.core.resumeChallenge(),WPFormsChallenge.core.loadStep()<=1?WPFormsChallenge.core.stepCompleted(2).done(WPForms.Admin.Builder.Setup.selectTemplate.bind(null,o)):WPForms.Admin.Builder.Setup.selectTemplate.bind(null,o)},tooltipsterReady:function(e){var o=l(e.origin).data("wpforms-challenge-step"),e=l("#wpforms-builder-form").data("id"),o=parseInt(o,10)||0,e=parseInt(e,10)||0;3===o&&0<e&&WPFormsChallenge.admin.saveChallengeOption({form_id:e})},showWelcomePopup:function(){l("#wpforms-challenge-welcome-builder-popup").show(),l(".wpforms-challenge-popup-container").fadeIn()},showEmbedPopup:function(){WPFormsChallenge.core.stepCompleted(4),WPFormsFormEmbedWizard.openPopup()}};return t}(document,window,jQuery),WPFormsChallenge.builder.init();

View File

@@ -0,0 +1,813 @@
/* global wpforms_challenge_admin */
/**
* WPForms Challenge function.
*
* @since 1.5.0
* @since 1.6.2 Challenge v2
*/
'use strict';
var WPFormsChallenge = window.WPFormsChallenge || {};
WPFormsChallenge.core = window.WPFormsChallenge.core || ( function( document, window, $ ) {
/**
* Public functions and properties.
*
* @since 1.5.0
*
* @type {object}
*/
var app = {};
/**
* Runtime variables.
*
* @since 1.6.2
*
* @type {object}
*/
var vars = {};
/**
* DOM elements.
*
* @since 1.6.2
*
* @type {object}
*/
var el = {};
/**
* Timer functions and properties.
*
* @since 1.5.0
*
* @type {object}
*/
var timer = {
/**
* Number of minutes to complete the challenge.
*
* @since 1.5.0
*
* @type {number}
*/
initialSecondsLeft: WPFormsChallenge.admin.l10n.minutes_left * 60,
/**
* Load timer ID.
*
* @since 1.5.0
*
* @returns {string} ID from setInterval().
*/
loadId: function() {
return localStorage.getItem( 'wpformsChallengeTimerId' );
},
/**
* Save timer ID.
*
* @since 1.5.0
*
* @param {number|string} id setInterval() ID to save.
*/
saveId: function( id ) {
localStorage.setItem( 'wpformsChallengeTimerId', id );
},
/**
* Run the timer.
*
* @since 1.5.0
*
* @param {number} secondsLeft Number of seconds left to complete the Challenge.
*
* @returns {string|void} ID from setInterval().
*/
run: function( secondsLeft ) {
if ( 5 === app.loadStep() ) {
return;
}
var timerId = setInterval( function() {
app.updateTimerUI( secondsLeft );
secondsLeft--;
if ( 0 > secondsLeft ) {
timer.saveSecondsLeft( 0 );
clearInterval( timerId );
}
}, 1000 );
timer.saveId( timerId );
return timerId;
},
/**
* Pause the timer.
*
* @since 1.5.0
*/
pause: function() {
var timerId;
var elSeconds;
var secondsLeft = timer.getSecondsLeft();
if ( 0 === secondsLeft || 5 === app.loadStep() ) {
return;
}
timerId = timer.loadId();
clearInterval( timerId );
elSeconds = $( '#wpforms-challenge-timer' ).data( 'seconds-left' );
if ( elSeconds ) {
timer.saveSecondsLeft( elSeconds );
}
},
/**
* Resume the timer.
*
* @since 1.5.0
*/
resume: function() {
var timerId;
var secondsLeft = timer.getSecondsLeft();
if ( 0 === secondsLeft || 5 === app.loadStep() ) {
return;
}
timerId = timer.loadId();
if ( timerId ) {
clearInterval( timerId );
}
timer.run( secondsLeft );
},
/**
* Clear all frontend saved timer data.
*
* @since 1.5.0
*/
clear: function() {
localStorage.removeItem( 'wpformsChallengeSecondsLeft' );
localStorage.removeItem( 'wpformsChallengeTimerId' );
localStorage.removeItem( 'wpformsChallengeTimerStatus' );
$( '#wpforms-challenge-timer' ).removeData( 'seconds-left' );
},
/**
* Get number of seconds left to complete the Challenge.
*
* @since 1.5.0
*
* @returns {number} Number of seconds left to complete the Challenge.
*/
getSecondsLeft: function() {
var secondsLeft = localStorage.getItem( 'wpformsChallengeSecondsLeft' );
secondsLeft = parseInt( secondsLeft, 10 ) || 0;
return secondsLeft;
},
/**
* Get number of seconds spent completing the Challenge.
*
* @since 1.5.0
*
* @param {number} secondsLeft Number of seconds left to complete the Challenge.
*
* @returns {number} Number of seconds spent completing the Challenge.
*/
getSecondsSpent: function( secondsLeft ) {
secondsLeft = secondsLeft || timer.getSecondsLeft();
return timer.initialSecondsLeft - secondsLeft;
},
/**
* Save number of seconds left to complete the Challenge.
*
* @since 1.5.0
*
* @param {number|string} secondsLeft Number of seconds left to complete the Challenge.
*/
saveSecondsLeft: function( secondsLeft ) {
localStorage.setItem( 'wpformsChallengeSecondsLeft', secondsLeft );
},
/**
* Get 'minutes' part of timer display.
*
* @since 1.5.0
*
* @param {number} secondsLeft Number of seconds left to complete the Challenge.
*
* @returns {number} 'Minutes' part of timer display.
*/
getMinutesFormatted: function( secondsLeft ) {
secondsLeft = secondsLeft || timer.getSecondsLeft();
return Math.floor( secondsLeft / 60 );
},
/**
* Get 'seconds' part of timer display.
*
* @since 1.5.0
*
* @param {number} secondsLeft Number of seconds left to complete the Challenge.
*
* @returns {number} 'Seconds' part of timer display.
*/
getSecondsFormatted: function( secondsLeft ) {
secondsLeft = secondsLeft || timer.getSecondsLeft();
return secondsLeft % 60;
},
/**
* Get formatted timer for display.
*
* @since 1.5.0
*
* @param {number} secondsLeft Number of seconds left to complete the Challenge.
*
* @returns {string} Formatted timer for display.
*/
getFormatted: function( secondsLeft ) {
secondsLeft = secondsLeft || timer.getSecondsLeft();
var timerMinutes = timer.getMinutesFormatted( secondsLeft );
var timerSeconds = timer.getSecondsFormatted( secondsLeft );
return timerMinutes + ( 9 < timerSeconds ? ':' : ':0' ) + timerSeconds;
},
};
/**
* Public functions and properties.
*/
app = {
/**
* Public timer functions and properties.
*
* @since 1.5.0
*/
timer: timer,
/**
* Start the engine.
*
* @since 1.5.0
*/
init: function() {
$( app.ready );
$( window ).on( 'load', function() {
// in case of jQuery 3.+ we need to wait for an `ready` event first.
if ( typeof $.ready.then === 'function' ) {
$.ready.then( app.load );
} else {
app.load();
}
} );
},
/**
* Document ready.
*
* @since 1.5.0
*/
ready: function() {
app.setup();
app.events();
},
/**
* Window load.
*
* @since 1.5.0
*/
load: function() {
if ( wpforms_challenge_admin.option.status === 'started' ) {
app.timer.run( app.timer.getSecondsLeft() );
}
},
/**
* Initial setup.
*
* @since 1.5.0
*/
setup: function() {
var secondsLeft;
var timerId = app.timer.loadId();
if ( timerId ) {
clearInterval( timerId );
secondsLeft = app.timer.getSecondsLeft();
}
if ( ! timerId || 0 === app.loadStep() || wpforms_challenge_admin.option.status === 'inited' ) {
secondsLeft = app.timer.initialSecondsLeft;
}
app.initElements();
app.refreshStep();
app.initListUI( null, true );
app.updateListUI();
app.updateTimerUI( secondsLeft );
},
/**
* Register JS events.
*
* @since 1.5.0
*/
events: function() {
$( [ window, document ] )
.on( 'blur', app.pauseChallenge )
.on( 'focus', app.resumeChallenge )
.on( 'click', '.wpforms-challenge-done-btn', app.resumeChallenge );
el.$btnPause.on( 'click', app.pauseChallenge );
el.$btnResume.on( 'click', app.resumeChallenge );
el.$listSteps.on( 'click', '.wpforms-challenge-item-current', app.refreshPage );
},
/**
* DOM elements.
*
* @since 1.6.2
*/
initElements: function() {
el = {
$challenge: $( '.wpforms-challenge' ),
$btnPause: $( '.wpforms-challenge-pause' ),
$btnResume: $( '.wpforms-challenge-resume' ),
$listSteps: $( '.wpforms-challenge-list' ),
$listBlock: $( '.wpforms-challenge-list-block' ),
$listBtnToggle: $( '.wpforms-challenge-list-block .toggle-list' ),
$progressBar: $( '.wpforms-challenge-bar' ),
$tooltipBtnDone: function() {
return $( '.wpforms-challenge-tooltip .wpforms-challenge-done-btn' );
},
};
},
/**
* Get last saved step.
*
* @since 1.5.0
*
* @returns {number} Last saved step.
*/
loadStep: function() {
var step = localStorage.getItem( 'wpformsChallengeStep' );
step = parseInt( step, 10 ) || 0;
return step;
},
/**
* Save Challenge step.
*
* @param {number|string} step Step to save.
*
* @returns {object} jqXHR object from saveChallengeOption().
*/
saveStep: function( step ) {
localStorage.setItem( 'wpformsChallengeStep', step );
return WPFormsChallenge.admin.saveChallengeOption( { step: step } );
},
/**
* Update a step with backend data..
*
* @since 1.5.0
*/
refreshStep: function() {
var savedStep = el.$challenge.data( 'wpforms-challenge-saved-step' );
savedStep = parseInt( savedStep, 10 ) || 0;
// Step saved on a backend has a priority.
if ( app.loadStep() !== savedStep ) {
app.saveStep( savedStep );
}
},
/**
* Complete Challenge step.
*
* @since 1.5.0
*
* @param {number|string} step Step to complete.
*
* @returns {object} jqXHR object from saveStep().
*/
stepCompleted: function( step ) {
app.updateListUI( step );
app.updateTooltipUI( step );
return app.saveStep( step );
},
/**
* Initialize Challenge tooltips.
*
* @since 1.5.0
*
* @param {number|string} step Last saved step.
* @param {string} anchor Element selector to bind tooltip to.
* @param {object} args Tooltipster arguments.
*/
initTooltips: function( step, anchor, args ) {
if ( typeof $.fn.tooltipster === 'undefined' ) {
return;
}
var $dot = $( '<span class="wpforms-challenge-dot wpforms-challenge-dot-step' + step + '" data-wpforms-challenge-step="' + step + '">&nbsp;</span>' );
var tooltipsterArgs = {
content : $( '#tooltip-content' + step ),
trigger : null,
interactive : true,
animationDuration: 0,
delay : 0,
theme : [ 'tooltipster-default', 'wpforms-challenge-tooltip' ],
side : [ 'top' ],
distance : 3,
functionReady : function( instance, helper ) {
$( helper.tooltip ).addClass( 'wpforms-challenge-tooltip-step' + step );
// Custom positioning.
if ( step === 4 || step === 3 ) {
instance.option( 'side', 'right' );
}
// Reposition is needed to render max-width CSS correctly.
instance.reposition();
},
};
if ( typeof args === 'object' && args !== null ) {
$.extend( tooltipsterArgs, args );
}
$dot.insertAfter( anchor ).tooltipster( tooltipsterArgs );
},
/**
* Update tooltips appearance.
*
* @since 1.5.0
*
* @param {number|string} step Last saved step.
*/
updateTooltipUI: function( step ) {
var nextStep;
step = step || app.loadStep();
nextStep = step + 1;
$( '.wpforms-challenge-dot' ).each( function( i, el ) {
var $dot = $( el ),
elStep = $dot.data( 'wpforms-challenge-step' );
if ( elStep < nextStep ) {
$dot.addClass( 'wpforms-challenge-dot-completed' );
}
if ( elStep > nextStep ) {
$dot.addClass( 'wpforms-challenge-dot-next' );
}
if ( elStep === nextStep ) {
$dot.removeClass( 'wpforms-challenge-dot-completed wpforms-challenge-dot-next' );
}
// Zero timeout is needed to properly detect $el visibility.
setTimeout( function() {
if ( $dot.is( ':visible' ) && elStep === nextStep ) {
$dot.tooltipster( 'open' );
} else {
$dot.tooltipster( 'close' );
}
}, 0 );
} );
},
/**
* Init ListUI.
*
* @since {vERSION}
*
* @param {number|string} status Challenge status.
* @param {boolean} initial Initial run, false by default.
*/
initListUI: function( status, initial ) {
status = status || wpforms_challenge_admin.option.status;
if ( [ 'started', 'paused' ].indexOf( status ) > -1 ) {
el.$listBlock.find( 'p' ).hide();
el.$listBtnToggle.show();
el.$progressBar.show();
// Transform skip button to cancel button.
var $skipBtn = el.$listBlock.find( '.list-block-button.challenge-skip' );
$skipBtn
.attr( 'title', $skipBtn.data( 'cancel-title' ) )
.removeClass( 'challenge-skip' )
.addClass( 'challenge-cancel' );
}
// Set initial window closed (collapsed) state if window is short or if it is closed manually.
if (
initial &&
(
( $( window ).height() < 900 && wpforms_challenge_admin.option.window_closed === '' ) ||
wpforms_challenge_admin.option.window_closed === '1'
)
) {
el.$listBlock.find( 'p' ).hide();
el.$listBtnToggle.trigger( 'click' );
}
if ( status === 'paused' ) {
el.$challenge.addClass( 'paused' );
el.$btnPause.hide();
el.$btnResume.show();
} else {
// Zero timeout is needed to avoid firing 'focus' and 'click' events in the same loop.
setTimeout( function() {
el.$btnPause.show();
}, 0 );
el.$challenge.removeClass( 'paused' );
el.$btnResume.hide();
}
},
/**
* Update Challenge task list appearance.
*
* @since 1.5.0
*
* @param {number|string} step Last saved step.
*/
updateListUI: function( step ) {
step = step || app.loadStep();
el.$listSteps.find( 'li:lt(' + step + ')' ).addClass( 'wpforms-challenge-item-completed' );
el.$listSteps.find( 'li:eq(' + step + ')' ).addClass( 'wpforms-challenge-item-current' );
el.$progressBar.find( 'div' ).css( 'width', ( step * 20 ) + '%' );
},
/**
* Update Challenge timer appearance.
*
* @since 1.5.0
*
* @param {number} secondsLeft Number of seconds left to complete the Challenge.
*/
updateTimerUI: function( secondsLeft ) {
if ( ! secondsLeft || isNaN( secondsLeft ) || '0' === secondsLeft ) {
secondsLeft = 0;
}
app.timer.saveSecondsLeft( secondsLeft );
$( '#wpforms-challenge-timer' ).text( app.timer.getFormatted( secondsLeft ) ).data( 'seconds-left', secondsLeft );
},
/**
* Remove Challenge interface.
*
* @since 1.5.0
*/
removeChallengeUI: function() {
$( '.wpforms-challenge-dot' ).remove();
el.$challenge.remove();
},
/**
* Clear all Challenge frontend saved data.
*
* @since 1.5.0
*/
clearLocalStorage: function() {
localStorage.removeItem( 'wpformsChallengeStep' );
app.timer.clear();
},
/**
* Pause Challenge.
*
* @since 1.6.2
*
* @param {object} e Event object.
*/
pauseChallenge: function( e ) {
// Skip if out to the iframe.
if ( document.activeElement.tagName === 'IFRAME' ) {
return;
}
// Skip if is not started.
if ( wpforms_challenge_admin.option.status !== 'started' ) {
return;
}
vars.pauseEvent = e.type;
app.pauseResumeChallenge( 'pause' );
},
/**
* Resume Challenge.
*
* @since 1.6.2
*
* @param {object} e Event object.
*/
resumeChallenge: function( e ) {
// Skip if is not paused.
if ( wpforms_challenge_admin.option.status !== 'paused' ) {
return;
}
// Resume on 'focus' only if it has been paused on 'blur'.
if ( e.type === 'focus' && vars.pauseEvent !== 'blur' ) {
delete vars.pauseEvent;
return;
}
vars.resumeEvent = e.type;
app.pauseResumeChallenge( 'resume' );
},
/**
* Pause/Resume Challenge.
*
* @since 1.6.2
*
* @param {string} action Action to perform. `pause` or `resume`.
*/
pauseResumeChallenge: function( action ) {
action = action === 'pause' ? action : 'resume';
app.timer[ action ]();
var optionData = {
status : action === 'pause' ? 'paused' : 'started',
seconds_spent: app.timer.getSecondsSpent(),
seconds_left : app.timer.getSecondsLeft(),
};
WPFormsChallenge.admin.saveChallengeOption( optionData );
app.initListUI( optionData.status );
},
/**
* Refresh Page in order to re-init current step.
*
* @since 1.6.2
*
* @param {object} e Event object.
*/
refreshPage: function( e ) {
window.location.reload( true );
},
/**
* Check if we're in Gutenberg editor.
*
* @since 1.5.0
*
* @returns {boolean} Is Gutenberg or not.
*/
isGutenberg: function() {
return typeof wp !== 'undefined' && Object.prototype.hasOwnProperty.call( wp, 'blocks' );
},
/**
* Trigger form embed page save potentially reloading it.
*
* @since 1.5.0
*/
triggerPageSave: function() {
if ( app.isGutenberg() ) {
app.gutenbergPageSave();
} else {
$( '#post #publish' ).trigger( 'click' );
}
},
/**
* Save page for Gutenberg.
*
* @since 1.5.2
*/
gutenbergPageSave: function() {
var $gb = $( '.block-editor' ),
$updateBtn = $gb.find( '.editor-post-publish-button.editor-post-publish-button__button' );
// Trigger click on the Update button.
if ( $updateBtn.length > 0 ) {
$updateBtn.trigger( 'click' );
return;
}
// Use MutationObserver to wait while Guttenberg create/display panel with Publish button.
var obs = {
targetNode : $gb.find( '.edit-post-layout, .block-editor-editor-skeleton__publish > div' )[0],
config : {
childList: true,
attributes: true,
subtree: true,
},
};
obs.callback = function( mutationsList, observer ) {
var $btn = $gb.find( '.editor-post-publish-button, .editor-post-publish-panel__header-publish-button .editor-post-publish-button__button' );
if ( $btn.length > 0 ) {
$btn.trigger( 'click' );
observer.disconnect();
}
};
obs.observer = new MutationObserver( obs.callback );
obs.observer.observe( obs.targetNode, obs.config );
// Trigger click on the Publish button that opens the additional publishing panel.
$gb.find( '.edit-post-toggle-publish-panel__button, .editor-post-publish-panel__toggle.editor-post-publish-button__button' )
.trigger( 'click' );
},
};
// Provide access to public functions/properties.
return app;
}( document, window, jQuery ) );
WPFormsChallenge.core.init();

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,279 @@
/* global ajaxurl */
/**
* WPForms Challenge function.
*
* @since 1.5.0
* @since 1.6.2 Challenge v2.
*/
'use strict';
var WPFormsChallenge = window.WPFormsChallenge || {};
WPFormsChallenge.embed = window.WPFormsChallenge.embed || ( function( document, window, $ ) {
/**
* Public functions and properties.
*
* @since 1.5.0
*
* @type {object}
*/
var app = {
/**
* Start the engine.
*
* @since 1.5.0
*/
init: function() {
$( app.ready );
$( window ).on( 'load', function() {
// in case of jQuery 3.+ we need to wait for an `ready` event first.
if ( typeof $.ready.then === 'function' ) {
$.ready.then( app.load );
} else {
app.load();
}
} );
},
/**
* Document ready.
*
* @since 1.5.0
*/
ready: function() {
app.setup();
app.events();
app.observeFullscreenMode();
},
/**
* Window load.
*
* @since 1.5.0
*/
load: function() {
// If the page is Add new page.
if ( window.location.href.indexOf( 'post-new.php' ) > -1 ) {
app.lastStep();
$( '.wpforms-challenge-dot-completed' ).hide();
return;
}
if ( WPFormsChallenge.core.isGutenberg() ) {
WPFormsChallenge.core.initTooltips( 5, '.block-editor .edit-post-header', { side: 'bottom' } );
} else {
WPFormsChallenge.core.initTooltips( 5, '.wpforms-insert-form-button', { side: 'right' } );
}
WPFormsChallenge.core.updateTooltipUI();
},
/**
* Initial setup.
*
* @since 1.5.0
*/
setup: function() {
if ( 5 === WPFormsChallenge.core.loadStep() ) {
$( '.wpforms-challenge' ).addClass( 'wpforms-challenge-completed' );
app.showPopup();
}
$( '.wpforms-challenge' ).show();
},
/**
* Register JS events.
*
* @since 1.5.0
*/
events: function() {
$( '.wpforms-challenge-step5-done' )
.on( 'click', app.lastStep );
$( '.wpforms-challenge-popup-close, .wpforms-challenge-popup-rate-btn, .wpforms-challenge-end' )
.on( 'click', app.completeChallenge );
$( '#wpforms-challenge-contact-form .wpforms-challenge-popup-contact-btn' )
.on( 'click', app.submitContactForm );
},
/**
* Last step done routine.
*
* @since 1.6.2
*/
lastStep: function() {
WPFormsChallenge.core.timer.pause();
WPFormsChallenge.core.stepCompleted( 5 );
$( '.wpforms-challenge' ).addClass( 'wpforms-challenge-completed' );
app.showPopup();
},
/**
* Show either 'Congratulations' or 'Contact Us' popup.
*
* @since 1.5.0
*/
showPopup: function() {
var secondsLeft = WPFormsChallenge.core.timer.getSecondsLeft();
$( '.wpforms-challenge-popup-container' ).show();
if ( 0 < secondsLeft ) {
var secondsSpent = WPFormsChallenge.core.timer.getSecondsSpent( secondsLeft );
$( '#wpforms-challenge-congrats-minutes' )
.text( WPFormsChallenge.core.timer.getMinutesFormatted( secondsSpent ) );
$( '#wpforms-challenge-congrats-seconds' )
.text( WPFormsChallenge.core.timer.getSecondsFormatted( secondsSpent ) );
$( '#wpforms-challenge-congrats-popup' ).show();
} else {
$( '#wpforms-challenge-contact-popup' ).show();
}
},
/**
* Hide the popoup.
*
* @since 1.5.0
*/
hidePopup: function() {
$( '.wpforms-challenge-popup-container' ).hide();
$( '.wpforms-challenge-popup' ).hide();
},
/**
* Complete Challenge.
*
* @since 1.5.0
*/
completeChallenge: function() {
var optionData = {
status : 'completed',
seconds_spent: WPFormsChallenge.core.timer.getSecondsSpent(),
seconds_left : WPFormsChallenge.core.timer.getSecondsLeft(),
};
app.hidePopup();
WPFormsChallenge.core.removeChallengeUI();
WPFormsChallenge.core.clearLocalStorage();
WPFormsChallenge.admin.saveChallengeOption( optionData )
.done( WPFormsChallenge.core.triggerPageSave ); // Save and reload the page to remove WPForms Challenge JS.
},
/**
* Submit contact form button click event handler.
*
* @since 1.5.0
*
* @param {object} e Event object.
*/
submitContactForm: function( e ) {
e.preventDefault();
var $btn = $( this ),
$form = $btn.closest( '#wpforms-challenge-contact-form' );
/* eslint-disable camelcase */
var data = {
action : 'wpforms_challenge_send_contact_form',
_wpnonce : WPFormsChallenge.admin.l10n.nonce,
contact_data: {
message : $form.find( '.wpforms-challenge-contact-message' ).val(),
contact_me: $form.find( '.wpforms-challenge-contact-permission' ).prop( 'checked' ),
},
};
/* eslint-enable */
$btn.prop( 'disabled', true );
$.post( ajaxurl, data, function( response ) {
if ( ! response.success ) {
console.error( 'Error sending WPForms Challenge Contact Form.' );
}
} ).done( app.completeChallenge );
},
/**
* Observe Gutenberg's Fullscreen Mode state to adjust tooltip positioning.
*
* @since 1.6.2
*/
observeFullscreenMode: function() {
var $body = $( 'body' ),
isFullScreenPrev = $body.hasClass( 'is-fullscreen-mode' );
// MutationObserver configuration and callback.
var obs = {
targetNode : $body[0],
config : {
attributes: true,
},
};
obs.callback = function( mutationsList, observer ) {
var mutation,
isFullScreen,
$step5 = $( '.wpforms-challenge-tooltip-step5' ),
$step5Arrow = $step5.find( '.tooltipster-arrow' );
for ( var i in mutationsList ) {
mutation = mutationsList[ i ];
if ( mutation.type !== 'attributes' || mutation.attributeName !== 'class' ) {
continue;
}
isFullScreen = $body.hasClass( 'is-fullscreen-mode' );
if ( isFullScreen === isFullScreenPrev ) {
continue;
}
isFullScreenPrev = isFullScreen;
if ( isFullScreen ) {
$step5.css( {
'top': '93px',
'left': '0',
} );
$step5Arrow.css( 'left', '91px' );
} else {
$step5.css( {
'top': '125px',
'left': '66px',
} );
$step5Arrow.css( 'left', '130px' );
}
}
};
obs.observer = new MutationObserver( obs.callback );
obs.observer.observe( obs.targetNode, obs.config );
},
};
// Provide access to public functions/properties.
return app;
}( document, window, jQuery ) );
// Initialize.
WPFormsChallenge.embed.init();

View File

@@ -0,0 +1 @@
"use strict";var WPFormsChallenge=window.WPFormsChallenge||{};WPFormsChallenge.embed=window.WPFormsChallenge.embed||function(e,p){var n={init:function(){p(n.ready),p(e).on("load",function(){"function"==typeof p.ready.then?p.ready.then(n.load):n.load()})},ready:function(){n.setup(),n.events(),n.observeFullscreenMode()},load:function(){if(-1<e.location.href.indexOf("post-new.php"))return n.lastStep(),void p(".wpforms-challenge-dot-completed").hide();WPFormsChallenge.core.isGutenberg()?WPFormsChallenge.core.initTooltips(5,".block-editor .edit-post-header",{side:"bottom"}):WPFormsChallenge.core.initTooltips(5,".wpforms-insert-form-button",{side:"right"}),WPFormsChallenge.core.updateTooltipUI()},setup:function(){5===WPFormsChallenge.core.loadStep()&&(p(".wpforms-challenge").addClass("wpforms-challenge-completed"),n.showPopup()),p(".wpforms-challenge").show()},events:function(){p(".wpforms-challenge-step5-done").on("click",n.lastStep),p(".wpforms-challenge-popup-close, .wpforms-challenge-popup-rate-btn, .wpforms-challenge-end").on("click",n.completeChallenge),p("#wpforms-challenge-contact-form .wpforms-challenge-popup-contact-btn").on("click",n.submitContactForm)},lastStep:function(){WPFormsChallenge.core.timer.pause(),WPFormsChallenge.core.stepCompleted(5),p(".wpforms-challenge").addClass("wpforms-challenge-completed"),n.showPopup()},showPopup:function(){var e=WPFormsChallenge.core.timer.getSecondsLeft();p(".wpforms-challenge-popup-container").show(),0<e?(e=WPFormsChallenge.core.timer.getSecondsSpent(e),p("#wpforms-challenge-congrats-minutes").text(WPFormsChallenge.core.timer.getMinutesFormatted(e)),p("#wpforms-challenge-congrats-seconds").text(WPFormsChallenge.core.timer.getSecondsFormatted(e)),p("#wpforms-challenge-congrats-popup").show()):p("#wpforms-challenge-contact-popup").show()},hidePopup:function(){p(".wpforms-challenge-popup-container").hide(),p(".wpforms-challenge-popup").hide()},completeChallenge:function(){var e={status:"completed",seconds_spent:WPFormsChallenge.core.timer.getSecondsSpent(),seconds_left:WPFormsChallenge.core.timer.getSecondsLeft()};n.hidePopup(),WPFormsChallenge.core.removeChallengeUI(),WPFormsChallenge.core.clearLocalStorage(),WPFormsChallenge.admin.saveChallengeOption(e).done(WPFormsChallenge.core.triggerPageSave)},submitContactForm:function(e){e.preventDefault();var o=p(this),e=o.closest("#wpforms-challenge-contact-form"),e={action:"wpforms_challenge_send_contact_form",_wpnonce:WPFormsChallenge.admin.l10n.nonce,contact_data:{message:e.find(".wpforms-challenge-contact-message").val(),contact_me:e.find(".wpforms-challenge-contact-permission").prop("checked")}};o.prop("disabled",!0),p.post(ajaxurl,e,function(e){e.success||console.error("Error sending WPForms Challenge Contact Form.")}).done(n.completeChallenge)},observeFullscreenMode:function(){var a=p("body"),c=a.hasClass("is-fullscreen-mode"),e={targetNode:a[0],config:{attributes:!0},callback:function(e,o){var n,t,l,s=p(".wpforms-challenge-tooltip-step5"),r=s.find(".tooltipster-arrow");for(l in e)"attributes"===(n=e[l]).type&&"class"===n.attributeName&&(t=a.hasClass("is-fullscreen-mode"))!==c&&((c=t)?(s.css({top:"93px",left:"0"}),r.css("left","91px")):(s.css({top:"125px",left:"66px"}),r.css("left","130px")))}};e.observer=new MutationObserver(e.callback),e.observer.observe(e.targetNode,e.config)}};return n}((document,window),jQuery),WPFormsChallenge.embed.init();