Commit realizado el 12:13:52 08-04-2024
This commit is contained in:
@@ -0,0 +1,758 @@
|
||||
/* global wpforms_builder, WPFormsBuilder, WPFormsUtils */
|
||||
|
||||
/**
|
||||
* Form Builder Fields Drag-n-Drop module.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPForms = window.WPForms || {};
|
||||
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
WPForms.Admin.Builder.DragFields = WPForms.Admin.Builder.DragFields || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements holder.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
let el = {};
|
||||
|
||||
/**
|
||||
* Runtime variables.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
let vars = {};
|
||||
|
||||
/**
|
||||
* Layout field functions wrapper.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
let fieldLayout;
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
const app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* DOM is fully loaded.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.setup();
|
||||
app.initSortableFields();
|
||||
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
setup: function() {
|
||||
|
||||
// Cache DOM elements.
|
||||
el = {
|
||||
$builder: $( '#wpforms-builder' ),
|
||||
$sortableFieldsWrap: $( '#wpforms-panel-fields .wpforms-field-wrap' ),
|
||||
$addFieldsButtons: $( '.wpforms-add-fields-button' ).not( '.not-draggable' ).not( '.warning-modal' ).not( '.education-modal' ),
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
el.$builder
|
||||
.on( 'wpformsFieldDragToggle', app.fieldDragToggleEvent );
|
||||
},
|
||||
|
||||
/**
|
||||
* Disable drag & drop.
|
||||
*
|
||||
* @since 1.7.1
|
||||
* @since 1.7.7 Moved from admin-builder.js.
|
||||
*/
|
||||
disableDragAndDrop: function() {
|
||||
|
||||
el.$addFieldsButtons.filter( '.ui-draggable' ).draggable( 'disable' );
|
||||
el.$sortableFieldsWrap.sortable( 'disable' );
|
||||
el.$sortableFieldsWrap.find( '.wpforms-layout-column.ui-sortable' ).sortable( 'disable' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable drag & drop.
|
||||
*
|
||||
* @since 1.7.1
|
||||
* @since 1.7.7 Moved from admin-builder.js.
|
||||
*/
|
||||
enableDragAndDrop: function() {
|
||||
|
||||
el.$addFieldsButtons.filter( '.ui-draggable' ).draggable( 'enable' );
|
||||
el.$sortableFieldsWrap.sortable( 'enable' );
|
||||
el.$sortableFieldsWrap.find( '.wpforms-layout-column.ui-sortable' ).sortable( 'enable' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Show popup in case if field is not draggable, and cancel moving.
|
||||
*
|
||||
* @since 1.7.5
|
||||
* @since 1.7.7 Moved from admin-builder.js.
|
||||
*
|
||||
* @param {jQuery} $field A field or list of fields.
|
||||
* @param {boolean} showPopUp Whether the pop-up should be displayed on dragging attempt.
|
||||
*/
|
||||
fieldDragDisable: function( $field, showPopUp = true ) {
|
||||
|
||||
if ( $field.hasClass( 'ui-draggable-disabled' ) ) {
|
||||
$field.draggable( 'enable' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
let startTopPosition;
|
||||
|
||||
$field.draggable( {
|
||||
revert: true,
|
||||
axis: 'y',
|
||||
delay: 100,
|
||||
opacity: 0.75,
|
||||
cursor: 'move',
|
||||
start: function( event, ui ) {
|
||||
|
||||
startTopPosition = ui.position.top;
|
||||
},
|
||||
drag: function( event, ui ) {
|
||||
|
||||
if ( Math.abs( ui.position.top ) - Math.abs( startTopPosition ) > 15 ) {
|
||||
|
||||
if ( showPopUp ) {
|
||||
app.youCantReorderFieldPopup();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Allow field dragging.
|
||||
*
|
||||
* @since 1.7.5
|
||||
* @since 1.7.7 Moved from admin-builder.js.
|
||||
*
|
||||
* @param {jQuery} $field A field or list of fields.
|
||||
*/
|
||||
fieldDragEnable: function( $field ) {
|
||||
|
||||
if ( $field.hasClass( 'ui-draggable' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$field.draggable( 'disable' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Show the error message in the popup that you cannot reorder the field.
|
||||
*
|
||||
* @since 1.7.1
|
||||
* @since 1.7.7 Moved from admin-builder.js.
|
||||
*/
|
||||
youCantReorderFieldPopup: function() {
|
||||
|
||||
$.confirm( {
|
||||
title: wpforms_builder.heads_up,
|
||||
content: wpforms_builder.field_cannot_be_reordered,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'red',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Event handler for `wpformsFieldDragToggle` event.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
* @param {numeric} id Field ID.
|
||||
*/
|
||||
fieldDragToggleEvent: function( e, id ) {
|
||||
|
||||
const $field = $( `#wpforms-field-${id}` );
|
||||
|
||||
if (
|
||||
$field.hasClass( 'wpforms-field-not-draggable' ) ||
|
||||
$field.hasClass( 'wpforms-field-stick' )
|
||||
) {
|
||||
app.fieldDragDisable( $field );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.fieldDragEnable( $field );
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize sortable fields in the builder form preview area.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
initSortableFields: function() {
|
||||
|
||||
app.initSortableContainer( el.$sortableFieldsWrap );
|
||||
|
||||
el.$builder.find( '.wpforms-layout-column' ).each( function() {
|
||||
app.initSortableContainer( $( this ) );
|
||||
} );
|
||||
|
||||
app.fieldDragDisable( $( '.wpforms-field-not-draggable, .wpforms-field-stick' ) );
|
||||
app.initDraggableFields();
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize sortable container with fields.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {jQuery} $sortable Container to make sortable.
|
||||
*/
|
||||
initSortableContainer: function( $sortable ) { // eslint-disable-line max-lines-per-function
|
||||
|
||||
const $fieldOptions = $( '#wpforms-field-options' );
|
||||
|
||||
let fieldId,
|
||||
fieldType,
|
||||
isNewField,
|
||||
$fieldOption,
|
||||
$prevFieldOption,
|
||||
prevFieldId,
|
||||
$scrollContainer = $( '#wpforms-panel-fields .wpforms-panel-content-wrap' ),
|
||||
currentlyScrolling = false;
|
||||
|
||||
$sortable.sortable( {
|
||||
items: '> .wpforms-field:not(.wpforms-field-stick):not(.no-fields-preview)',
|
||||
connectWith: '.wpforms-field-wrap, .wpforms-layout-column',
|
||||
delay: 100,
|
||||
opacity: 0.75,
|
||||
cursor: 'move',
|
||||
cancel: '.wpforms-field-not-draggable',
|
||||
placeholder: 'wpforms-field-drag-placeholder',
|
||||
appendTo: '#wpforms-panel-fields',
|
||||
zindex: 10000,
|
||||
tolerance: 'pointer',
|
||||
distance: 1,
|
||||
start: function( e, ui ) {
|
||||
|
||||
fieldId = ui.item.data( 'field-id' );
|
||||
fieldType = ui.item.data( 'field-type' );
|
||||
isNewField = typeof fieldId === 'undefined';
|
||||
$fieldOption = $( '#wpforms-field-option-' + fieldId );
|
||||
|
||||
vars.fieldReceived = false;
|
||||
vars.fieldRejected = false;
|
||||
vars.$sortableStart = $sortable;
|
||||
vars.startPosition = ui.item.first().index();
|
||||
},
|
||||
beforeStop: function( e, ui ) {
|
||||
|
||||
if ( ! vars.glitchChange ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Before processing in the `stop` method we need to perform the last check.
|
||||
if ( ! fieldLayout.isFieldAllowedInColum( fieldType ) ) {
|
||||
vars.fieldRejected = true;
|
||||
}
|
||||
},
|
||||
stop: function( e, ui ) {
|
||||
|
||||
const $field = ui.item.first();
|
||||
|
||||
ui.placeholder.removeClass( 'wpforms-field-drag-not-allowed' );
|
||||
$field.removeClass( 'wpforms-field-drag-not-allowed' );
|
||||
|
||||
// Reject not allowed fields.
|
||||
if ( vars.fieldRejected ) {
|
||||
app.revertMoveFieldToColumn( $field );
|
||||
|
||||
el.$builder.trigger( 'wpformsFieldMoveRejected', [ $field, ui ] );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
prevFieldId = $field.prev( '.wpforms-field, .wpforms-alert' ).data( 'field-id' );
|
||||
$prevFieldOption = $( `#wpforms-field-option-${prevFieldId}` );
|
||||
|
||||
if ( $prevFieldOption.length > 0 ) {
|
||||
$prevFieldOption.after( $fieldOption );
|
||||
} else {
|
||||
$fieldOptions.prepend( $fieldOption );
|
||||
}
|
||||
|
||||
// In the case of changing fields order inside the same column,
|
||||
// we just need to change the position of the field.
|
||||
if ( ! isNewField && $field.closest( '.wpforms-layout-column' ).is( $sortable ) ) {
|
||||
fieldLayout.positionFieldInColumn(
|
||||
fieldId,
|
||||
$field.index() - 1,
|
||||
$sortable
|
||||
);
|
||||
}
|
||||
|
||||
const $layoutField = $field.closest( '.wpforms-field-layout' );
|
||||
|
||||
fieldLayout.fieldOptionsUpdate( null, fieldId );
|
||||
fieldLayout.reorderLayoutFieldsOptions( $layoutField );
|
||||
|
||||
if ( ! isNewField ) {
|
||||
$field
|
||||
.removeClass( 'wpforms-field-dragging' )
|
||||
.removeClass( 'wpforms-field-drag-over' );
|
||||
}
|
||||
|
||||
$field.attr( 'style', '' );
|
||||
|
||||
el.$builder.trigger( 'wpformsFieldMove', ui );
|
||||
|
||||
vars.fieldReceived = false;
|
||||
},
|
||||
over: function( e, ui ) { // eslint-disable-line complexity
|
||||
|
||||
const $field = ui.item.first(),
|
||||
$target = $( e.target ),
|
||||
$placeholder = $target.find( '.wpforms-field-drag-placeholder' ),
|
||||
isColumn = $target.hasClass( 'wpforms-layout-column' ),
|
||||
targetClass = isColumn ? ' wpforms-field-drag-to-column' : '',
|
||||
helper = {
|
||||
width: $target.outerWidth(),
|
||||
height: $field.outerHeight(),
|
||||
};
|
||||
|
||||
fieldId = $field.data( 'field-id' );
|
||||
fieldType = $field.data( 'field-type' ) || vars.fieldType;
|
||||
isNewField = typeof fieldId === 'undefined';
|
||||
|
||||
// Adjust helper size according to the placeholder size.
|
||||
$field
|
||||
.addClass( 'wpforms-field-dragging' + targetClass )
|
||||
.css( {
|
||||
'width': isColumn ? helper.width - 5 : helper.width,
|
||||
'height': 'auto',
|
||||
} );
|
||||
|
||||
// Adjust placeholder height according to the height of the helper.
|
||||
$placeholder
|
||||
.removeClass( 'wpforms-field-drag-not-allowed' )
|
||||
.css( {
|
||||
'height': isNewField ? helper.height + 18 : helper.height,
|
||||
} );
|
||||
|
||||
// Drop to this place is not allowed.
|
||||
if (
|
||||
! fieldLayout.isFieldAllowedInColum( fieldType ) &&
|
||||
isColumn
|
||||
) {
|
||||
$placeholder.addClass( 'wpforms-field-drag-not-allowed' );
|
||||
$field.addClass( 'wpforms-field-drag-not-allowed' );
|
||||
}
|
||||
|
||||
// Skip if it is the existing field.
|
||||
if ( ! isNewField ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$field
|
||||
.addClass( 'wpforms-field-drag-over' )
|
||||
.removeClass( 'wpforms-field-drag-out' );
|
||||
},
|
||||
out: function( e, ui ) {
|
||||
|
||||
const $field = ui.item.first(),
|
||||
fieldId = $field.data( 'field-id' ),
|
||||
isNewField = typeof fieldId === 'undefined';
|
||||
|
||||
$field
|
||||
.removeClass( 'wpforms-field-drag-not-allowed' )
|
||||
.removeClass( 'wpforms-field-drag-to-column' );
|
||||
|
||||
if ( vars.fieldReceived ) {
|
||||
$field.attr( 'style', '' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Skip if it is the existing field.
|
||||
if ( ! isNewField ) {
|
||||
|
||||
// Remove extra class from the parent layout field.
|
||||
// Fixes disappearing of duplicate/delete field icons
|
||||
// after moving the field outside the layout field.
|
||||
$( ui.sender )
|
||||
.closest( '.wpforms-field-layout' )
|
||||
.removeClass( 'wpforms-field-child-hovered' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$field
|
||||
.addClass( 'wpforms-field-drag-out' )
|
||||
.removeClass( 'wpforms-field-drag-over' );
|
||||
},
|
||||
receive: function( e, ui ) { // eslint-disable-line complexity
|
||||
|
||||
const $field = $( ui.helper || ui.item );
|
||||
|
||||
fieldId = $field.data( 'field-id' );
|
||||
fieldType = $field.data( 'field-type' ) || vars.fieldType;
|
||||
|
||||
const isNewField = typeof fieldId === 'undefined',
|
||||
isColumn = $sortable.hasClass( 'wpforms-layout-column' );
|
||||
|
||||
// Drop to this place is not allowed.
|
||||
if (
|
||||
! fieldLayout.isFieldAllowedInColum( fieldType ) &&
|
||||
isColumn
|
||||
) {
|
||||
vars.fieldRejected = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
vars.fieldReceived = true;
|
||||
|
||||
$field.removeClass( 'wpforms-field-drag-over' );
|
||||
|
||||
// Move existing field.
|
||||
if ( ! isNewField ) {
|
||||
fieldLayout.receiveFieldToColumn(
|
||||
fieldId,
|
||||
ui.item.index() - 1,
|
||||
$field.parent()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Add new field.
|
||||
let position = $sortable.data( 'ui-sortable' ).currentItem.index();
|
||||
|
||||
$field
|
||||
.addClass( 'wpforms-field-drag-over wpforms-field-drag-pending' )
|
||||
.removeClass( 'wpforms-field-drag-out' )
|
||||
.append( WPFormsBuilder.settings.spinnerInline )
|
||||
.css( 'width', '100%' );
|
||||
|
||||
el.$builder.find( '.no-fields-preview' ).remove();
|
||||
|
||||
WPFormsBuilder.fieldAdd(
|
||||
vars.fieldType,
|
||||
{
|
||||
position: isColumn ? position - 1 : position,
|
||||
placeholder: $field,
|
||||
$sortable: $sortable,
|
||||
}
|
||||
);
|
||||
|
||||
vars.fieldType = undefined;
|
||||
},
|
||||
change: function( e, ui ) {
|
||||
|
||||
const $placeholderSortable = ui.placeholder.parent();
|
||||
|
||||
vars.glitchChange = false;
|
||||
|
||||
// In some cases sortable widget display placeholder in wrong sortable instance.
|
||||
// It's happens when you drag the field over/out the last column of the last Layout field.
|
||||
if (
|
||||
! $sortable.is( $placeholderSortable ) &&
|
||||
$sortable.hasClass( 'wpforms-field-wrap' ) &&
|
||||
$placeholderSortable.hasClass( 'wpforms-layout-column' )
|
||||
) {
|
||||
vars.glitchChange = true;
|
||||
}
|
||||
},
|
||||
sort: function( e, ui ) {
|
||||
|
||||
if ( currentlyScrolling ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const scrollAreaHeight = 50,
|
||||
mouseYPosition = e.clientY,
|
||||
containerOffset = $scrollContainer.offset(),
|
||||
containerHeight = $scrollContainer.height(),
|
||||
containerBottom = containerOffset.top + containerHeight;
|
||||
|
||||
let operator;
|
||||
|
||||
if (
|
||||
mouseYPosition > containerOffset.top &&
|
||||
mouseYPosition < ( containerOffset.top + scrollAreaHeight )
|
||||
) {
|
||||
operator = '-=';
|
||||
} else if (
|
||||
mouseYPosition > ( containerBottom - scrollAreaHeight ) &&
|
||||
mouseYPosition < containerBottom
|
||||
) {
|
||||
operator = '+=';
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
currentlyScrolling = true;
|
||||
|
||||
$scrollContainer.animate(
|
||||
{
|
||||
scrollTop: operator + containerHeight / 3 + 'px',
|
||||
},
|
||||
800,
|
||||
function() {
|
||||
currentlyScrolling = false;
|
||||
}
|
||||
);
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize draggable fields buttons.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
initDraggableFields: function() {
|
||||
|
||||
el.$addFieldsButtons.draggable( {
|
||||
connectToSortable: '.wpforms-field-wrap, .wpforms-layout-column',
|
||||
delay: 200,
|
||||
cancel: false,
|
||||
scroll: false,
|
||||
opacity: 0.75,
|
||||
appendTo: '#wpforms-panel-fields',
|
||||
zindex: 10000,
|
||||
helper() {
|
||||
const $this = $( this );
|
||||
const $el = $( '<div class="wpforms-field-drag-out wpforms-field-drag">' );
|
||||
|
||||
vars.fieldType = $this.data( 'field-type' );
|
||||
|
||||
return $el.html( $this.html() );
|
||||
},
|
||||
|
||||
start( e, ui ) {
|
||||
const event = WPFormsUtils.triggerEvent(
|
||||
el.$builder,
|
||||
'wpformsFieldAddDragStart',
|
||||
[ vars.fieldType, ui ]
|
||||
);
|
||||
|
||||
// Allow callbacks on `wpformsFieldAddDragStart` to cancel dragging the field
|
||||
// by triggering `event.preventDefault()`.
|
||||
if ( event.isDefaultPrevented() ) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
stop( e, ui ) {
|
||||
const event = WPFormsUtils.triggerEvent(
|
||||
el.$builder,
|
||||
'wpformsFieldAddDragStop',
|
||||
[ vars.fieldType, ui ]
|
||||
);
|
||||
|
||||
// Allow callbacks on `wpformsFieldAddDragStop` to cancel dragging the field
|
||||
// by triggering `event.preventDefault()`.
|
||||
if ( event.isDefaultPrevented() ) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Revert moving the field to the column.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {jQuery} $field Field object.
|
||||
*/
|
||||
revertMoveFieldToColumn: function( $field ) {
|
||||
|
||||
const isNewField = $field.data( 'field-id' ) === undefined;
|
||||
|
||||
if ( isNewField ) {
|
||||
|
||||
// Remove the field.
|
||||
$field.remove();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Restore existing field on the previous position.
|
||||
$field = $field.detach();
|
||||
|
||||
const $fieldInStartPosition = vars.$sortableStart
|
||||
.find( '> .wpforms-field' )
|
||||
.eq( vars.startPosition );
|
||||
|
||||
$field
|
||||
.removeClass( 'wpforms-field-dragging' )
|
||||
.removeClass( 'wpforms-field-drag-over' )
|
||||
.attr( 'style', '' );
|
||||
|
||||
if ( $fieldInStartPosition.length ) {
|
||||
$fieldInStartPosition.before( $field );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
vars.$sortableStart.append( $field );
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Layout field functions holder.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
fieldLayout = {
|
||||
|
||||
/**
|
||||
* Position field in the column inside the Layout Field.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {number} fieldId Field Id.
|
||||
* @param {number} position The new position of the field inside the column.
|
||||
* @param {jQuery} $sortable Sortable column container.
|
||||
**/
|
||||
positionFieldInColumn: function( fieldId, position, $sortable ) {
|
||||
|
||||
if ( ! WPForms.Admin.Builder.FieldLayout ) {
|
||||
return;
|
||||
}
|
||||
|
||||
WPForms.Admin.Builder.FieldLayout.positionFieldInColumn( fieldId, position, $sortable );
|
||||
},
|
||||
|
||||
/**
|
||||
* Receive field to column inside the Layout Field.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {number} fieldId Field Id.
|
||||
* @param {number} position Field position inside the column.
|
||||
* @param {jQuery} $sortable Sortable column container.
|
||||
**/
|
||||
receiveFieldToColumn: function( fieldId, position, $sortable ) {
|
||||
|
||||
if ( ! WPForms.Admin.Builder.FieldLayout ) {
|
||||
return;
|
||||
}
|
||||
|
||||
WPForms.Admin.Builder.FieldLayout.receiveFieldToColumn( fieldId, position, $sortable );
|
||||
},
|
||||
|
||||
/**
|
||||
* Update field options according to the position of the field.
|
||||
* Event `wpformsFieldOptionTabToggle` handler.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {Event} e Event.
|
||||
* @param {int} fieldId Field id.
|
||||
*/
|
||||
fieldOptionsUpdate: function( e, fieldId ) {
|
||||
|
||||
if ( ! WPForms.Admin.Builder.FieldLayout ) {
|
||||
return;
|
||||
}
|
||||
|
||||
WPForms.Admin.Builder.FieldLayout.fieldOptionsUpdate( e, fieldId );
|
||||
},
|
||||
|
||||
/**
|
||||
* Reorder fields options of the fields in columns.
|
||||
* It is not critical, but it's better to keep some order in the `fields` data array.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {jQuery} $layoutField Layout field object.
|
||||
*/
|
||||
reorderLayoutFieldsOptions: function( $layoutField ) {
|
||||
|
||||
if ( ! WPForms.Admin.Builder.FieldLayout ) {
|
||||
return;
|
||||
}
|
||||
|
||||
WPForms.Admin.Builder.FieldLayout.reorderLayoutFieldsOptions( $layoutField );
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the field type is allowed to be in column.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {string} fieldType Field ty to check.
|
||||
*
|
||||
* @returns {boolean} True if allowed.
|
||||
*/
|
||||
isFieldAllowedInColum: function( fieldType ) {
|
||||
|
||||
if ( ! WPForms.Admin.Builder.FieldLayout ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return WPForms.Admin.Builder.FieldLayout.isFieldAllowedInColum( fieldType );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.DragFields.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/drag-fields.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/drag-fields.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,287 @@
|
||||
/**
|
||||
* WPForms Builder Dropdown List module.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
|
||||
/*
|
||||
Usage:
|
||||
|
||||
dropdownList = WPForms.Admin.Builder.DropdownList.init( {
|
||||
class: 'insert-field-dropdown', // Additional CSS class.
|
||||
title: 'Dropdown Title', // Dropdown title.
|
||||
list: [ // Items list.
|
||||
{ value: '1', text: 'Item 1' },
|
||||
{ value: '2', text: 'Item 2' },
|
||||
{ value: '3', text: 'Item 3' },
|
||||
],
|
||||
container: $( '.holder-container' ), // Holder container. Optional.
|
||||
scrollableContainer: $( '.scrollable-container' ), // Scrollable container. Optional.
|
||||
button: $( '.button' ), // Button.
|
||||
buttonDistance: 21, // Distance from dropdown to the button.
|
||||
itemFormat( item ) { // Item element renderer. Optional.
|
||||
return `<span>${ item.text }</span>`;
|
||||
},
|
||||
onSelect( event, value, text, $item, instance ) { // On select event handler.
|
||||
console.log( 'Item selected:', text );
|
||||
instance.close();
|
||||
$button.removeClass( 'active' );
|
||||
},
|
||||
} );
|
||||
*/
|
||||
|
||||
var WPForms = window.WPForms || {}; // eslint-disable-line no-var
|
||||
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
WPForms.Admin.Builder.DropdownList = WPForms.Admin.Builder.DropdownList || ( function( document, window, $ ) {
|
||||
/**
|
||||
* DropdownList object constructor.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
function DropdownList( options ) { // eslint-disable-line max-lines-per-function
|
||||
const self = this;
|
||||
|
||||
/**
|
||||
* Default options.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
const defaultOptions = {
|
||||
class: '',
|
||||
title: '',
|
||||
list: [],
|
||||
container: null,
|
||||
scrollableContainer: null,
|
||||
button: null,
|
||||
buttonDistance: 10,
|
||||
onSelect: null,
|
||||
itemFormat( item ) {
|
||||
return item.text;
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Options.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @type {jQuery}
|
||||
*/
|
||||
self.options = $.extend( defaultOptions, options );
|
||||
|
||||
/**
|
||||
* Main dropdown container.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @type {jQuery}
|
||||
*/
|
||||
self.$el = null;
|
||||
|
||||
/**
|
||||
* Form builder container.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @type {jQuery}
|
||||
*/
|
||||
self.$builder = $( '#wpforms-builder' );
|
||||
|
||||
/**
|
||||
* Close the dropdown.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
self.close = function() {
|
||||
self.$el.addClass( 'closed' );
|
||||
};
|
||||
|
||||
/**
|
||||
* Open the dropdown.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
self.open = function() {
|
||||
self.$el.removeClass( 'closed' );
|
||||
self.setPosition();
|
||||
|
||||
// Close dropdown on click outside.
|
||||
self.$builder.on( 'click.DropdowmList', function( e ) {
|
||||
const $target = $( e.target );
|
||||
|
||||
if ( $target.closest( self.$el ).length || $target.hasClass( 'button-insert-field' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.$builder.off( 'click.DropdowmList' );
|
||||
|
||||
const $button = $( self.options.button );
|
||||
|
||||
if ( $button.hasClass( 'active' ) ) {
|
||||
$button.trigger( 'click' );
|
||||
}
|
||||
} );
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate the dropdown HTML.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @return {string} HTML.
|
||||
*/
|
||||
self.generateHtml = function() {
|
||||
const list = self.options.list;
|
||||
|
||||
if ( ! list || list.length === 0 ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const itemFormat = typeof self.options.itemFormat === 'function' ? self.options.itemFormat : defaultOptions.itemFormat;
|
||||
|
||||
// Generate HTML.
|
||||
const items = [];
|
||||
|
||||
for ( const i in list ) {
|
||||
items.push( `<li data-value="${ list[ i ].value }">${ itemFormat( list[ i ] ) }</li>` );
|
||||
}
|
||||
|
||||
return `<div class="wpforms-builder-dropdown-list closed ${ self.options.class }">
|
||||
<div class="title">${ self.options.title }</div>
|
||||
<ul>${ items.join( '' ) }</ul>
|
||||
</div>`;
|
||||
};
|
||||
|
||||
/**
|
||||
* Attach dropdown to DOM.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
self.attach = function() {
|
||||
const html = self.generateHtml();
|
||||
|
||||
// Remove old dropdown.
|
||||
if ( self.$el && self.$el.length ) {
|
||||
self.$el.remove();
|
||||
}
|
||||
|
||||
// Create jQuery objects.
|
||||
self.$el = $( html );
|
||||
self.$button = $( self.options.button );
|
||||
self.$container = self.options.container ? $( self.options.container ) : self.$button.parent();
|
||||
self.$scrollableContainer = self.options.scrollableContainer ? $( self.options.scrollableContainer ) : null;
|
||||
|
||||
// Add the dropdown to the container.
|
||||
self.$container.append( self.$el );
|
||||
|
||||
self.setPosition();
|
||||
};
|
||||
|
||||
/**
|
||||
* Set dropdown position.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
self.setPosition = function() {
|
||||
// Calculate position.
|
||||
const buttonOffset = self.$button.offset(),
|
||||
containerOffset = self.$container.offset(),
|
||||
containerPosition = self.$container.position(),
|
||||
dropdownHeight = self.$el.height(),
|
||||
scrollTop = self.$scrollableContainer ? self.$scrollableContainer.scrollTop() : 0;
|
||||
|
||||
let top = buttonOffset.top - containerOffset.top - dropdownHeight - self.options.buttonDistance;
|
||||
|
||||
// In the case of the dropdown doesn't fit into the scrollable container to top, it is needed to open the dropdown to the bottom.
|
||||
if ( scrollTop + containerPosition.top - dropdownHeight < 0 ) {
|
||||
top = buttonOffset.top - containerOffset.top + self.$button.height() + self.options.buttonDistance - 11;
|
||||
}
|
||||
|
||||
self.$el.css( 'top', top );
|
||||
|
||||
// The dropdown is outside the field options, it is needed to set `left` positioning value.
|
||||
if ( self.$container.closest( '.wpforms-field-option' ).length === 0 ) {
|
||||
self.$el.css( 'left', buttonOffset.left - containerOffset.left );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Events.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
self.events = function() {
|
||||
// Click (select) the item.
|
||||
self.$el.find( 'li' ).off()
|
||||
.on( 'click', function( event ) {
|
||||
// Bail if callback is not a function.
|
||||
if ( typeof self.options.onSelect !== 'function' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const $item = $( this );
|
||||
|
||||
self.options.onSelect( event, $item.data( 'value' ), $item.text(), $item, self );
|
||||
} );
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @param {Array} list List of items.
|
||||
*/
|
||||
self.init = function( list = null ) {
|
||||
self.options.list = list ? list : self.options.list;
|
||||
|
||||
self.attach();
|
||||
self.events();
|
||||
|
||||
self.$button.data( 'dropdown-list', self );
|
||||
};
|
||||
|
||||
/**
|
||||
* Destroy.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
self.destroy = function() {
|
||||
self.$button.data( 'dropdown-list', null );
|
||||
self.$el.remove();
|
||||
};
|
||||
|
||||
// Initialize.
|
||||
self.init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
return {
|
||||
|
||||
/**
|
||||
* Start the engine. DOM is not ready yet, use only to init something.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @param {Object} options Options.
|
||||
*
|
||||
* @return {Object} DropdownList instance.
|
||||
*/
|
||||
init( options ) {
|
||||
return new DropdownList( options );
|
||||
},
|
||||
};
|
||||
}( document, window, jQuery ) );
|
4
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/dropdown-list.min.js
vendored
Normal file
4
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/dropdown-list.min.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.DropdownList=WPForms.Admin.Builder.DropdownList||function(n){function o(t){const s=this,i={class:"",title:"",list:[],container:null,scrollableContainer:null,button:null,buttonDistance:10,onSelect:null,itemFormat(t){return t.text}};s.options=n.extend(i,t),s.$el=null,s.$builder=n("#wpforms-builder"),s.close=function(){s.$el.addClass("closed")},s.open=function(){s.$el.removeClass("closed"),s.setPosition(),s.$builder.on("click.DropdowmList",function(t){var t=n(t.target);t.closest(s.$el).length||t.hasClass("button-insert-field")||(s.$builder.off("click.DropdowmList"),(t=n(s.options.button)).hasClass("active")&&t.trigger("click"))})},s.generateHtml=function(){var t=s.options.list;if(!t||0===t.length)return"";var o=("function"==typeof s.options.itemFormat?s.options:i).itemFormat,n=[];for(const e in t)n.push(`<li data-value="${t[e].value}">${o(t[e])}</li>`);return`<div class="wpforms-builder-dropdown-list closed ${s.options.class}">
|
||||
<div class="title">${s.options.title}</div>
|
||||
<ul>${n.join("")}</ul>
|
||||
</div>`},s.attach=function(){var t=s.generateHtml();s.$el&&s.$el.length&&s.$el.remove(),s.$el=n(t),s.$button=n(s.options.button),s.$container=s.options.container?n(s.options.container):s.$button.parent(),s.$scrollableContainer=s.options.scrollableContainer?n(s.options.scrollableContainer):null,s.$container.append(s.$el),s.setPosition()},s.setPosition=function(){var t=s.$button.offset(),o=s.$container.offset(),n=s.$container.position(),e=s.$el.height(),i=s.$scrollableContainer?s.$scrollableContainer.scrollTop():0;let l=t.top-o.top-e-s.options.buttonDistance;i+n.top-e<0&&(l=t.top-o.top+s.$button.height()+s.options.buttonDistance-11),s.$el.css("top",l),0===s.$container.closest(".wpforms-field-option").length&&s.$el.css("left",t.left-o.left)},s.events=function(){s.$el.find("li").off().on("click",function(t){var o;"function"==typeof s.options.onSelect&&(o=n(this),s.options.onSelect(t,o.data("value"),o.text(),o,s))})},s.init=function(t=null){s.options.list=t||s.options.list,s.attach(),s.events(),s.$button.data("dropdown-list",s)},s.destroy=function(){s.$button.data("dropdown-list",null),s.$el.remove()},s.init()}return{init(t){return new o(t)}}}((document,window,jQuery));
|
@@ -0,0 +1,216 @@
|
||||
/* eslint-disable camelcase */
|
||||
/* global wpforms_builder_email_template */
|
||||
|
||||
/**
|
||||
* Script for manipulating DOM events in the "Builder" settings page.
|
||||
* This script will be accessible in the "WPForms" → "Builder" → "Notifications" tab/page.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
|
||||
const WPFormsBuilderEmailTemplate = window.WPFormsBuilderEmailTemplate || ( function( document, window, $, l10n ) {
|
||||
/**
|
||||
* Elements holder.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
const el = {};
|
||||
|
||||
/**
|
||||
* Runtime variables.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
const vars = {
|
||||
/**
|
||||
* Modal instance.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
modal: null,
|
||||
|
||||
/**
|
||||
* Generic CSS class names for applying visual changes.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
classNames: {
|
||||
modalBox: 'wpforms-modal-content-box',
|
||||
modalOpen: 'wpforms-email-template-modal-open',
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
const app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
init() {
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
ready() {
|
||||
app.setup();
|
||||
app.bindEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
setup() {
|
||||
// Cache DOM elements.
|
||||
el.$document = $( document );
|
||||
el.$body = $( 'body' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
bindEvents() {
|
||||
el.$document
|
||||
.on( 'change', '.wpforms-email-template-modal-content input[type="radio"]', app.handleOnChangeTemplate )
|
||||
.on( 'click', '.wpforms-all-email-template-modal', app.handleOnOpenModal );
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle the "change" event for the template radio buttons.
|
||||
* This function updates the select field based on the selected radio button.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*
|
||||
* @param {Object} event The DOM event that triggered the function.
|
||||
*/
|
||||
handleOnChangeTemplate( event ) {
|
||||
// Prevent the default action, which is to handle the change event.
|
||||
event.preventDefault();
|
||||
|
||||
// Extract the ID of the field from the element.
|
||||
const id = app.getIdFromElm( $( this ) );
|
||||
|
||||
// Get the corresponding select field.
|
||||
const $field = $( `#wpforms-panel-field-notifications-${ id }-template` );
|
||||
|
||||
// If the select field doesn't exist, no further action is needed.
|
||||
if ( ! $field.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If the modal doesn't exist, no further action is needed.
|
||||
if ( ! vars.modal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the value of the radio button that triggered the change.
|
||||
const value = $( this ).val();
|
||||
|
||||
// Update the select field with the selected value and trigger the change event.
|
||||
$field.val( value ).trigger( 'change' );
|
||||
|
||||
// Close the modal.
|
||||
vars.modal.close();
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle the "click" event for opening the modal.
|
||||
* This will open the modal with the available templates.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
handleOnOpenModal() {
|
||||
// Get the email template modal template.
|
||||
const template = wp.template( 'wpforms-email-template-modal' );
|
||||
|
||||
// If the template doesn't exist, exit the function.
|
||||
if ( ! template.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the closest wrapper and select element.
|
||||
const $wrapper = $( this ).closest( '.wpforms-panel-field-email-template-wrap' );
|
||||
const $select = $wrapper.find( 'select' );
|
||||
|
||||
// Get the selected value from the select element and its ID.
|
||||
const selected = $select.val() || '';
|
||||
const id = app.getIdFromElm( $select );
|
||||
|
||||
// Extract relevant data from l10n.
|
||||
const { templates, is_pro } = l10n;
|
||||
|
||||
// Prepare the data to be passed to the template.
|
||||
const data = { templates, selected, is_pro, id };
|
||||
|
||||
// Generate the modal's content using the template and data.
|
||||
const content = template( data );
|
||||
|
||||
// Open the modal.
|
||||
vars.modal = $.confirm( {
|
||||
content,
|
||||
title: '',
|
||||
boxWidth: 800,
|
||||
contentMaxHeight: 'none',
|
||||
backgroundDismiss: true,
|
||||
smoothContent: false,
|
||||
closeIcon: true,
|
||||
buttons: false,
|
||||
// Callback function before the modal opens.
|
||||
onOpenBefore() {
|
||||
this.$body.addClass( vars.classNames.modalBox );
|
||||
el.$body.addClass( vars.classNames.modalOpen );
|
||||
},
|
||||
// Callback function when the modal is closed.
|
||||
onClose() {
|
||||
el.$body.removeClass( vars.classNames.modalOpen );
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the ID from the element.
|
||||
* This is a helper function for extracting the numeric ID from an element's ID attribute.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*
|
||||
* @param {Object} $elm jQuery object representing the element.
|
||||
*
|
||||
* @return {number} The numeric ID extracted from the element's ID attribute.
|
||||
*/
|
||||
getIdFromElm( $elm ) {
|
||||
// Get the ID attribute from the element.
|
||||
const id = $elm.attr( 'id' );
|
||||
|
||||
// If no ID attribute is found, return 0.
|
||||
if ( ! id ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Extract and parse the numeric part from the ID.
|
||||
return parseInt( id.match( /\d+/ )[ 0 ], 10 );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
}( document, window, jQuery, wpforms_builder_email_template ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsBuilderEmailTemplate.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/email-template.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/email-template.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const WPFormsBuilderEmailTemplate=window.WPFormsBuilderEmailTemplate||function(e,m,n){const s={},d={modal:null,classNames:{modalBox:"wpforms-modal-content-box",modalOpen:"wpforms-email-template-modal-open"}},i={init(){m(i.ready)},ready(){i.setup(),i.bindEvents()},setup(){s.$document=m(e),s.$body=m("body")},bindEvents(){s.$document.on("change",'.wpforms-email-template-modal-content input[type="radio"]',i.handleOnChangeTemplate).on("click",".wpforms-all-email-template-modal",i.handleOnOpenModal)},handleOnChangeTemplate(e){e.preventDefault();var a,e=i.getIdFromElm(m(this)),e=m(`#wpforms-panel-field-notifications-${e}-template`);e.length&&d.modal&&(a=m(this).val(),e.val(a).trigger("change"),d.modal.close())},handleOnOpenModal(){var e,a,l,t,o=wp.template("wpforms-email-template-modal");o.length&&(e=(a=m(this).closest(".wpforms-panel-field-email-template-wrap").find("select")).val()||"",a=i.getIdFromElm(a),{templates:l,is_pro:t}=n,o=o({templates:l,selected:e,is_pro:t,id:a}),d.modal=m.confirm({content:o,title:"",boxWidth:800,contentMaxHeight:"none",backgroundDismiss:!0,smoothContent:!1,closeIcon:!0,buttons:!1,onOpenBefore(){this.$body.addClass(d.classNames.modalBox),s.$body.addClass(d.classNames.modalOpen)},onClose(){s.$body.removeClass(d.classNames.modalOpen)}}))},getIdFromElm(e){e=e.attr("id");return e?parseInt(e.match(/\d+/)[0],10):0}};return i}(document,(window,jQuery),wpforms_builder_email_template);WPFormsBuilderEmailTemplate.init();
|
@@ -0,0 +1,550 @@
|
||||
/* global wpforms_builder_help, wpf */
|
||||
|
||||
/**
|
||||
* WPForms Builder Help screen module.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPForms = window.WPForms || {};
|
||||
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
WPForms.Admin.Builder.Help = WPForms.Admin.Builder.Help || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements holder.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var el;
|
||||
|
||||
/**
|
||||
* UI functions.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var ui;
|
||||
|
||||
/**
|
||||
* Event handlers.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var event;
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine. DOM is not ready yet, use only to init something.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* DOM is fully loaded.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.setup();
|
||||
app.initCategories();
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
setup: function() {
|
||||
|
||||
// Cache DOM elements.
|
||||
el = {
|
||||
$builder: $( '#wpforms-builder' ),
|
||||
$builderForm: $( '#wpforms-builder-form' ),
|
||||
$helpBtn: $( '#wpforms-help' ),
|
||||
$help: $( '#wpforms-builder-help' ),
|
||||
$closeBtn: $( '#wpforms-builder-help-close' ),
|
||||
$search: $( '#wpforms-builder-help-search' ),
|
||||
$result: $( '#wpforms-builder-help-result' ),
|
||||
$noResult: $( '#wpforms-builder-help-no-result' ),
|
||||
$categories: $( '#wpforms-builder-help-categories' ),
|
||||
$footer: $( '#wpforms-builder-help-footer' ),
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
// Open/close help modal.
|
||||
el.$helpBtn.on( 'click', event.openHelp );
|
||||
el.$closeBtn.on( 'click', event.closeHelp );
|
||||
|
||||
// Expand/collapse category.
|
||||
el.$categories.on( 'click', '.wpforms-builder-help-category header', event.toggleCategory );
|
||||
|
||||
// View all Category Docs button click.
|
||||
el.$categories.on( 'click', '.wpforms-builder-help-category button.viewall', event.viewAllCategoryDocs );
|
||||
|
||||
// Input into search field.
|
||||
el.$search.on( 'keyup', 'input', _.debounce( event.inputSearch, 250 ) );
|
||||
|
||||
// Clear search field.
|
||||
el.$search.on( 'click', '#wpforms-builder-help-search-clear', event.clearSearch );
|
||||
},
|
||||
|
||||
/**
|
||||
* Init (generate) categories list.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
initCategories: function() {
|
||||
|
||||
// Display error if docs data is not available.
|
||||
if ( wpf.empty( wpforms_builder_help.docs ) ) {
|
||||
el.$categories.html( wp.template( 'wpforms-builder-help-categories-error' ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var tmpl = wp.template( 'wpforms-builder-help-categories' ),
|
||||
data = {
|
||||
categories: wpforms_builder_help.categories,
|
||||
docs: app.getDocsByCategories(),
|
||||
};
|
||||
|
||||
el.$categories.html( tmpl( data ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Init categories list.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @returns {object} Docs arranged by category.
|
||||
*/
|
||||
getDocsByCategories: function() {
|
||||
|
||||
var categories = wpforms_builder_help.categories,
|
||||
docs = wpforms_builder_help.docs || [],
|
||||
docsByCategories = {};
|
||||
|
||||
_.each( categories, function( categoryTitle, categorySlug ) {
|
||||
var docsByCategory = [];
|
||||
_.each( docs, function( doc ) {
|
||||
if ( doc.categories && doc.categories.indexOf( categorySlug ) > -1 ) {
|
||||
docsByCategory.push( doc );
|
||||
}
|
||||
} );
|
||||
docsByCategories[ categorySlug ] = docsByCategory;
|
||||
} );
|
||||
|
||||
return docsByCategories;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get docs recommended by search term.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {string} term Search term.
|
||||
*
|
||||
* @returns {Array} Recommended docs.
|
||||
*/
|
||||
getRecommendedDocs: function( term ) {
|
||||
|
||||
if ( wpf.empty( term ) ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
term = term.toLowerCase();
|
||||
|
||||
var docs = wpforms_builder_help.docs,
|
||||
recommendedDocs = [];
|
||||
|
||||
if ( wpf.empty( wpforms_builder_help.context.docs[ term ] ) ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
_.each( wpforms_builder_help.context.docs[ term ], function( docId ) {
|
||||
if ( ! wpf.empty( docs[ docId ] ) ) {
|
||||
recommendedDocs.push( docs[ docId ] );
|
||||
}
|
||||
} );
|
||||
|
||||
return recommendedDocs;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get docs filtered by search term.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {string} term Search term.
|
||||
*
|
||||
* @returns {Array} Filtered docs.
|
||||
*/
|
||||
getFilteredDocs: function( term ) {
|
||||
|
||||
if ( wpf.empty( term ) ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
var docs = wpforms_builder_help.docs,
|
||||
filteredDocs = [];
|
||||
|
||||
term = term.toLowerCase();
|
||||
|
||||
_.each( docs, function( doc ) {
|
||||
if ( doc.title && doc.title.toLowerCase().indexOf( term ) > -1 ) {
|
||||
filteredDocs.push( doc );
|
||||
}
|
||||
} );
|
||||
|
||||
return filteredDocs;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the current context (state) of the form builder.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @returns {string} Builder context string. For example 'fields/add_field' or 'settings/notifications'.
|
||||
*/
|
||||
getBuilderContext: function() {
|
||||
|
||||
// New (not saved) form.
|
||||
if ( wpf.empty( el.$builderForm.data( 'id' ) ) ) {
|
||||
return 'new_form';
|
||||
}
|
||||
|
||||
// Determine builder panel and section.
|
||||
var panel = el.$builder.find( '#wpforms-panels-toggle button.active' ).data( 'panel' ),
|
||||
$panel = el.$builder.find( '#wpforms-panel-' + panel ),
|
||||
section = '',
|
||||
subsection = '',
|
||||
context;
|
||||
|
||||
switch ( panel ) {
|
||||
case 'fields':
|
||||
section = $panel.find( '.wpforms-panel-sidebar .wpforms-tab a.active' ).parent().attr( 'id' );
|
||||
break;
|
||||
case 'setup':
|
||||
section = '';
|
||||
break;
|
||||
default:
|
||||
section = $panel.find( '.wpforms-panel-sidebar a.active' ).data( 'section' );
|
||||
}
|
||||
|
||||
section = ! wpf.empty( section ) ? section.replace( /-/g, '_' ) : '';
|
||||
|
||||
// Detect field type.
|
||||
if ( section === 'field_options' ) {
|
||||
subsection = $panel.find( '#wpforms-field-options .wpforms-field-option:visible .wpforms-field-option-hidden-type' ).val();
|
||||
}
|
||||
|
||||
// Combine to context array.
|
||||
context = [ panel, section, subsection ].filter( function( el ) {
|
||||
return ! wpf.empty( el ) && el !== 'default';
|
||||
} );
|
||||
|
||||
// Return imploded string.
|
||||
return context.join( '/' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the search term for the current builder context.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @returns {string} Builder context term string.
|
||||
*/
|
||||
getBuilderContextTerm: function() {
|
||||
|
||||
return wpforms_builder_help.context.terms[ app.getBuilderContext() ] || '';
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* UI functions.
|
||||
*/
|
||||
ui = {
|
||||
|
||||
/**
|
||||
* Configuration.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
config: {
|
||||
speed: 300, // Fading/sliding duration in milliseconds.
|
||||
},
|
||||
|
||||
/**
|
||||
* Display the element by fading them to opaque using CSS.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {jQuery} $el Element object.
|
||||
*/
|
||||
fadeIn: function( $el ) {
|
||||
|
||||
if ( ! $el.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$el.css( {
|
||||
display: '',
|
||||
transition: `opacity ${ui.config.speed}ms ease-in 0s`,
|
||||
} );
|
||||
|
||||
setTimeout( function() {
|
||||
$el.css( 'opacity', '1' );
|
||||
}, 0 );
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide the element by fading them to transparent using CSS.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {jQuery} $el Element object.
|
||||
*/
|
||||
fadeOut: function( $el ) {
|
||||
|
||||
if ( ! $el.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$el.css( {
|
||||
opacity: '0',
|
||||
transition: `opacity ${ui.config.speed}ms ease-in 0s`,
|
||||
} );
|
||||
|
||||
setTimeout( function() {
|
||||
$el.css( 'display', 'none' );
|
||||
}, ui.config.speed );
|
||||
},
|
||||
|
||||
/**
|
||||
* Collapse all categories.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
collapseAllCategories: function() {
|
||||
|
||||
el.$categories.find( '.wpforms-builder-help-category' ).removeClass( 'opened' );
|
||||
el.$categories.find( '.wpforms-builder-help-docs' ).slideUp();
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Event handlers.
|
||||
*/
|
||||
event = {
|
||||
|
||||
/**
|
||||
* Open help modal.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
openHelp: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
var $firstCategory = el.$categories.find( '.wpforms-builder-help-category' ).first(),
|
||||
builderContextTerm = app.getBuilderContextTerm();
|
||||
|
||||
if ( builderContextTerm === '' && ! $firstCategory.hasClass( 'opened' ) ) {
|
||||
$firstCategory.find( 'header' ).first().trigger( 'click' );
|
||||
} else {
|
||||
ui.collapseAllCategories();
|
||||
}
|
||||
|
||||
el.$search.find( 'input' ).val( builderContextTerm ).trigger( 'keyup' );
|
||||
|
||||
ui.fadeIn( el.$help );
|
||||
|
||||
setTimeout( function() {
|
||||
|
||||
ui.fadeIn( el.$result );
|
||||
ui.fadeIn( el.$categories );
|
||||
ui.fadeIn( el.$footer );
|
||||
|
||||
}, ui.config.speed );
|
||||
},
|
||||
|
||||
/**
|
||||
* Close help modal.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
closeHelp: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
ui.fadeOut( el.$result );
|
||||
ui.fadeOut( el.$categories );
|
||||
ui.fadeOut( el.$footer );
|
||||
|
||||
ui.fadeOut( el.$help );
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle category.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
toggleCategory: function( e ) {
|
||||
|
||||
var $category = $( this ).parent(),
|
||||
$categoryDocs = $category.find( '.wpforms-builder-help-docs' );
|
||||
|
||||
if ( ! $categoryDocs.is( ':visible' ) ) {
|
||||
$category.addClass( 'opened' );
|
||||
} else {
|
||||
$category.removeClass( 'opened' );
|
||||
}
|
||||
|
||||
$categoryDocs.stop().slideToggle( ui.config.speed );
|
||||
},
|
||||
|
||||
/**
|
||||
* View All Category Docs button click.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
viewAllCategoryDocs: function( e ) {
|
||||
|
||||
var $btn = $( this );
|
||||
|
||||
$btn.prev( 'div' ).stop().slideToggle( ui.config.speed, function() {
|
||||
$btn.closest( '.wpforms-builder-help-category' ).addClass( 'viewall' );
|
||||
} );
|
||||
ui.fadeOut( $btn );
|
||||
$btn.slideUp();
|
||||
},
|
||||
|
||||
/**
|
||||
* Input into search field.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
inputSearch: function( e ) {
|
||||
|
||||
var $input = $( this ),
|
||||
term = $input.val();
|
||||
|
||||
var tmpl = wp.template( 'wpforms-builder-help-docs' ),
|
||||
recommendedDocs = app.getRecommendedDocs( term ),
|
||||
filteredDocs = event.removeDuplicates( recommendedDocs, app.getFilteredDocs( term ) ),
|
||||
resultHTML = '';
|
||||
|
||||
el.$search.toggleClass( 'wpforms-empty', ! term );
|
||||
|
||||
if ( ! wpf.empty( recommendedDocs ) ) {
|
||||
resultHTML += tmpl( {
|
||||
docs: recommendedDocs,
|
||||
} );
|
||||
}
|
||||
|
||||
if ( ! wpf.empty( filteredDocs ) ) {
|
||||
resultHTML += tmpl( {
|
||||
docs: filteredDocs,
|
||||
} );
|
||||
}
|
||||
|
||||
el.$noResult.toggle( resultHTML === '' && term !== '' );
|
||||
|
||||
el.$result.html( resultHTML );
|
||||
|
||||
el.$help[0].scrollTop = 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove duplicated items in the filtered docs.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {Array} recommendedDocs Recommended docs.
|
||||
* @param {Array} filteredDocs Filtered docs.
|
||||
*
|
||||
* @returns {Array} Filtered docs without duplicated items in the recommended docs.
|
||||
*/
|
||||
removeDuplicates: function( recommendedDocs, filteredDocs ) {
|
||||
|
||||
if ( wpf.empty( recommendedDocs ) || wpf.empty( filteredDocs ) ) {
|
||||
return filteredDocs;
|
||||
}
|
||||
|
||||
var docs = [];
|
||||
|
||||
for ( var i = 0; i < recommendedDocs.length, i++; ) {
|
||||
for ( var k = 0; k < filteredDocs.length, k++; ) {
|
||||
if ( filteredDocs[ k ].url !== recommendedDocs[ i ].url ) {
|
||||
docs.push( filteredDocs[ k ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return docs;
|
||||
},
|
||||
|
||||
/**
|
||||
* Clear search field.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
clearSearch: function( e ) {
|
||||
|
||||
el.$search.find( 'input' ).val( '' ).trigger( 'keyup' );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.Help.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/help.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/help.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.Help=WPForms.Admin.Builder.Help||function(l){var n,p={init:function(){l(p.ready)},ready:function(){p.setup(),p.initCategories(),p.events()},setup:function(){n={$builder:l("#wpforms-builder"),$builderForm:l("#wpforms-builder-form"),$helpBtn:l("#wpforms-help"),$help:l("#wpforms-builder-help"),$closeBtn:l("#wpforms-builder-help-close"),$search:l("#wpforms-builder-help-search"),$result:l("#wpforms-builder-help-result"),$noResult:l("#wpforms-builder-help-no-result"),$categories:l("#wpforms-builder-help-categories"),$footer:l("#wpforms-builder-help-footer")}},events:function(){n.$helpBtn.on("click",a.openHelp),n.$closeBtn.on("click",a.closeHelp),n.$categories.on("click",".wpforms-builder-help-category header",a.toggleCategory),n.$categories.on("click",".wpforms-builder-help-category button.viewall",a.viewAllCategoryDocs),n.$search.on("keyup","input",_.debounce(a.inputSearch,250)),n.$search.on("click","#wpforms-builder-help-search-clear",a.clearSearch)},initCategories:function(){var e,r;wpf.empty(wpforms_builder_help.docs)?n.$categories.html(wp.template("wpforms-builder-help-categories-error")):(e=wp.template("wpforms-builder-help-categories"),r={categories:wpforms_builder_help.categories,docs:p.getDocsByCategories()},n.$categories.html(e(r)))},getDocsByCategories:function(){var e=wpforms_builder_help.categories,o=wpforms_builder_help.docs||[],i={};return _.each(e,function(e,r){var t=[];_.each(o,function(e){e.categories&&-1<e.categories.indexOf(r)&&t.push(e)}),i[r]=t}),i},getRecommendedDocs:function(e){if(wpf.empty(e))return[];e=e.toLowerCase();var r=wpforms_builder_help.docs,t=[];return wpf.empty(wpforms_builder_help.context.docs[e])?[]:(_.each(wpforms_builder_help.context.docs[e],function(e){wpf.empty(r[e])||t.push(r[e])}),t)},getFilteredDocs:function(r){var e,t;return wpf.empty(r)?[]:(e=wpforms_builder_help.docs,t=[],r=r.toLowerCase(),_.each(e,function(e){e.title&&-1<e.title.toLowerCase().indexOf(r)&&t.push(e)}),t)},getBuilderContext:function(){if(wpf.empty(n.$builderForm.data("id")))return"new_form";var e=n.$builder.find("#wpforms-panels-toggle button.active").data("panel"),r=n.$builder.find("#wpforms-panel-"+e),t="",o="";switch(e){case"fields":t=r.find(".wpforms-panel-sidebar .wpforms-tab a.active").parent().attr("id");break;case"setup":t="";break;default:t=r.find(".wpforms-panel-sidebar a.active").data("section")}return[e,t=wpf.empty(t)?"":t.replace(/-/g,"_"),o="field_options"===t?r.find("#wpforms-field-options .wpforms-field-option:visible .wpforms-field-option-hidden-type").val():o].filter(function(e){return!wpf.empty(e)&&"default"!==e}).join("/")},getBuilderContextTerm:function(){return wpforms_builder_help.context.terms[p.getBuilderContext()]||""}},o={config:{speed:300},fadeIn:function(e){e.length&&(e.css({display:"",transition:`opacity ${o.config.speed}ms ease-in 0s`}),setTimeout(function(){e.css("opacity","1")},0))},fadeOut:function(e){e.length&&(e.css({opacity:"0",transition:`opacity ${o.config.speed}ms ease-in 0s`}),setTimeout(function(){e.css("display","none")},o.config.speed))},collapseAllCategories:function(){n.$categories.find(".wpforms-builder-help-category").removeClass("opened"),n.$categories.find(".wpforms-builder-help-docs").slideUp()}},a={openHelp:function(e){e.preventDefault();var e=n.$categories.find(".wpforms-builder-help-category").first(),r=p.getBuilderContextTerm();""!==r||e.hasClass("opened")?o.collapseAllCategories():e.find("header").first().trigger("click"),n.$search.find("input").val(r).trigger("keyup"),o.fadeIn(n.$help),setTimeout(function(){o.fadeIn(n.$result),o.fadeIn(n.$categories),o.fadeIn(n.$footer)},o.config.speed)},closeHelp:function(e){e.preventDefault(),o.fadeOut(n.$result),o.fadeOut(n.$categories),o.fadeOut(n.$footer),o.fadeOut(n.$help)},toggleCategory:function(e){var r=l(this).parent(),t=r.find(".wpforms-builder-help-docs");t.is(":visible")?r.removeClass("opened"):r.addClass("opened"),t.stop().slideToggle(o.config.speed)},viewAllCategoryDocs:function(e){var r=l(this);r.prev("div").stop().slideToggle(o.config.speed,function(){r.closest(".wpforms-builder-help-category").addClass("viewall")}),o.fadeOut(r),r.slideUp()},inputSearch:function(e){var r=l(this).val(),t=wp.template("wpforms-builder-help-docs"),o=p.getRecommendedDocs(r),i=a.removeDuplicates(o,p.getFilteredDocs(r)),s="";n.$search.toggleClass("wpforms-empty",!r),wpf.empty(o)||(s+=t({docs:o})),wpf.empty(i)||(s+=t({docs:i})),n.$noResult.toggle(""===s&&""!==r),n.$result.html(s),n.$help[0].scrollTop=0},removeDuplicates:function(e,r){if(wpf.empty(e)||wpf.empty(r))return r;for(var t=[],o=0;e.length,o++;)for(var i=0;r.length,i++;)r[i].url!==e[o].url&&t.push(r[i]);return t},clearSearch:function(e){n.$search.find("input").val("").trigger("keyup")}};return p}((document,window,jQuery)),WPForms.Admin.Builder.Help.init();
|
@@ -0,0 +1,988 @@
|
||||
/* global wpforms_builder, wpforms_builder_providers, wpf */
|
||||
|
||||
var WPForms = window.WPForms || {};
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
/**
|
||||
* WPForms Providers module.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*/
|
||||
WPForms.Admin.Builder.Providers = WPForms.Admin.Builder.Providers || ( function( document, window, $ ) {
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Private functions and properties.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var __private = {
|
||||
|
||||
/**
|
||||
* Internal cache storage, do not use it directly, but app.cache.{(get|set|delete|clear)()} instead.
|
||||
* Key is the provider slug, value is a Map, that will have its own key as a connection id (or not).
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @type {Object.<string, Map>}
|
||||
*/
|
||||
cache: {},
|
||||
|
||||
/**
|
||||
* Config contains all configuration properties.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @type {Object.<string, *>}
|
||||
*/
|
||||
config: {
|
||||
|
||||
/**
|
||||
* List of default templates that should be compiled.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @type {string[]}
|
||||
*/
|
||||
templates: [
|
||||
'wpforms-providers-builder-content-connection-fields',
|
||||
'wpforms-providers-builder-content-connection-conditionals',
|
||||
],
|
||||
},
|
||||
|
||||
/**
|
||||
* Form fields for the current state.
|
||||
*
|
||||
* @since 1.6.1.2
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
fields: {},
|
||||
};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Panel holder.
|
||||
*
|
||||
* @since 1.5.9
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
panelHolder: {},
|
||||
|
||||
/**
|
||||
* Form holder.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
form: $( '#wpforms-builder-form' ),
|
||||
|
||||
/**
|
||||
* Spinner HTML.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
spinner: '<i class="wpforms-loading-spinner wpforms-loading-inline"></i>',
|
||||
|
||||
/**
|
||||
* All ajax requests are grouped together with own properties.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*/
|
||||
ajax: {
|
||||
|
||||
/**
|
||||
* Merge custom AJAX data object with defaults.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {object} custom Ajax data object with custom settings.
|
||||
*
|
||||
* @returns {object} Ajax data.
|
||||
*/
|
||||
_mergeData: function( provider, custom ) {
|
||||
|
||||
var data = {
|
||||
id: app.form.data( 'id' ),
|
||||
// eslint-disable-next-line camelcase
|
||||
revision_id: app.form.data( 'revision' ),
|
||||
nonce: wpforms_builder.nonce,
|
||||
action: 'wpforms_builder_provider_ajax_' + provider,
|
||||
};
|
||||
|
||||
$.extend( data, custom );
|
||||
|
||||
return data;
|
||||
},
|
||||
|
||||
/**
|
||||
* Make an AJAX request. It's basically a wrapper around jQuery.ajax, but with some defaults.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {*} custom Object of user-defined $.ajax()-compatible parameters.
|
||||
*
|
||||
* @return {Promise}
|
||||
*/
|
||||
request: function( provider, custom ) {
|
||||
|
||||
var $holder = app.getProviderHolder( provider ),
|
||||
$lock = $holder.find( '.wpforms-builder-provider-connections-save-lock' ),
|
||||
$error = $holder.find( '.wpforms-builder-provider-connections-error' );
|
||||
|
||||
var params = {
|
||||
url: wpforms_builder.ajax_url,
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
beforeSend: function() {
|
||||
|
||||
$holder.addClass( 'loading' );
|
||||
$lock.val( 1 );
|
||||
$error.hide();
|
||||
},
|
||||
};
|
||||
|
||||
custom.data = app.ajax._mergeData( provider, custom.data || {} );
|
||||
$.extend( params, custom );
|
||||
|
||||
return $.ajax( params )
|
||||
.fail( function( jqXHR, textStatus, errorThrown ) {
|
||||
|
||||
/*
|
||||
* Right now we are logging into browser console.
|
||||
* In future that might be something better.
|
||||
*/
|
||||
console.error( 'provider:', provider );
|
||||
console.error( jqXHR );
|
||||
console.error( textStatus );
|
||||
|
||||
$lock.val( 1 );
|
||||
$error.show();
|
||||
} )
|
||||
.always( function( dataOrjqXHR, textStatus, jqXHROrerrorThrown ) {
|
||||
|
||||
$holder.removeClass( 'loading' );
|
||||
|
||||
if ( 'success' === textStatus ) {
|
||||
$lock.val( 0 );
|
||||
}
|
||||
} );
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Temporary in-memory cache handling for all providers.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*/
|
||||
cache: {
|
||||
|
||||
/**
|
||||
* Get the value from cache by key.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {string} key Cache key.
|
||||
*
|
||||
* @returns {*} Null if some error occurs.
|
||||
*/
|
||||
get: function( provider, key ) {
|
||||
|
||||
if (
|
||||
typeof __private.cache[ provider ] === 'undefined' ||
|
||||
! ( __private.cache[ provider ] instanceof Map )
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return __private.cache[ provider ].get( key );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the value from cache by key and an ID.
|
||||
* Useful when Object is stored under key, and we need specific value.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {string} key Cache key.
|
||||
* @param {string} id Cached object ID.
|
||||
*
|
||||
* @returns {*} Null if some error occurs.
|
||||
*/
|
||||
getById: function( provider, key, id ) {
|
||||
|
||||
if ( typeof this.get( provider, key )[ id ] === 'undefined' ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return this.get( provider, key )[ id ];
|
||||
},
|
||||
|
||||
/**
|
||||
* Save the data to cache.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {string} key Intended to be a string, but can be everything that Map supports as a key.
|
||||
* @param {*} value Data you want to save in cache.
|
||||
*
|
||||
* @returns {Map} All the cache for the provider. IE11 returns 'undefined' for an undefined reason.
|
||||
*/
|
||||
set: function( provider, key, value ) {
|
||||
|
||||
if (
|
||||
typeof __private.cache[ provider ] === 'undefined' ||
|
||||
! ( __private.cache[ provider ] instanceof Map )
|
||||
) {
|
||||
__private.cache[ provider ] = new Map();
|
||||
}
|
||||
|
||||
return __private.cache[ provider ].set( key, value );
|
||||
},
|
||||
|
||||
/**
|
||||
* Add the data to cache to a particular key.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @example app.cache.as('provider').addTo('connections', connection_id, connection);
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {string} key Intended to be a string, but can be everything that Map supports as a key.
|
||||
* @param {string} id ID for a value that should be added to a certain key.
|
||||
* @param {*} value Data you want to save in cache.
|
||||
*
|
||||
* @returns {Map} All the cache for the provider. IE11 returns 'undefined' for an undefined reason.
|
||||
*/
|
||||
addTo: function( provider, key, id, value ) {
|
||||
|
||||
if (
|
||||
typeof __private.cache[ provider ] === 'undefined' ||
|
||||
! ( __private.cache[ provider ] instanceof Map )
|
||||
) {
|
||||
__private.cache[ provider ] = new Map();
|
||||
this.set( provider, key, {} );
|
||||
}
|
||||
|
||||
var data = this.get( provider, key );
|
||||
data[ id ] = value;
|
||||
|
||||
return this.set(
|
||||
provider,
|
||||
key,
|
||||
data
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Delete the cache by key.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {string} key Cache key.
|
||||
*
|
||||
* @returns boolean|null True on success, null on data holder failure, false on error.
|
||||
*/
|
||||
delete: function( provider, key ) {
|
||||
|
||||
if (
|
||||
typeof __private.cache[ provider ] === 'undefined' ||
|
||||
! ( __private.cache[ provider ] instanceof Map )
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return __private.cache[ provider ].delete( key );
|
||||
},
|
||||
|
||||
/**
|
||||
* Delete particular data from a certain key.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @example app.cache.as('provider').deleteFrom('connections', connection_id);
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {string} key Intended to be a string, but can be everything that Map supports as a key.
|
||||
* @param {string} id ID for a value that should be deleted from a certain key.
|
||||
*
|
||||
* @returns {Map} All the cache for the provider. IE11 returns 'undefined' for an undefined reason.
|
||||
*/
|
||||
deleteFrom: function( provider, key, id ) {
|
||||
|
||||
if (
|
||||
typeof __private.cache[ provider ] === 'undefined' ||
|
||||
! ( __private.cache[ provider ] instanceof Map )
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var data = this.get( provider, key );
|
||||
|
||||
delete data[ id ];
|
||||
|
||||
return this.set(
|
||||
provider,
|
||||
key,
|
||||
data
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Clear all the cache data.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
*/
|
||||
clear: function( provider ) {
|
||||
|
||||
if (
|
||||
typeof __private.cache[ provider ] === 'undefined' ||
|
||||
! ( __private.cache[ provider ] instanceof Map )
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
__private.cache[ provider ].clear();
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Start the engine. DOM is not ready yet, use only to init something.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
// Do that when DOM is ready.
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* DOM is fully loaded.
|
||||
* Should be hooked into in addons, that need to work with DOM, templates etc.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.6.1.2 Added initialization for `__private.fields` property.
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
// Save a current form fields state.
|
||||
__private.fields = $.extend( {}, wpf.getFields( false, true ) );
|
||||
|
||||
app.panelHolder = $( '#wpforms-panel-providers, #wpforms-panel-settings' );
|
||||
|
||||
app.Templates = WPForms.Admin.Builder.Templates;
|
||||
app.Templates.add( __private.config.templates );
|
||||
|
||||
app.bindActions();
|
||||
app.ui.bindActions();
|
||||
|
||||
app.panelHolder.trigger( 'WPForms.Admin.Builder.Providers.ready' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Process all generic actions/events, mostly custom that were fired by our API.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.6.1.2 Added a calling `app.updateMapSelects()` method.
|
||||
*/
|
||||
bindActions: function() {
|
||||
|
||||
// On Form save - notify user about required fields.
|
||||
$( document ).on( 'wpformsSaved', function() {
|
||||
|
||||
var $connectionBlocks = app.panelHolder.find( '.wpforms-builder-provider-connection' );
|
||||
|
||||
if ( ! $connectionBlocks.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We need to show him "Required fields empty" popup only once.
|
||||
var isShownOnce = false;
|
||||
|
||||
$connectionBlocks.each( function() {
|
||||
|
||||
var isRequiredEmpty = false;
|
||||
|
||||
// Do the actual required fields check.
|
||||
$( this ).find( 'input.wpforms-required, select.wpforms-required, textarea.wpforms-required' ).each( function() {
|
||||
|
||||
const $this = $( this ),
|
||||
value = $this.val();
|
||||
|
||||
if ( _.isEmpty( value ) && ! $this.closest( '.wpforms-builder-provider-connection-block' ).hasClass( 'wpforms-hidden' ) ) {
|
||||
$( this ).addClass( 'wpforms-error' );
|
||||
isRequiredEmpty = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$( this ).removeClass( 'wpforms-error' );
|
||||
} );
|
||||
|
||||
// Notify user.
|
||||
if ( isRequiredEmpty && ! isShownOnce ) {
|
||||
var $titleArea = $( this ).closest( '.wpforms-builder-provider' ).find( '.wpforms-builder-provider-title' ).clone();
|
||||
$titleArea.find( 'button' ).remove();
|
||||
var msg = wpforms_builder.provider_required_flds;
|
||||
|
||||
$.alert( {
|
||||
title: wpforms_builder.heads_up,
|
||||
content: msg.replace( '{provider}', '<strong>' + $titleArea.text().trim() + '</strong>' ),
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
|
||||
// Save that we have already showed the user, so we won't bug it anymore.
|
||||
isShownOnce = true;
|
||||
}
|
||||
} );
|
||||
|
||||
// On "Fields" page additional update provider's field mapped items.
|
||||
if ( 'fields' === wpf.getQueryString( 'view' ) ) {
|
||||
app.updateMapSelects( $connectionBlocks );
|
||||
}
|
||||
} );
|
||||
|
||||
/*
|
||||
* Update form state when each connection is loaded into the DOM.
|
||||
* This will prevent a please-save-prompt to appear, when navigating
|
||||
* out and back to Marketing tab without doing any changes anywhere.
|
||||
*/
|
||||
app.panelHolder.on( 'connectionRendered', function() {
|
||||
|
||||
if ( wpf.initialSave === true ) {
|
||||
wpf.savedState = wpf.getFormState( '#wpforms-builder-form' );
|
||||
}
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Update selects for mapping if any form fields was added, deleted or changed.
|
||||
*
|
||||
* @since 1.6.1.2
|
||||
*
|
||||
* @param {object} $connections jQuery selector for active connections.
|
||||
*/
|
||||
updateMapSelects: function( $connections ) {
|
||||
|
||||
var fields = $.extend( {}, wpf.getFields() ),
|
||||
currentSaveFields,
|
||||
prevSaveFields;
|
||||
|
||||
// We should to detect changes for labels only.
|
||||
currentSaveFields = _.mapObject( fields, function( field, key ) {
|
||||
|
||||
return field.label;
|
||||
} );
|
||||
prevSaveFields = _.mapObject( __private.fields, function( field, key ) {
|
||||
|
||||
return field.label;
|
||||
} );
|
||||
|
||||
// Check if form has any fields and if they have changed labels after previous saving process.
|
||||
if (
|
||||
( _.isEmpty( currentSaveFields ) && _.isEmpty( prevSaveFields ) ) ||
|
||||
( JSON.stringify( currentSaveFields ) === JSON.stringify( prevSaveFields ) )
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepare a current form field IDs.
|
||||
var fieldIds = Object.keys( currentSaveFields )
|
||||
.map( function( id ) {
|
||||
|
||||
return parseInt( id, 10 );
|
||||
} );
|
||||
|
||||
// Determine deleted field IDs - it's a diff between previous and current form state.
|
||||
var deleted = Object.keys( prevSaveFields )
|
||||
.map( function( id ) {
|
||||
|
||||
return parseInt( id, 10 );
|
||||
} )
|
||||
.filter( function( id ) {
|
||||
|
||||
return ! fieldIds.includes( id );
|
||||
} );
|
||||
|
||||
// Remove from mapping selects "deleted" fields.
|
||||
for ( var index = 0; index < deleted.length; index++ ) {
|
||||
$( '.wpforms-builder-provider-connection-fields-table .wpforms-builder-provider-connection-field-value option[value="' + deleted[ index ] + '"]', $connections ).remove();
|
||||
}
|
||||
|
||||
var label, $exists;
|
||||
for ( var id in fields ) {
|
||||
|
||||
// Prepare the label.
|
||||
if ( typeof fields[ id ].label !== 'undefined' && fields[ id ].label.toString().trim() !== '' ) {
|
||||
label = wpf.sanitizeHTML( fields[ id ].label.toString().trim() );
|
||||
} else {
|
||||
label = wpforms_builder.field + ' #' + id;
|
||||
}
|
||||
|
||||
// Try to find all select options by value.
|
||||
$exists = $( '.wpforms-builder-provider-connection-fields-table .wpforms-builder-provider-connection-field-value option[value="' + id + '"]', $connections );
|
||||
|
||||
// If no option was found - add a new one for all selects.
|
||||
if ( ! $exists.length ) {
|
||||
$( '.wpforms-builder-provider-connection-fields-table .wpforms-builder-provider-connection-field-value', $connections ).append( $( '<option>', { value: id, text: label } ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
// Update a field label if a previous and current labels not equal.
|
||||
if ( wpf.sanitizeHTML( fields[ id ].label ) !== wpf.sanitizeHTML( prevSaveFields[ id ] ) ) {
|
||||
$exists.text( label );
|
||||
}
|
||||
}
|
||||
|
||||
// If selects for mapping was changed, that whole form state was changed as well.
|
||||
// That's why we need to re-save it.
|
||||
if ( wpf.savedState !== wpf.getFormState( '#wpforms-builder-form' ) ) {
|
||||
wpf.savedState = wpf.getFormState( '#wpforms-builder-form' );
|
||||
}
|
||||
|
||||
// Save form fields state for next saving process.
|
||||
__private.fields = fields;
|
||||
|
||||
app.panelHolder.trigger( 'WPForms.Admin.Builder.Providers.updatedMapSelects', [ $connections, fields ] );
|
||||
},
|
||||
|
||||
/**
|
||||
* All methods that modify UI of a page.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*/
|
||||
ui: {
|
||||
|
||||
/**
|
||||
* Process UI related actions/events: click, change etc. - that are triggered from UI.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*/
|
||||
bindActions: function() {
|
||||
|
||||
// CONNECTION: ADD/DELETE.
|
||||
app.panelHolder
|
||||
.on( 'click', '.js-wpforms-builder-provider-account-add', function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
app.ui.account.setProvider( $( this ).data( 'provider' ) );
|
||||
app.ui.account.add();
|
||||
} )
|
||||
.on( 'click', '.js-wpforms-builder-provider-connection-add', function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
app.ui.connectionAdd( $( this ).data( 'provider' ) );
|
||||
} )
|
||||
.on( 'click', '.js-wpforms-builder-provider-connection-delete', function( e ) {
|
||||
|
||||
var $btn = $( this );
|
||||
|
||||
e.preventDefault();
|
||||
app.ui.connectionDelete(
|
||||
$btn.closest( '.wpforms-builder-provider' ).data( 'provider' ),
|
||||
$btn.closest( '.wpforms-builder-provider-connection' )
|
||||
);
|
||||
} );
|
||||
|
||||
// CONNECTION: FIELDS - ADD/DELETE.
|
||||
app.panelHolder
|
||||
.on( 'click', '.js-wpforms-builder-provider-connection-fields-add', function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
var $table = $( this ).parents( '.wpforms-builder-provider-connection-fields-table' ),
|
||||
$clone = $table.find( 'tr' ).last().clone( true ),
|
||||
nextID = parseInt( /\[.+]\[.+]\[.+]\[(\d+)]/.exec( $clone.find( '.wpforms-builder-provider-connection-field-name' ).attr( 'name' ) )[ 1 ], 10 ) + 1;
|
||||
|
||||
// Clear the row and increment the counter.
|
||||
$clone.find( '.wpforms-builder-provider-connection-field-name' )
|
||||
.attr( 'name', $clone.find( '.wpforms-builder-provider-connection-field-name' ).attr( 'name' ).replace( /\[fields_meta\]\[(\d+)\]/g, '[fields_meta][' + nextID + ']' ) )
|
||||
.val( '' );
|
||||
$clone.find( '.wpforms-builder-provider-connection-field-value' )
|
||||
.attr( 'name', $clone.find( '.wpforms-builder-provider-connection-field-value' ).attr( 'name' ).replace( /\[fields_meta\]\[(\d+)\]/g, '[fields_meta][' + nextID + ']' ) )
|
||||
.val( '' );
|
||||
|
||||
// Re-enable "delete" button.
|
||||
$clone.find( '.js-wpforms-builder-provider-connection-fields-delete' ).removeClass( 'hidden' );
|
||||
|
||||
// Put it back to the table.
|
||||
$table.find( 'tbody' ).append( $clone.get( 0 ) );
|
||||
} )
|
||||
.on( 'click', '.js-wpforms-builder-provider-connection-fields-delete', function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
var $row = $( this ).parents( '.wpforms-builder-provider-connection-fields-table tr' );
|
||||
|
||||
$row.remove();
|
||||
} );
|
||||
|
||||
// CONNECTION: Generated.
|
||||
app.panelHolder.on( 'connectionGenerated', function( e, data ) {
|
||||
|
||||
wpf.initTooltips();
|
||||
|
||||
// Hide provider default settings screen.
|
||||
$( this )
|
||||
.find( '.wpforms-builder-provider-connection[data-connection_id="' + data.connection.id + '"]' )
|
||||
.closest( '.wpforms-panel-content-section' )
|
||||
.find( '.wpforms-builder-provider-connections-default' )
|
||||
.addClass( 'wpforms-hidden' );
|
||||
} );
|
||||
|
||||
// CONNECTION: Rendered.
|
||||
app.panelHolder.on( 'connectionRendered', function( e, provider, connectionId ) {
|
||||
|
||||
wpf.initTooltips();
|
||||
|
||||
// Some our addons have another arguments for this trigger.
|
||||
// We will fix it asap.
|
||||
if ( typeof connectionId === 'undefined' ) {
|
||||
if ( ! _.isObject( provider ) || ! _.has( provider, 'connection_id' ) ) {
|
||||
return;
|
||||
}
|
||||
connectionId = provider.connection_id;
|
||||
}
|
||||
|
||||
// If connection has mapped select fields - call `wpformsFieldUpdate` trigger.
|
||||
if ( $( this ).find( '.wpforms-builder-provider-connection[data-connection_id="' + connectionId + '"] .wpforms-field-map-select' ).length ) {
|
||||
wpf.fieldUpdate();
|
||||
}
|
||||
} );
|
||||
|
||||
// Remove error class in required fields if a value is supplied.
|
||||
app.panelHolder.on( 'change', '.wpforms-builder-provider select.wpforms-required', function() {
|
||||
|
||||
const $this = $( this );
|
||||
|
||||
if ( ! $this.hasClass( 'wpforms-error' ) || $this.val().length === 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this.removeClass( 'wpforms-error' );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Add a connection to a page.
|
||||
* This is a multistep process, where the 1st step is always the same for all providers.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
*/
|
||||
connectionAdd: function( provider ) {
|
||||
|
||||
$.confirm( {
|
||||
title: false,
|
||||
content: wpforms_builder_providers.prompt_connection.replace( /%type%/g, 'connection' ) +
|
||||
'<input autofocus="" type="text" id="wpforms-builder-provider-connection-name" placeholder="' + wpforms_builder_providers.prompt_placeholder + '">' +
|
||||
'<p class="error">' + wpforms_builder_providers.error_name + '</p>',
|
||||
icon: 'fa fa-info-circle',
|
||||
type: 'blue',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
var name = this.$content.find( '#wpforms-builder-provider-connection-name' ).val().trim(),
|
||||
error = this.$content.find( '.error' );
|
||||
|
||||
if ( name === '' ) {
|
||||
error.show();
|
||||
return false;
|
||||
|
||||
} else {
|
||||
app.getProviderHolder( provider ).trigger( 'connectionCreate', [ name ] );
|
||||
}
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_builder.cancel,
|
||||
},
|
||||
},
|
||||
} );
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* What to do with UI when connection is deleted.
|
||||
*
|
||||
* @since 1.4.7
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
* @param {object} $connection jQuery DOM element for a connection.
|
||||
*/
|
||||
connectionDelete: function( provider, $connection ) {
|
||||
|
||||
$.confirm( {
|
||||
title: false,
|
||||
content: wpforms_builder_providers.confirm_connection,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
// We need this BEFORE removing, as some handlers might need DOM element.
|
||||
app.getProviderHolder( provider ).trigger( 'connectionDelete', [ $connection ] );
|
||||
|
||||
var $section = $connection.closest( '.wpforms-panel-content-section' );
|
||||
|
||||
$connection.fadeOut( 'fast', function() {
|
||||
|
||||
$( this ).remove();
|
||||
|
||||
app.getProviderHolder( provider ).trigger( 'connectionDeleted', [ $connection ] );
|
||||
|
||||
if ( ! $section.find( '.wpforms-builder-provider-connection' ).length ) {
|
||||
$section.find( '.wpforms-builder-provider-connections-default' ).removeClass( 'wpforms-hidden' );
|
||||
}
|
||||
} );
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_builder.cancel,
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Account specific methods.
|
||||
*
|
||||
* @since 1.4.8
|
||||
* @since 1.5.8 Added binding `onClose` event.
|
||||
*/
|
||||
account: {
|
||||
|
||||
/**
|
||||
* Current provider in the context of account creation.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @param {string}
|
||||
*/
|
||||
provider: '',
|
||||
|
||||
/**
|
||||
* Preserve a list of action to perform when new account creation form is submitted.
|
||||
* Provider specific.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @param {Array<string, callable>}
|
||||
*/
|
||||
submitHandlers: [],
|
||||
|
||||
/**
|
||||
* Set the account specific provider.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @param {string} provider Provider slug.
|
||||
*/
|
||||
setProvider: function( provider ) {
|
||||
this.provider = provider;
|
||||
},
|
||||
|
||||
/**
|
||||
* Add an account for provider.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*/
|
||||
add: function() {
|
||||
|
||||
var account = this;
|
||||
|
||||
$.confirm( {
|
||||
title: false,
|
||||
smoothContent: true,
|
||||
content: function() {
|
||||
|
||||
var modal = this;
|
||||
|
||||
return app.ajax
|
||||
.request( account.provider, {
|
||||
data: {
|
||||
task: 'account_template_get',
|
||||
},
|
||||
} )
|
||||
.done( function( response ) {
|
||||
|
||||
if ( ! response.success ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( response.data.title.length ) {
|
||||
modal.setTitle( response.data.title );
|
||||
}
|
||||
|
||||
if ( response.data.content.length ) {
|
||||
modal.setContent( response.data.content );
|
||||
}
|
||||
|
||||
if ( response.data.type.length ) {
|
||||
modal.setType( response.data.type );
|
||||
}
|
||||
|
||||
app.getProviderHolder( account.provider ).trigger( 'accountAddModal.content.done', [ modal, account.provider, response ] );
|
||||
} )
|
||||
.fail( function() {
|
||||
app.getProviderHolder( account.provider ).trigger( 'accountAddModal.content.fail', [ modal, account.provider ] );
|
||||
} )
|
||||
.always( function() {
|
||||
app.getProviderHolder( account.provider ).trigger( 'accountAddModal.content.always', [ modal, account.provider ] );
|
||||
} );
|
||||
},
|
||||
contentLoaded: function( data, status, xhr ) {
|
||||
|
||||
var modal = this;
|
||||
|
||||
// Data is already set in content.
|
||||
this.buttons.add.enable();
|
||||
this.buttons.cancel.enable();
|
||||
|
||||
app.getProviderHolder( account.provider ).trigger( 'accountAddModal.contentLoaded', [ modal ] );
|
||||
},
|
||||
onOpenBefore: function() { // Before the modal is displayed.
|
||||
|
||||
var modal = this;
|
||||
|
||||
modal.buttons.add.disable();
|
||||
modal.buttons.cancel.disable();
|
||||
modal.$body.addClass( 'wpforms-providers-account-add-modal' );
|
||||
|
||||
app.getProviderHolder( account.provider ).trigger( 'accountAddModal.onOpenBefore', [ modal ] );
|
||||
},
|
||||
onClose: function() { // Before the modal is hidden.
|
||||
|
||||
// If an account was configured successfully - show a modal with adding a new connection.
|
||||
if ( true === app.ui.account.isConfigured( account.provider ) ) {
|
||||
app.ui.connectionAdd( account.provider );
|
||||
}
|
||||
},
|
||||
icon: 'fa fa-info-circle',
|
||||
type: 'blue',
|
||||
buttons: {
|
||||
add: {
|
||||
text: wpforms_builder.provider_add_new_acc_btn,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
var modal = this;
|
||||
|
||||
app.getProviderHolder( account.provider ).trigger( 'accountAddModal.buttons.add.action.before', [ modal ] );
|
||||
|
||||
if (
|
||||
! _.isEmpty( account.provider ) &&
|
||||
typeof account.submitHandlers[ account.provider ] !== 'undefined'
|
||||
) {
|
||||
return account.submitHandlers[ account.provider ]( modal );
|
||||
}
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_builder.cancel,
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Register a template for Add New Account modal window.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*/
|
||||
registerAddHandler: function( provider, handler ) {
|
||||
|
||||
if ( typeof provider === 'string' && typeof handler === 'function' ) {
|
||||
this.submitHandlers[ provider ] = handler;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Check whether the defined provider is configured or not.
|
||||
*
|
||||
* @since 1.5.8
|
||||
* @since 1.5.9 Added a new parameter - provider.
|
||||
*
|
||||
* @param {string} provider Current provider slug.
|
||||
*
|
||||
* @returns {boolean} Account status.
|
||||
*/
|
||||
isConfigured: function( provider ) {
|
||||
|
||||
// Check if `Add New Account` button is hidden.
|
||||
return app.getProviderHolder( provider ).find( '.js-wpforms-builder-provider-account-add' ).hasClass( 'hidden' );
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Get a jQuery DOM object, that has all the provider-related DOM inside.
|
||||
*
|
||||
* @since 1.4.7
|
||||
*
|
||||
* @returns {object} jQuery DOM element.
|
||||
*/
|
||||
getProviderHolder: function( provider ) {
|
||||
return $( '#' + provider + '-provider' );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.Providers.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/providers.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/providers.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,206 @@
|
||||
/**
|
||||
* WPForms Builder Search module.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPForms = window.WPForms || {};
|
||||
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
WPForms.Admin.Builder.Search = WPForms.Admin.Builder.Search || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements holder.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
const el = {};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
const app = {
|
||||
|
||||
/**
|
||||
* Start the engine. DOM is not ready yet, use only to init something.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* DOM is fully loaded.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.setup();
|
||||
app.events();
|
||||
app.scrollSidebar();
|
||||
},
|
||||
|
||||
/**
|
||||
* Scroll the sidebar to the height of the search.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
scrollSidebar: function() {
|
||||
|
||||
el.$sidebar.scrollTop( el.$searchWrapper.height() + 20 );
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
setup: function() {
|
||||
|
||||
// Cache DOM elements
|
||||
el.$document = $( document );
|
||||
el.$builder = $( '#wpforms-builder' );
|
||||
el.$searchInput = $( '#wpforms-search-fields-input' );
|
||||
el.$searchInputCloseBtn = $( '.wpforms-search-fields-input-close' );
|
||||
el.$searchWrapper = $( '.wpforms-search-fields-wrapper' );
|
||||
el.$noResults = $( '.wpforms-search-fields-no-results' );
|
||||
el.$listWrapper = $( '.wpforms-search-fields-list' );
|
||||
el.$list = $( '.wpforms-search-fields-list .wpforms-add-fields-buttons' );
|
||||
el.$groups = $( '.wpforms-tab-content > .wpforms-add-fields-group' );
|
||||
el.$sidebar = $( '#wpforms-panel-fields .wpforms-add-fields' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
el.$searchInput.on( 'keyup', app.searchAction );
|
||||
el.$searchInputCloseBtn.on( 'click', app.clearSearch );
|
||||
el.$document.on( 'wpformsFieldAdd', app.clearSearch );
|
||||
el.$document.on( 'wpformsFieldDelete', app.refreshSearchResults );
|
||||
},
|
||||
|
||||
/**
|
||||
* Search action.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
searchAction: function() {
|
||||
|
||||
const $fields = el.$builder.find( '.wpforms-tab-content > .wpforms-add-fields-group .wpforms-add-fields-button' );
|
||||
const searchValue = el.$searchInput.val().toLowerCase();
|
||||
|
||||
el.$list.empty();
|
||||
|
||||
if ( searchValue ) {
|
||||
el.$groups.hide();
|
||||
el.$listWrapper.show();
|
||||
el.$searchInputCloseBtn.addClass( 'active' );
|
||||
|
||||
$fields.each( function() {
|
||||
|
||||
const $item = $( this );
|
||||
const titleText = $item.text().toLowerCase();
|
||||
const keywords = $item.data( 'field-keywords' ) ? $item.data( 'field-keywords' ).toLowerCase() : '';
|
||||
|
||||
if ( titleText.indexOf( searchValue ) >= 0 || ( keywords && keywords.indexOf( searchValue ) >= 0 ) ) {
|
||||
const $clone = $item.clone();
|
||||
|
||||
$clone.attr( 'data-target', $clone.attr( 'id' ) );
|
||||
$clone.removeAttr( 'id' );
|
||||
$clone.addClass( 'wpforms-add-fields-button-clone' );
|
||||
|
||||
el.$list.append( $clone );
|
||||
}
|
||||
} );
|
||||
|
||||
const $matchingItems = el.$list.find( '.wpforms-add-fields-button' );
|
||||
const hasMatchingItems = $matchingItems.length > 0;
|
||||
|
||||
if ( hasMatchingItems ) {
|
||||
el.$noResults.hide();
|
||||
} else {
|
||||
el.$noResults.show();
|
||||
el.$listWrapper.hide();
|
||||
}
|
||||
} else {
|
||||
el.$groups.show();
|
||||
el.$listWrapper.hide();
|
||||
el.$noResults.hide();
|
||||
el.$searchInputCloseBtn.removeClass( 'active' );
|
||||
}
|
||||
|
||||
WPForms.Admin.Builder.DragFields.setup();
|
||||
WPForms.Admin.Builder.DragFields.initSortableFields();
|
||||
app.cloneClickAction();
|
||||
},
|
||||
|
||||
/**
|
||||
* Clear search.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
clearSearch: function() {
|
||||
|
||||
if ( ! el.$searchInput.val() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
el.$list.empty();
|
||||
el.$listWrapper.hide();
|
||||
el.$groups.show();
|
||||
el.$noResults.hide();
|
||||
el.$searchInput.val( '' ).focus();
|
||||
el.$searchInputCloseBtn.removeClass( 'active' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Refresh search results.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
refreshSearchResults: function() {
|
||||
|
||||
// We need to wait for the original field to be unlocked.
|
||||
setTimeout( app.searchAction, 0 );
|
||||
},
|
||||
|
||||
/**
|
||||
* Clone click action.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*/
|
||||
cloneClickAction: function() {
|
||||
|
||||
$( '.wpforms-add-fields-button-clone' ).on( 'click', function() {
|
||||
|
||||
const target = $( this ).attr( 'data-target' );
|
||||
|
||||
$( '#' + target ).trigger( 'click' );
|
||||
} );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.Search.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/search-fields.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/search-fields.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.Search=WPForms.Admin.Builder.Search||function(e,o){const i={},s={init:function(){o(s.ready)},ready:function(){s.setup(),s.events(),s.scrollSidebar()},scrollSidebar:function(){i.$sidebar.scrollTop(i.$searchWrapper.height()+20)},setup:function(){i.$document=o(e),i.$builder=o("#wpforms-builder"),i.$searchInput=o("#wpforms-search-fields-input"),i.$searchInputCloseBtn=o(".wpforms-search-fields-input-close"),i.$searchWrapper=o(".wpforms-search-fields-wrapper"),i.$noResults=o(".wpforms-search-fields-no-results"),i.$listWrapper=o(".wpforms-search-fields-list"),i.$list=o(".wpforms-search-fields-list .wpforms-add-fields-buttons"),i.$groups=o(".wpforms-tab-content > .wpforms-add-fields-group"),i.$sidebar=o("#wpforms-panel-fields .wpforms-add-fields")},events:function(){i.$searchInput.on("keyup",s.searchAction),i.$searchInputCloseBtn.on("click",s.clearSearch),i.$document.on("wpformsFieldAdd",s.clearSearch),i.$document.on("wpformsFieldDelete",s.refreshSearchResults)},searchAction:function(){var e=i.$builder.find(".wpforms-tab-content > .wpforms-add-fields-group .wpforms-add-fields-button");const t=i.$searchInput.val().toLowerCase();i.$list.empty(),t?(i.$groups.hide(),i.$listWrapper.show(),i.$searchInputCloseBtn.addClass("active"),e.each(function(){var e=o(this),s=e.text().toLowerCase(),r=e.data("field-keywords")?e.data("field-keywords").toLowerCase():"";(0<=s.indexOf(t)||r&&0<=r.indexOf(t))&&((s=e.clone()).attr("data-target",s.attr("id")),s.removeAttr("id"),s.addClass("wpforms-add-fields-button-clone"),i.$list.append(s))}),(0<i.$list.find(".wpforms-add-fields-button").length?i.$noResults:(i.$noResults.show(),i.$listWrapper)).hide()):(i.$groups.show(),i.$listWrapper.hide(),i.$noResults.hide(),i.$searchInputCloseBtn.removeClass("active")),WPForms.Admin.Builder.DragFields.setup(),WPForms.Admin.Builder.DragFields.initSortableFields(),s.cloneClickAction()},clearSearch:function(){i.$searchInput.val()&&(i.$list.empty(),i.$listWrapper.hide(),i.$groups.show(),i.$noResults.hide(),i.$searchInput.val("").focus(),i.$searchInputCloseBtn.removeClass("active"))},refreshSearchResults:function(){setTimeout(s.searchAction,0)},cloneClickAction:function(){o(".wpforms-add-fields-button-clone").on("click",function(){var e=o(this).attr("data-target");o("#"+e).trigger("click")})}};return s}(document,(window,jQuery)),WPForms.Admin.Builder.Search.init();
|
@@ -0,0 +1,283 @@
|
||||
/* global wpforms_builder_settings, Choices, wpf */
|
||||
|
||||
/**
|
||||
* Form Builder Settings Panel module.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPForms = window.WPForms || {};
|
||||
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
WPForms.Admin.Builder.Settings = WPForms.Admin.Builder.Settings || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements holder.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var el = {};
|
||||
|
||||
/**
|
||||
* Runtime variables.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var vars = {};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* DOM is fully loaded.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.setup();
|
||||
app.initTags();
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
setup: function() {
|
||||
|
||||
// Cache DOM elements.
|
||||
el = {
|
||||
$builder: $( '#wpforms-builder' ),
|
||||
$panel: $( '#wpforms-panel-settings' ),
|
||||
$selectTags: $( '#wpforms-panel-field-settings-form_tags' ),
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
el.$panel
|
||||
.on( 'keydown', '#wpforms-panel-field-settings-form_tags-wrap input', app.addCustomTagInput )
|
||||
.on( 'removeItem', '#wpforms-panel-field-settings-form_tags-wrap select', app.editTagsRemoveItem );
|
||||
|
||||
el.$selectTags
|
||||
.on( 'change', app.changeTags );
|
||||
},
|
||||
|
||||
/**
|
||||
* Init Choices.js on the Tags select input element.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
initTags: function() {
|
||||
|
||||
// Skip in certain cases.
|
||||
if (
|
||||
! el.$selectTags.length ||
|
||||
typeof window.Choices !== 'function'
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Init Choices.js object instance.
|
||||
vars.tagsChoicesObj = new Choices( el.$selectTags[0], wpforms_builder_settings.choicesjs_config );
|
||||
|
||||
// Backup current value.
|
||||
var currentValue = vars.tagsChoicesObj.getValue( true );
|
||||
|
||||
// Update all tags choices.
|
||||
vars.tagsChoicesObj
|
||||
.clearStore()
|
||||
.setChoices(
|
||||
wpforms_builder_settings.all_tags_choices,
|
||||
'value',
|
||||
'label',
|
||||
true
|
||||
)
|
||||
.setChoiceByValue( currentValue );
|
||||
|
||||
el.$selectTags.data( 'choicesjs', vars.tagsChoicesObj );
|
||||
|
||||
app.initTagsHiddenInput();
|
||||
},
|
||||
|
||||
/**
|
||||
* Init Tags hidden input element.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
initTagsHiddenInput: function() {
|
||||
|
||||
// Create additional hidden input.
|
||||
el.$selectTagsHiddenInput = $( '<input type="hidden" name="settings[form_tags_json]">' );
|
||||
el.$selectTags
|
||||
.closest( '.wpforms-panel-field' )
|
||||
.append( el.$selectTagsHiddenInput );
|
||||
|
||||
// Update hidden input value.
|
||||
app.changeTags( null );
|
||||
|
||||
// Update form state when hidden input initialized.
|
||||
// This will prevent a please-save-prompt to appear, when switching from revisions without doing any changes anywhere.
|
||||
if ( wpf.initialSave === true ) {
|
||||
wpf.savedState = wpf.getFormState( '#wpforms-builder-form' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Add custom item to Tags dropdown on input.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
*/
|
||||
addCustomTagInput: function( event ) {
|
||||
|
||||
if ( [ 'Enter', ',' ].indexOf( event.key ) < 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
if ( ! vars.tagsChoicesObj || event.target.value.length === 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var tagLabel = _.escape( event.target.value ).trim(),
|
||||
labels = _.map( vars.tagsChoicesObj.getValue(), 'label' ).map( function( label ) {
|
||||
return label.toLowerCase().trim();
|
||||
} );
|
||||
|
||||
if ( tagLabel === '' || labels.indexOf( tagLabel.toLowerCase() ) >= 0 ) {
|
||||
vars.tagsChoicesObj.clearInput();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.addCustomTagInputCreate( tagLabel );
|
||||
app.changeTags( event );
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove tag from Tags field event handler.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
*/
|
||||
editTagsRemoveItem: function( event ) {
|
||||
|
||||
var allValues = _.map( wpforms_builder_settings.all_tags_choices, 'value' );
|
||||
|
||||
if ( allValues.indexOf( event.detail.value ) >= 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We should remove new tag from the list of choices.
|
||||
var choicesObj = $( event.target ).data( 'choicesjs' ),
|
||||
currentValue = choicesObj.getValue( true ),
|
||||
choices = _.filter( choicesObj._currentState.choices, function( item ) {
|
||||
return item.value !== event.detail.value;
|
||||
} );
|
||||
|
||||
choicesObj
|
||||
.clearStore()
|
||||
.setChoices( choices, 'value', 'label', true )
|
||||
.setChoiceByValue( currentValue );
|
||||
},
|
||||
|
||||
/**
|
||||
* Add custom item to Tags dropdown on input (second part).
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @param {object} tagLabel Event object.
|
||||
*/
|
||||
addCustomTagInputCreate: function( tagLabel ) {
|
||||
|
||||
var tag = _.find( wpforms_builder_settings.all_tags_choices, { label: tagLabel } );
|
||||
|
||||
if ( tag && tag.value ) {
|
||||
vars.tagsChoicesObj.setChoiceByValue( tag.value );
|
||||
} else {
|
||||
vars.tagsChoicesObj.setChoices(
|
||||
[
|
||||
{
|
||||
value: tagLabel,
|
||||
label: tagLabel,
|
||||
selected: true,
|
||||
},
|
||||
],
|
||||
'value',
|
||||
'label',
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
vars.tagsChoicesObj.clearInput();
|
||||
},
|
||||
|
||||
/**
|
||||
* Change Tags field event handler.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
*/
|
||||
changeTags: function( event ) {
|
||||
|
||||
var tagsValue = vars.tagsChoicesObj.getValue(),
|
||||
tags = [];
|
||||
|
||||
for ( var i = 0; i < tagsValue.length; i++ ) {
|
||||
tags.push( {
|
||||
value: tagsValue[ i ].value,
|
||||
label: tagsValue[ i ].label,
|
||||
} );
|
||||
}
|
||||
|
||||
// Update Tags field hidden input value.
|
||||
el.$selectTagsHiddenInput.val(
|
||||
JSON.stringify( tags )
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.Settings.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/settings.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/settings.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.Settings=WPForms.Admin.Builder.Settings||function(t,i){var n={},o={},a={init:function(){i(a.ready)},ready:function(){a.setup(),a.initTags(),a.events()},setup:function(){n={$builder:i("#wpforms-builder"),$panel:i("#wpforms-panel-settings"),$selectTags:i("#wpforms-panel-field-settings-form_tags")}},events:function(){n.$panel.on("keydown","#wpforms-panel-field-settings-form_tags-wrap input",a.addCustomTagInput).on("removeItem","#wpforms-panel-field-settings-form_tags-wrap select",a.editTagsRemoveItem),n.$selectTags.on("change",a.changeTags)},initTags:function(){var e;n.$selectTags.length&&"function"==typeof t.Choices&&(o.tagsChoicesObj=new Choices(n.$selectTags[0],wpforms_builder_settings.choicesjs_config),e=o.tagsChoicesObj.getValue(!0),o.tagsChoicesObj.clearStore().setChoices(wpforms_builder_settings.all_tags_choices,"value","label",!0).setChoiceByValue(e),n.$selectTags.data("choicesjs",o.tagsChoicesObj),a.initTagsHiddenInput())},initTagsHiddenInput:function(){n.$selectTagsHiddenInput=i('<input type="hidden" name="settings[form_tags_json]">'),n.$selectTags.closest(".wpforms-panel-field").append(n.$selectTagsHiddenInput),a.changeTags(null),!0===wpf.initialSave&&(wpf.savedState=wpf.getFormState("#wpforms-builder-form"))},addCustomTagInput:function(e){var t,s;["Enter",","].indexOf(e.key)<0||(e.preventDefault(),e.stopPropagation(),o.tagsChoicesObj&&0!==e.target.value.length&&(t=_.escape(e.target.value).trim(),s=_.map(o.tagsChoicesObj.getValue(),"label").map(function(e){return e.toLowerCase().trim()}),""===t||0<=s.indexOf(t.toLowerCase())?o.tagsChoicesObj.clearInput():(a.addCustomTagInputCreate(t),a.changeTags(e))))},editTagsRemoveItem:function(t){var e,s,a;0<=_.map(wpforms_builder_settings.all_tags_choices,"value").indexOf(t.detail.value)||(s=(e=i(t.target).data("choicesjs")).getValue(!0),a=_.filter(e._currentState.choices,function(e){return e.value!==t.detail.value}),e.clearStore().setChoices(a,"value","label",!0).setChoiceByValue(s))},addCustomTagInputCreate:function(e){var t=_.find(wpforms_builder_settings.all_tags_choices,{label:e});t&&t.value?o.tagsChoicesObj.setChoiceByValue(t.value):o.tagsChoicesObj.setChoices([{value:e,label:e,selected:!0}],"value","label",!1),o.tagsChoicesObj.clearInput()},changeTags:function(e){for(var t=o.tagsChoicesObj.getValue(),s=[],a=0;a<t.length;a++)s.push({value:t[a].value,label:t[a].label});n.$selectTagsHiddenInput.val(JSON.stringify(s))}};return a}((document,window),jQuery),WPForms.Admin.Builder.Settings.init();
|
@@ -0,0 +1,653 @@
|
||||
/* global List, wpforms_builder, wpf, WPFormsBuilder, WPFormsFormTemplates */
|
||||
|
||||
/**
|
||||
* Form Builder Setup Panel module.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPForms = window.WPForms || {};
|
||||
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
WPForms.Admin.Builder.Setup = WPForms.Admin.Builder.Setup || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements holder.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var el = {};
|
||||
|
||||
/**
|
||||
* Runtime variables.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var vars = {};
|
||||
|
||||
/**
|
||||
* Active template name.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
const activeTemplateName = $( '.wpforms-template.selected .wpforms-template-name' ).text().trim();
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
|
||||
// Page load.
|
||||
$( window ).on( 'load', function() {
|
||||
|
||||
// In the case of jQuery 3.+, we need to wait for a ready event first.
|
||||
if ( typeof $.ready.then === 'function' ) {
|
||||
$.ready.then( app.load );
|
||||
} else {
|
||||
app.load();
|
||||
}
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* DOM is fully loaded.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.setup();
|
||||
app.setPanelsToggleState();
|
||||
app.setupTitleFocus();
|
||||
app.setTriggerBlankLink();
|
||||
app.events();
|
||||
|
||||
el.$builder.trigger( 'wpformsBuilderSetupReady' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Page load.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
load: function() {
|
||||
|
||||
app.applyTemplateOnRequest();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
setup: function() {
|
||||
|
||||
// Cache DOM elements.
|
||||
el = {
|
||||
$builder: $( '#wpforms-builder' ),
|
||||
$form: $( '#wpforms-builder-form' ),
|
||||
$formName: $( '#wpforms-setup-name' ),
|
||||
$panel: $( '#wpforms-panel-setup' ),
|
||||
$categories: $( '#wpforms-panel-setup .wpforms-setup-templates-categories' ),
|
||||
};
|
||||
|
||||
// Template list object.
|
||||
vars.templateList = new List( 'wpforms-setup-templates-list', {
|
||||
valueNames: [
|
||||
'wpforms-template-name',
|
||||
'wpforms-template-desc',
|
||||
{
|
||||
name: 'categories',
|
||||
attr: 'data-categories',
|
||||
},
|
||||
{
|
||||
name: 'subcategories',
|
||||
attr: 'data-subcategories',
|
||||
},
|
||||
],
|
||||
} );
|
||||
|
||||
// Other values.
|
||||
vars.spinner = '<i class="wpforms-loading-spinner wpforms-loading-white wpforms-loading-inline"></i>';
|
||||
vars.formID = el.$form.data( 'id' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
el.$panel
|
||||
.on( 'keyup', '#wpforms-setup-template-search', WPFormsFormTemplates.searchTemplate )
|
||||
.on( 'click', '.wpforms-setup-templates-categories li div', WPFormsFormTemplates.selectCategory )
|
||||
.on( 'click', '.wpforms-setup-templates-subcategories li', WPFormsFormTemplates.selectSubCategory )
|
||||
.on( 'click', '.wpforms-template-select', app.selectTemplate )
|
||||
.on( 'click', '.wpforms-trigger-blank', app.selectBlankTemplate );
|
||||
|
||||
// Focus on the form title field when displaying setup panel.
|
||||
el.$builder
|
||||
.on( 'wpformsPanelSwitched', app.setupTitleFocus );
|
||||
|
||||
// Sync Setup title and settings title.
|
||||
el.$builder
|
||||
.on( 'input', '#wpforms-panel-field-settings-form_title', app.syncTitle )
|
||||
.on( 'input', '#wpforms-setup-name', app.syncTitle );
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Set panels toggle buttons state.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
setPanelsToggleState: function() {
|
||||
|
||||
el.$builder
|
||||
.find( '#wpforms-panels-toggle button:not(.active)' )
|
||||
.toggleClass( 'wpforms-disabled', vars.formID === '' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Set attributes of "blank template" link.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
setTriggerBlankLink: function() {
|
||||
|
||||
el.$builder
|
||||
.find( '.wpforms-trigger-blank' )
|
||||
.attr( {
|
||||
'data-template-name-raw': 'Blank Form',
|
||||
'data-template': 'blank',
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Force focus on the form title field when switched to the Setup panel.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
* @param {string} view Current view.
|
||||
*/
|
||||
setupTitleFocus: function( e, view ) {
|
||||
|
||||
if ( typeof view === 'undefined' ) {
|
||||
view = wpf.getQueryString( 'view' );
|
||||
}
|
||||
|
||||
if ( view === 'setup' ) {
|
||||
el.$formName.trigger( 'focus' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Keep Setup title and settings title instances the same.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
syncTitle: function( e ) {
|
||||
|
||||
if ( e.target.id === 'wpforms-setup-name' ) {
|
||||
$( '#wpforms-panel-field-settings-form_title' ).val( e.target.value );
|
||||
} else {
|
||||
$( '#wpforms-setup-name' ).val( e.target.value );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Search template.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.7.7 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.searchTemplate` instead.
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
searchTemplate: function( e ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.searchTemplate( e )" has been deprecated, please use the new "WPFormsFormTemplates.searchTemplate( e )" function instead!' );
|
||||
|
||||
WPFormsFormTemplates.searchTemplate( e );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select category.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.7.7 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.selectCategory` instead.
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
selectCategory: function( e ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.selectCategory( e )" has been deprecated, please use the new "WPFormsFormTemplates.selectCategory( e )" function instead!' );
|
||||
|
||||
WPFormsFormTemplates.selectCategory( e );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
selectTemplate: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
var $button = $( this ),
|
||||
template = $button.data( 'template' ),
|
||||
formName = app.getFormName( $button );
|
||||
|
||||
// Don't do anything for templates that trigger education modal OR addons-modal.
|
||||
if ( $button.hasClass( 'education-modal' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
el.$panel.find( '.wpforms-template' ).removeClass( 'active' );
|
||||
$button.closest( '.wpforms-template' ).addClass( 'active' );
|
||||
|
||||
// Save original label.
|
||||
$button.data( 'labelOriginal', $button.html() );
|
||||
|
||||
// Display loading indicator.
|
||||
$button.html( vars.spinner + wpforms_builder.loading );
|
||||
|
||||
app.applyTemplate( formName, template, $button );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get form name.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {jQuery} $button Pressed template button.
|
||||
*
|
||||
* @returns {string} A new form name.
|
||||
*/
|
||||
getFormName: function( $button ) {
|
||||
|
||||
const templateName = $button.data( 'template-name-raw' );
|
||||
const formName = el.$formName.val();
|
||||
|
||||
if ( ! formName ) {
|
||||
return templateName;
|
||||
}
|
||||
|
||||
return activeTemplateName === formName ? templateName : formName;
|
||||
},
|
||||
|
||||
/**
|
||||
* Apply template.
|
||||
*
|
||||
* The final part of the select template routine.
|
||||
*
|
||||
* @since 1.6.9
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {jQuery} $button Use template button object.
|
||||
*/
|
||||
applyTemplate: function( formName, template, $button ) {
|
||||
|
||||
el.$builder.trigger( 'wpformsTemplateSelect', template );
|
||||
|
||||
if ( vars.formID ) {
|
||||
|
||||
// Existing form.
|
||||
app.selectTemplateExistingForm( formName, template, $button );
|
||||
|
||||
} else {
|
||||
|
||||
// Create a new form.
|
||||
WPFormsFormTemplates.selectTemplateProcess( formName, template, $button, app.selectTemplateProcessAjax );
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Select Blank template.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
selectBlankTemplate: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
var $button = $( e.target ),
|
||||
formName = el.$formName.val() || wpforms_builder.blank_form,
|
||||
template = 'blank';
|
||||
|
||||
app.applyTemplate( formName, template, $button );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template. Existing form.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {jQuery} $button Use template button object.
|
||||
*/
|
||||
selectTemplateExistingForm: function( formName, template, $button ) {
|
||||
|
||||
$.confirm( {
|
||||
title: wpforms_builder.heads_up,
|
||||
content: wpforms_builder.template_confirm,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateProcess( formName, template, $button, app.selectTemplateProcessAjax );
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_builder.cancel,
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.8.2 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.selectTemplateProcess` instead.
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {jQuery} $button Use template button object.
|
||||
*/
|
||||
selectTemplateProcess: function( formName, template, $button ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.selectTemplateProcess( formName, template, $button )" has been deprecated, please use the new "WPFormsFormTemplates.selectTemplateProcess( formName, template, $button, callback )" function instead!' );
|
||||
|
||||
WPFormsFormTemplates.selectTemplateProcess( formName, template, $button, app.selectTemplateProcessAjax );
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel button click routine.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.7.7 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.selectTemplateCancel` instead.
|
||||
*/
|
||||
selectTemplateCancel: function( ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.selectTemplateCancel" has been deprecated, please use the new "WPFormsFormTemplates.selectTemplateCancel" function instead!' );
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template. Create or update form AJAX call.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
*/
|
||||
selectTemplateProcessAjax: function( formName, template ) {
|
||||
|
||||
WPFormsBuilder.showLoadingOverlay();
|
||||
|
||||
var data = {
|
||||
title: formName,
|
||||
action: vars.formID ? 'wpforms_update_form_template' : 'wpforms_new_form',
|
||||
template: template,
|
||||
form_id: vars.formID, // eslint-disable-line camelcase
|
||||
nonce: wpforms_builder.nonce,
|
||||
};
|
||||
|
||||
$.post( wpforms_builder.ajax_url, data )
|
||||
.done( function( res ) {
|
||||
|
||||
if ( res.success ) {
|
||||
|
||||
// We have already warned the user that unsaved changes will be ignored.
|
||||
WPFormsBuilder.setCloseConfirmation( false );
|
||||
|
||||
window.location.href = wpf.getQueryString( 'force_desktop_view' ) ?
|
||||
wpf.updateQueryString( 'force_desktop_view', 1, res.data.redirect ) :
|
||||
res.data.redirect;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
wpf.debug( res );
|
||||
|
||||
if ( res.data.error_type === 'invalid_template' ) {
|
||||
app.selectTemplateProcessInvalidTemplateError( res.data.message, formName );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.selectTemplateProcessError( res.data.message );
|
||||
} )
|
||||
.fail( function( xhr, textStatus, e ) {
|
||||
|
||||
wpf.debug( xhr.responseText || textStatus || '' );
|
||||
app.selectTemplateProcessError( '' );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template AJAX call error modal for invalid template using.
|
||||
*
|
||||
* @since 1.7.5.3
|
||||
*
|
||||
* @param {string} errorMessage Error message.
|
||||
* @param {string} formName Name of the form.
|
||||
*/
|
||||
selectTemplateProcessInvalidTemplateError: function( errorMessage, formName ) {
|
||||
|
||||
$.alert( {
|
||||
title: wpforms_builder.heads_up,
|
||||
content: errorMessage,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
boxWidth: '600px',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.use_simple_contact_form,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
app.selectTemplateProcessAjax( formName, 'simple-contact-form-template' );
|
||||
WPFormsBuilder.hideLoadingOverlay();
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_builder.cancel,
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
WPFormsBuilder.hideLoadingOverlay();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template AJAX call error modal.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*
|
||||
* @param {string} error Error message.
|
||||
*/
|
||||
selectTemplateProcessError: function( error ) {
|
||||
|
||||
var content = error && error.length ? '<p>' + error + '</p>' : '';
|
||||
|
||||
$.alert( {
|
||||
title: wpforms_builder.heads_up,
|
||||
content: wpforms_builder.error_select_template + content,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
WPFormsBuilder.hideLoadingOverlay();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Open required addons alert.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.8.2 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.addonsModal` instead.
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {jQuery} $button Use template button object.
|
||||
*/
|
||||
addonsModal: function( formName, template, $button ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.addonsModal( formName, template, $button )" has been deprecated, please use the new "WPFormsFormTemplates.addonsModal( formName, template, $button, callback )" function instead!' );
|
||||
|
||||
WPFormsFormTemplates.addonsModal( formName, template, $button, app.selectTemplateProcessAjax );
|
||||
},
|
||||
|
||||
/**
|
||||
* Install & Activate addons via AJAX.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.8.2 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.installActivateAddons` instead.
|
||||
*
|
||||
* @param {Array} addons Addons slugs.
|
||||
* @param {object} previousModal Previous modal instance.
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
*/
|
||||
installActivateAddons: function( addons, previousModal, formName, template ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.installActivateAddons( addons, previousModal, formName, template )" has been deprecated, please use the new "WPFormsFormTemplates.installActivateAddons( addons, previousModal, formName, template, callback )" function instead!' );
|
||||
|
||||
WPFormsFormTemplates.installActivateAddons( addons, previousModal, formName, template, app.selectTemplateProcessAjax );
|
||||
},
|
||||
|
||||
/**
|
||||
* Install & Activate addons error modal.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.8.2 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.installActivateAddonsError` instead.
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
*/
|
||||
installActivateAddonsError: function( formName, template ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.installActivateAddonsError( formName, template )" has been deprecated, please use the new "WPFormsFormTemplates.installActivateAddonsError( formName, template, callback )" function instead!' );
|
||||
|
||||
WPFormsFormTemplates.installActivateAddonsError( formName, template, app.selectTemplateProcessAjax );
|
||||
},
|
||||
|
||||
/**
|
||||
* Install & Activate single addon via AJAX.
|
||||
*
|
||||
* @since 1.6.8
|
||||
* @since 1.8.2 Deprecated.
|
||||
*
|
||||
* @deprecated Use `WPFormsFormTemplates.installActivateAddonAjax` instead.
|
||||
*
|
||||
* @param {string} addon Addon slug.
|
||||
*
|
||||
* @returns {Promise} jQuery ajax call promise.
|
||||
*/
|
||||
installActivateAddonAjax: function( addon ) {
|
||||
|
||||
console.warn( 'WARNING! Function "WPForms.Admin.Builder.Setup.installActivateAddonAjax( addon )" has been deprecated, please use the new "WPFormsFormTemplates.installActivateAddonAjax( addon )" function instead!' );
|
||||
|
||||
return WPFormsFormTemplates.installActivateAddonAjax( addon );
|
||||
},
|
||||
|
||||
/**
|
||||
* Initiate template processing for a new form.
|
||||
*
|
||||
* @since 1.6.8
|
||||
*/
|
||||
applyTemplateOnRequest: function() {
|
||||
|
||||
var urlParams = new URLSearchParams( window.location.search ),
|
||||
templateId = urlParams.get( 'template_id' );
|
||||
|
||||
if (
|
||||
urlParams.get( 'view' ) !== 'setup' ||
|
||||
urlParams.get( 'form_id' ) ||
|
||||
! templateId
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
el.$panel.find( '.wpforms-template .wpforms-btn[data-template="' + templateId + '"]' ).trigger( 'click' );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.Setup.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/setup.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/setup.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,107 @@
|
||||
/* global WPForms, jQuery, Map, wpforms_builder, wpforms_builder_providers, _ */
|
||||
|
||||
var WPForms = window.WPForms || {};
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
|
||||
WPForms.Admin.Builder.Templates = WPForms.Admin.Builder.Templates || ( function( document, window, $ ) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Private functions and properties.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var __private = {
|
||||
|
||||
/**
|
||||
* All templating functions for providers are stored here in a Map.
|
||||
* Key is a template name, value - Underscore.js templating function.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @type {Map}
|
||||
*/
|
||||
previews: new Map(),
|
||||
};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine. DOM is not ready yet, use only to init something.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
// Do that when DOM is ready.
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* DOM is fully loaded.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
$( '#wpforms-panel-providers' ).trigger( 'WPForms.Admin.Builder.Templates.ready' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Register and compile all templates.
|
||||
* All data is saved in a Map.
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @param {string[]} templates Array of template names.
|
||||
*/
|
||||
add: function( templates ) {
|
||||
|
||||
templates.forEach( function( template ) {
|
||||
if ( typeof template === 'string' ) {
|
||||
__private.previews.set( template, wp.template( template ) );
|
||||
}
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get a templating function (to compile later with data).
|
||||
*
|
||||
* @since 1.4.8
|
||||
*
|
||||
* @param {string} template ID of a template to retrieve from a cache.
|
||||
*
|
||||
* @returns {*} A callable that after compiling will always return a string.
|
||||
*/
|
||||
get: function( template ) {
|
||||
|
||||
var preview = __private.previews.get( template );
|
||||
|
||||
if ( typeof preview !== 'undefined' ) {
|
||||
return preview;
|
||||
}
|
||||
|
||||
return function() {
|
||||
return '';
|
||||
};
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
} )( document, window, jQuery );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.Templates.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/templates.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/builder/templates.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
var WPForms=window.WPForms||{};WPForms.Admin=WPForms.Admin||{},WPForms.Admin.Builder=WPForms.Admin.Builder||{},WPForms.Admin.Builder.Templates=WPForms.Admin.Builder.Templates||function(e){"use strict";var r={previews:new Map},i={init:function(){e(i.ready)},ready:function(){e("#wpforms-panel-providers").trigger("WPForms.Admin.Builder.Templates.ready")},add:function(e){e.forEach(function(e){"string"==typeof e&&r.previews.set(e,wp.template(e))})},get:function(e){e=r.previews.get(e);return void 0!==e?e:function(){return""}}};return i}((document,window,jQuery)),WPForms.Admin.Builder.Templates.init();
|
@@ -0,0 +1,188 @@
|
||||
/* 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();
|
||||
|
||||
// In the Form Builder, we must also make the Embed button clickable.
|
||||
$( '#wpforms-embed' ).removeClass( 'wpforms-disabled' );
|
||||
|
||||
app.saveChallengeOption( optionData );
|
||||
},
|
||||
|
||||
/**
|
||||
* 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( function() { // Save the form before removing scripts if we're in a WPForms Builder.
|
||||
if ( localStorage.getItem( 'wpformsChallengeStep' ) !== null ) {
|
||||
WPFormsBuilder.formSave( false );
|
||||
}
|
||||
} ).done( // Remove scripts related to challenge.
|
||||
$( '#wpforms-challenge-admin-js, #wpforms-challenge-core-js, #wpforms-challenge-admin-js-extra, #wpforms-challenge-builder-js' )
|
||||
.remove()
|
||||
);
|
||||
} 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} jQuery.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();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/challenge/challenge-admin.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/challenge/challenge-admin.min.js
vendored
Normal 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(),o("#wpforms-embed").removeClass("wpforms-disabled"),l.saveChallengeOption(e)},cancelChallenge:function(){var e=WPFormsChallenge.core,n=(e.timer.pause(),{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(function(){null!==localStorage.getItem("wpformsChallengeStep")&&WPFormsBuilder.formSave(!1)}).done(o("#wpforms-challenge-admin-js, #wpforms-challenge-core-js, #wpforms-challenge-admin-js-extra, #wpforms-challenge-builder-js").remove()):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();
|
@@ -0,0 +1,280 @@
|
||||
/* 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();
|
||||
}
|
||||
|
||||
$( '.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 );
|
||||
} );
|
||||
|
||||
$( document ).on( 'wpformsWizardPopupClose', app.enableEmbed );
|
||||
},
|
||||
|
||||
/**
|
||||
* 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', app.gotoNotificationStep );
|
||||
|
||||
// Step 4 - Notifications.
|
||||
$( document ).on( 'click', '.wpforms-challenge-step4-done', app.showEmbedPopup );
|
||||
|
||||
// Tooltipster ready.
|
||||
$.tooltipster.on( 'ready', app.tooltipsterReady );
|
||||
|
||||
// Move to step 3 if challenge is forced and exisiting form is opened.
|
||||
$( document ).on( 'wpformsBuilderReady', function() {
|
||||
if ( $( '.wpforms-panel-fields-button' ).hasClass( 'active' ) && WPFormsChallenge.core.loadStep() <= 2 ) {
|
||||
WPFormsChallenge.core.stepCompleted( 1 );
|
||||
WPFormsChallenge.core.stepCompleted( 2 );
|
||||
}
|
||||
} );
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @since 1.7.5 Deprecated.
|
||||
*
|
||||
* @param {number|string} step Last saved step.
|
||||
*/
|
||||
gotoStep: function( step ) {
|
||||
console.warn( 'WARNING! Function "WPFormsChallenge.builder.gotoStep()" has been deprecated.' );
|
||||
},
|
||||
|
||||
/**
|
||||
* 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 ) {
|
||||
|
||||
WPFormsChallenge.core.resumeChallengeAndExec( e, function() {
|
||||
|
||||
WPFormsChallenge.core.stepCompleted( 2 )
|
||||
.done( WPForms.Admin.Builder.Setup.selectTemplate.bind( el, 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();
|
||||
},
|
||||
|
||||
/**
|
||||
* Go to Notification step.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
gotoNotificationStep: function( e ) {
|
||||
|
||||
WPFormsChallenge.core.stepCompleted( 3 ).done( function() {
|
||||
|
||||
WPFormsBuilder.panelSwitch( 'settings' );
|
||||
WPFormsBuilder.panelSectionSwitch( $( '.wpforms-panel .wpforms-panel-sidebar-section-notifications' ) );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Display 'Embed in a Page' popup.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
showEmbedPopup: function() {
|
||||
|
||||
WPFormsChallenge.core.stepCompleted( 4 ).done(
|
||||
WPFormsFormEmbedWizard.openPopup
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable Embed button when Embed popup is closed.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
enableEmbed: function() {
|
||||
|
||||
$( '#wpforms-embed' ).removeClass( 'wpforms-disabled' );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsChallenge.builder.init();
|
@@ -0,0 +1 @@
|
||||
"use strict";var WPFormsChallenge=window.WPFormsChallenge||{};WPFormsChallenge.builder=window.WPFormsChallenge.builder||function(e,o,n){var t={init:function(){n(t.ready),n(o).on("load",function(){"function"==typeof n.ready.then?n.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(),n(".wpforms-challenge").show()},setup:function(){"inited"===wpforms_challenge_admin.option.status&&(WPFormsChallenge.core.clearLocalStorage(),t.showWelcomePopup()),n("#wpforms-embed").addClass("wpforms-disabled");n.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)}),n(e).on("wpformsWizardPopupClose",t.enableEmbed)},events:function(){n("#wpforms-challenge-welcome-builder-popup").on("click","button",t.startChallenge),n(".wpforms-challenge-step1-done").on("click",function(){WPFormsChallenge.core.stepCompleted(1)}),n("#wpforms-builder").on("wpformsBuilderSetupReady",function(){t.eventSelectTemplate()}).on("wpformsPanelSwitch wpformsPanelSectionSwitch",function(){WPFormsChallenge.core.updateTooltipUI()}),n(".wpforms-challenge-step3-done").on("click",t.gotoNotificationStep),n(e).on("click",".wpforms-challenge-step4-done",t.showEmbedPopup),n.tooltipster.on("ready",t.tooltipsterReady),n(e).on("wpformsBuilderReady",function(){n(".wpforms-panel-fields-button").hasClass("active")&&WPFormsChallenge.core.loadStep()<=2&&(WPFormsChallenge.core.stepCompleted(1),WPFormsChallenge.core.stepCompleted(2))})},eventSelectTemplate:function(){n("#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"),n(".wpforms-challenge-popup-container").fadeOut(function(){n("#wpforms-challenge-welcome-builder-popup").hide()}),WPFormsChallenge.core.timer.run(WPFormsChallenge.core.timer.initialSecondsLeft),WPFormsChallenge.core.updateTooltipUI()},gotoStep:function(e){console.warn('WARNING! Function "WPFormsChallenge.builder.gotoStep()" has been deprecated.')},builderTemplateSelect:function(e,o){WPFormsChallenge.core.resumeChallengeAndExec(o,function(){WPFormsChallenge.core.stepCompleted(2).done(WPForms.Admin.Builder.Setup.selectTemplate.bind(e,o))})},tooltipsterReady:function(e){var e=n(e.origin).data("wpforms-challenge-step"),o=n("#wpforms-builder-form").data("id"),e=parseInt(e,10)||0,o=parseInt(o,10)||0;3===e&&0<o&&WPFormsChallenge.admin.saveChallengeOption({form_id:o})},showWelcomePopup:function(){n("#wpforms-challenge-welcome-builder-popup").show(),n(".wpforms-challenge-popup-container").fadeIn()},gotoNotificationStep:function(e){WPFormsChallenge.core.stepCompleted(3).done(function(){WPFormsBuilder.panelSwitch("settings"),WPFormsBuilder.panelSectionSwitch(n(".wpforms-panel .wpforms-panel-sidebar-section-notifications"))})},showEmbedPopup:function(){WPFormsChallenge.core.stepCompleted(4).done(WPFormsFormEmbedWizard.openPopup)},enableEmbed:function(){n("#wpforms-embed").removeClass("wpforms-disabled")}};return t}(document,window,jQuery),WPFormsChallenge.builder.init();
|
@@ -0,0 +1,848 @@
|
||||
/* 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 + '"> </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' );
|
||||
} else if ( step === 1 ) {
|
||||
instance.option( 'side', 'left' );
|
||||
}
|
||||
|
||||
// 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 1.6.2
|
||||
*
|
||||
* @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' ).slice( 0, step ).addClass( 'wpforms-challenge-item-completed' ).removeClass( 'wpforms-challenge-item-current' );
|
||||
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.
|
||||
*
|
||||
* @returns {Function|void} Return pause challenge function or void.
|
||||
*/
|
||||
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;
|
||||
|
||||
return app.pauseResumeChallenge( 'resume' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Pause/Resume Challenge.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @param {string} action Action to perform. `pause` or `resume`.
|
||||
*
|
||||
* @returns {Function} Save challenge option.
|
||||
*/
|
||||
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(),
|
||||
};
|
||||
|
||||
app.initListUI( optionData.status );
|
||||
|
||||
return WPFormsChallenge.admin.saveChallengeOption( optionData );
|
||||
},
|
||||
|
||||
/**
|
||||
* Resume Challenge and execute the callback.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
* @param {Function} callback Callback function.
|
||||
*/
|
||||
resumeChallengeAndExec: function( e, callback ) {
|
||||
|
||||
if ( typeof callback !== 'function' ) {
|
||||
callback = function() {};
|
||||
}
|
||||
|
||||
if ( wpforms_challenge_admin.option.status !== 'paused' ) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var resumeResult = app.resumeChallenge( e );
|
||||
|
||||
if ( typeof resumeResult === 'object' && typeof resumeResult.done === 'function' ) {
|
||||
resumeResult.done( callback );
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 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 Gutenberg 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();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/challenge/challenge-core.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/challenge/challenge-core.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,323 @@
|
||||
/* 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' } );
|
||||
app.updateTooltipVisibility();
|
||||
} 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-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 popup.
|
||||
*
|
||||
* @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 );
|
||||
},
|
||||
|
||||
/**
|
||||
* Update tooltip z-index when Gutenberg sidebar is open.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @returns {Function} Default function.
|
||||
*/
|
||||
updateTooltipVisibility: function() {
|
||||
|
||||
var targetNode = document.querySelector( '.interface-interface-skeleton__body' );
|
||||
|
||||
if ( targetNode === null ) {
|
||||
return app.updateTooltipVisibilityDefault();
|
||||
}
|
||||
|
||||
var observer = new MutationObserver( function( mutationsList ) {
|
||||
|
||||
var $step5 = $( '.wpforms-challenge-tooltip-step5' );
|
||||
|
||||
for ( var mutation of mutationsList ) {
|
||||
|
||||
if ( mutation.type === 'childList' ) {
|
||||
$step5.toggleClass( 'wpforms-challenge-tooltip-step5-hide' );
|
||||
}
|
||||
}
|
||||
} );
|
||||
|
||||
observer.observe( targetNode, { attributes: true, childList: true } );
|
||||
},
|
||||
|
||||
/**
|
||||
* Update tooltip visibility for WP 5.6 version.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
updateTooltipVisibilityDefault: function() {
|
||||
|
||||
$( '.editor-inserter__toggle' ).on( 'click', function() {
|
||||
|
||||
$( '.wpforms-challenge-tooltip-step5' ).toggleClass( 'wpforms-challenge-tooltip-step5-hide' );
|
||||
} );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsChallenge.embed.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/challenge/challenge-embed.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/challenge/challenge-embed.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPFormsChallenge=window.WPFormsChallenge||{};WPFormsChallenge.embed=window.WPFormsChallenge.embed||function(o,e,c){var t={init:function(){c(t.ready),c(e).on("load",function(){"function"==typeof c.ready.then?c.ready.then(t.load):t.load()})},ready:function(){t.setup(),t.events(),t.observeFullscreenMode()},load:function(){-1<e.location.href.indexOf("post-new.php")?(t.lastStep(),c(".wpforms-challenge-dot-completed").hide()):(WPFormsChallenge.core.isGutenberg()?(WPFormsChallenge.core.initTooltips(5,".block-editor .edit-post-header",{side:"bottom"}),t.updateTooltipVisibility()):WPFormsChallenge.core.initTooltips(5,".wpforms-insert-form-button",{side:"right"}),WPFormsChallenge.core.updateTooltipUI())},setup:function(){5===WPFormsChallenge.core.loadStep()&&(c(".wpforms-challenge").addClass("wpforms-challenge-completed"),t.showPopup()),c(".wpforms-challenge").show()},events:function(){c(".wpforms-challenge-step5-done").on("click",t.lastStep),c(".wpforms-challenge-popup-close, .wpforms-challenge-end").on("click",t.completeChallenge),c("#wpforms-challenge-contact-form .wpforms-challenge-popup-contact-btn").on("click",t.submitContactForm)},lastStep:function(){WPFormsChallenge.core.timer.pause(),WPFormsChallenge.core.stepCompleted(5),c(".wpforms-challenge").addClass("wpforms-challenge-completed"),t.showPopup()},showPopup:function(){var e=WPFormsChallenge.core.timer.getSecondsLeft();c(".wpforms-challenge-popup-container").show(),(0<e?(e=WPFormsChallenge.core.timer.getSecondsSpent(e),c("#wpforms-challenge-congrats-minutes").text(WPFormsChallenge.core.timer.getMinutesFormatted(e)),c("#wpforms-challenge-congrats-seconds").text(WPFormsChallenge.core.timer.getSecondsFormatted(e)),c("#wpforms-challenge-congrats-popup")):c("#wpforms-challenge-contact-popup")).show()},hidePopup:function(){c(".wpforms-challenge-popup-container").hide(),c(".wpforms-challenge-popup").hide()},completeChallenge:function(){var e={status:"completed",seconds_spent:WPFormsChallenge.core.timer.getSecondsSpent(),seconds_left:WPFormsChallenge.core.timer.getSecondsLeft()};t.hidePopup(),WPFormsChallenge.core.removeChallengeUI(),WPFormsChallenge.core.clearLocalStorage(),WPFormsChallenge.admin.saveChallengeOption(e).done(WPFormsChallenge.core.triggerPageSave)},submitContactForm:function(e){e.preventDefault();var e=c(this),o=e.closest("#wpforms-challenge-contact-form"),o={action:"wpforms_challenge_send_contact_form",_wpnonce:WPFormsChallenge.admin.l10n.nonce,contact_data:{message:o.find(".wpforms-challenge-contact-message").val(),contact_me:o.find(".wpforms-challenge-contact-permission").prop("checked")}};e.prop("disabled",!0),c.post(ajaxurl,o,function(e){e.success||console.error("Error sending WPForms Challenge Contact Form.")}).done(t.completeChallenge)},observeFullscreenMode:function(){var r=c("body"),a=r.hasClass("is-fullscreen-mode"),e={targetNode:r[0],config:{attributes:!0},callback:function(e,o){var t,l,n=c(".wpforms-challenge-tooltip-step5"),s=n.find(".tooltipster-arrow");for(l in e)"attributes"===(t=e[l]).type&&"class"===t.attributeName&&(t=r.hasClass("is-fullscreen-mode"))!==a&&((a=t)?(n.css({top:"93px",left:"0"}),s.css("left","91px")):(n.css({top:"125px",left:"66px"}),s.css("left","130px")))}};e.observer=new MutationObserver(e.callback),e.observer.observe(e.targetNode,e.config)},updateTooltipVisibility:function(){var e=o.querySelector(".interface-interface-skeleton__body");if(null===e)return t.updateTooltipVisibilityDefault();new MutationObserver(function(e){var o,t=c(".wpforms-challenge-tooltip-step5");for(o of e)"childList"===o.type&&t.toggleClass("wpforms-challenge-tooltip-step5-hide")}).observe(e,{attributes:!0,childList:!0})},updateTooltipVisibilityDefault:function(){c(".editor-inserter__toggle").on("click",function(){c(".wpforms-challenge-tooltip-step5").toggleClass("wpforms-challenge-tooltip-step5-hide")})}};return t}(document,window,jQuery),WPFormsChallenge.embed.init();
|
@@ -0,0 +1,608 @@
|
||||
/* global wpforms_education, WPFormsBuilder, wpf */
|
||||
/**
|
||||
* WPForms Education Core.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsEducation = window.WPFormsEducation || {};
|
||||
|
||||
WPFormsEducation.core = window.WPFormsEducation.core || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Spinner markup.
|
||||
*
|
||||
* @since 1.7.0
|
||||
*
|
||||
* @type {string}
|
||||
*/
|
||||
var spinner = '<i class="wpforms-loading-spinner wpforms-loading-white wpforms-loading-inline"></i>';
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Register JS events.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
app.dismissEvents();
|
||||
app.openModalButtonClick();
|
||||
app.setDykColspan();
|
||||
app.gotoAdvancedTabClick();
|
||||
},
|
||||
|
||||
/**
|
||||
* Open education modal.
|
||||
*
|
||||
* @since 1.7.0
|
||||
*/
|
||||
openModalButtonClick: function() {
|
||||
|
||||
$( document )
|
||||
.on( 'click', '.education-modal:not(.wpforms-add-fields-button)', app.openModalButtonHandler )
|
||||
.on( 'mousedown', '.education-modal.wpforms-add-fields-button', app.openModalButtonHandler );
|
||||
},
|
||||
|
||||
/**
|
||||
* Open education modal handler.
|
||||
*
|
||||
* @since 1.8.0
|
||||
*
|
||||
* @param {Event} event Event.
|
||||
*/
|
||||
openModalButtonHandler: function( event ) {
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
const $this = $( this );
|
||||
|
||||
switch ( $this.data( 'action' ) ) {
|
||||
case 'activate':
|
||||
app.activateModal( $this );
|
||||
break;
|
||||
case 'install':
|
||||
app.installModal( $this );
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Dismiss button events.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
dismissEvents: function() {
|
||||
|
||||
$( document ).on( 'click', '.wpforms-dismiss-container .wpforms-dismiss-button', function( e ) {
|
||||
|
||||
var $this = $( this ),
|
||||
$cont = $this.closest( '.wpforms-dismiss-container' ),
|
||||
$out = $cont.find( '.wpforms-dismiss-out' ),
|
||||
data = {
|
||||
action: 'wpforms_education_dismiss',
|
||||
nonce: wpforms_education.nonce,
|
||||
section: $this.data( 'section' ),
|
||||
page: typeof window.pagenow === 'string' ? window.pagenow : '',
|
||||
};
|
||||
|
||||
if ( $cont.hasClass( 'wpforms-dismiss-out' ) ) {
|
||||
$out = $cont;
|
||||
}
|
||||
|
||||
if ( $out.length > 0 ) {
|
||||
$out.addClass( 'out' );
|
||||
setTimeout(
|
||||
function() {
|
||||
$cont.remove();
|
||||
},
|
||||
300
|
||||
);
|
||||
} else {
|
||||
$cont.remove();
|
||||
}
|
||||
|
||||
$.post( wpforms_education.ajax_url, data );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculate and dynamically set the DYK block cell colspan attribute.
|
||||
*
|
||||
* @since 1.7.3
|
||||
*/
|
||||
setDykColspan: function() {
|
||||
|
||||
$( '#adv-settings' ).on(
|
||||
'change',
|
||||
'input.hide-column-tog',
|
||||
function( event ) {
|
||||
|
||||
var $dykCell = $( '.wpforms-dyk td' ),
|
||||
colCount = $( '.wp-list-table thead .manage-column' ).not( '.hidden' ).length;
|
||||
|
||||
$dykCell.attr( 'colspan', colCount );
|
||||
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Go to Advanced tab when click on the link in Calculations educational notice.
|
||||
*
|
||||
* @since 1.8.4.1
|
||||
*/
|
||||
gotoAdvancedTabClick() {
|
||||
$( document )
|
||||
.on( 'click', '.wpforms-educational-alert.wpforms-calculations a', function( e ) {
|
||||
const $a = $( this );
|
||||
|
||||
if ( $a.attr( 'href' ) !== '#advanced-tab' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
$a.closest( '.wpforms-field-option' )
|
||||
.find( '.wpforms-field-option-group-advanced .wpforms-field-option-group-toggle' )
|
||||
.trigger( 'click' );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get UTM content for different elements.
|
||||
*
|
||||
* @since 1.6.9
|
||||
*
|
||||
* @param {jQuery} $el Element.
|
||||
*
|
||||
* @return {string} UTM content string.
|
||||
*/
|
||||
getUTMContentValue( $el ) {
|
||||
// UTM content for Fields.
|
||||
if ( $el.hasClass( 'wpforms-add-fields-button' ) ) {
|
||||
return $el.data( 'utm-content' ) + ' Field';
|
||||
}
|
||||
|
||||
// UTM content for Templates.
|
||||
if ( $el.hasClass( 'wpforms-template-select' ) ) {
|
||||
return app.slugToUTMcontent( $el.data( 'slug' ) );
|
||||
}
|
||||
|
||||
// UTM content for Addons (sidebar).
|
||||
if ( $el.hasClass( 'wpforms-panel-sidebar-section' ) ) {
|
||||
return app.slugToUTMcontent( $el.data( 'slug' ) ) + ' Addon';
|
||||
}
|
||||
|
||||
// UTM content by default with fallback `data-name`.
|
||||
return $el.data( 'utm-content' ) || $el.data( 'name' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Convert slug to UTM content.
|
||||
*
|
||||
* @since 1.6.9
|
||||
*
|
||||
* @param {string} slug Slug.
|
||||
*
|
||||
* @returns {string} UTM content string.
|
||||
*/
|
||||
slugToUTMcontent: function( slug ) {
|
||||
|
||||
if ( ! slug ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return slug.toString()
|
||||
|
||||
// Replace all non-alphanumeric characters with space.
|
||||
.replace( /[^a-z\d ]/gi, ' ' )
|
||||
|
||||
// Uppercase each word.
|
||||
.replace( /\b[a-z]/g, function( char ) {
|
||||
return char.toUpperCase();
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get upgrade URL according to the UTM content and license type.
|
||||
*
|
||||
* @since 1.6.9
|
||||
*
|
||||
* @param {string} utmContent UTM content.
|
||||
* @param {string} type Feature license type: pro or elite.
|
||||
*
|
||||
* @returns {string} Upgrade URL.
|
||||
*/
|
||||
getUpgradeURL: function( utmContent, type ) {
|
||||
|
||||
var baseURL = wpforms_education.upgrade[ type ].url;
|
||||
|
||||
if ( utmContent.toLowerCase().indexOf( 'template' ) > -1 ) {
|
||||
baseURL = wpforms_education.upgrade[ type ].url_template;
|
||||
}
|
||||
|
||||
// Test if the base URL already contains `?`.
|
||||
var appendChar = /(\?)/.test( baseURL ) ? '&' : '?';
|
||||
|
||||
// If the upgrade link is changed by partners, appendChar has to be encoded.
|
||||
if ( baseURL.indexOf( 'https://wpforms.com' ) === -1 ) {
|
||||
appendChar = encodeURIComponent( appendChar );
|
||||
}
|
||||
|
||||
return baseURL + appendChar + 'utm_content=' + encodeURIComponent( utmContent.trim() );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get spinner markup.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @returns {string} Spinner markup.
|
||||
*/
|
||||
getSpinner: function() {
|
||||
|
||||
return spinner;
|
||||
},
|
||||
|
||||
/**
|
||||
* Addon activate modal.
|
||||
*
|
||||
* @since 1.7.0
|
||||
*
|
||||
* @param {jQuery} $button jQuery button element.
|
||||
*/
|
||||
activateModal: function( $button ) {
|
||||
|
||||
var feature = $button.data( 'name' ),
|
||||
message = $button.data( 'message' );
|
||||
|
||||
const canActivateAddons = wpforms_education.can_activate_addons;
|
||||
|
||||
$.alert( {
|
||||
title : false,
|
||||
content: message ? message : wpforms_education.activate_prompt.replace( /%name%/g, feature ),
|
||||
icon : 'fa fa-info-circle',
|
||||
type : 'blue',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text : wpforms_education.activate_confirm,
|
||||
btnClass: 'btn-confirm' + ( ! canActivateAddons ? ' hidden' : '' ),
|
||||
keys : [ 'enter' ],
|
||||
isHidden: ! canActivateAddons,
|
||||
action : function() {
|
||||
|
||||
this.$$confirm
|
||||
.prop( 'disabled', true )
|
||||
.html( spinner + wpforms_education.activating );
|
||||
|
||||
this.$$cancel
|
||||
.prop( 'disabled', true );
|
||||
|
||||
app.activateAddon( $button, this );
|
||||
|
||||
return false;
|
||||
},
|
||||
},
|
||||
cancel : {
|
||||
text: wpforms_education.cancel,
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Activate addon via AJAX.
|
||||
*
|
||||
* @since 1.7.0
|
||||
*
|
||||
* @param {jQuery} $button jQuery button element.
|
||||
* @param {object} previousModal Previous modal instance.
|
||||
*/
|
||||
activateAddon: function( $button, previousModal ) {
|
||||
|
||||
var path = $button.data( 'path' ),
|
||||
pluginType = $button.data( 'type' ),
|
||||
nonce = $button.data( 'nonce' ),
|
||||
hideOnSuccess = $button.data( 'hide-on-success' );
|
||||
|
||||
$.post(
|
||||
wpforms_education.ajax_url,
|
||||
{
|
||||
action: 'wpforms_activate_addon',
|
||||
nonce : nonce,
|
||||
plugin: path,
|
||||
type : pluginType,
|
||||
},
|
||||
function( res ) {
|
||||
|
||||
previousModal.close();
|
||||
|
||||
if ( res.success ) {
|
||||
if ( hideOnSuccess ) {
|
||||
$button.hide();
|
||||
}
|
||||
|
||||
app.saveModal( pluginType === 'plugin' ? wpforms_education.plugin_activated : wpforms_education.addon_activated );
|
||||
} else {
|
||||
$.alert( {
|
||||
title : false,
|
||||
content: res.data,
|
||||
icon : 'fa fa-exclamation-circle',
|
||||
type : 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text : wpforms_education.close,
|
||||
btnClass: 'btn-confirm',
|
||||
keys : [ 'enter' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Ask user if they would like to save form and refresh form builder.
|
||||
*
|
||||
* @since 1.7.0
|
||||
*
|
||||
* @param {string} title Modal title.
|
||||
* @param {string|bool} content Modal content.
|
||||
*/
|
||||
saveModal: function( title, content ) {
|
||||
|
||||
title = title || wpforms_education.addon_activated;
|
||||
content = content || wpforms_education.save_prompt;
|
||||
|
||||
$.alert( {
|
||||
title : title.replace( /\.$/, '' ), // Remove a dot in the title end.
|
||||
content: content,
|
||||
icon : 'fa fa-check-circle',
|
||||
type : 'green',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text : wpforms_education.save_confirm,
|
||||
btnClass: 'btn-confirm',
|
||||
keys : [ 'enter' ],
|
||||
action : function() {
|
||||
|
||||
if ( typeof WPFormsBuilder === 'undefined' ) {
|
||||
location.reload();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
this.$$confirm
|
||||
.prop( 'disabled', true )
|
||||
.html( spinner + wpforms_education.saving );
|
||||
|
||||
this.$$cancel
|
||||
.prop( 'disabled', true );
|
||||
|
||||
if ( WPFormsBuilder.formIsSaved() ) {
|
||||
location.reload();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const saveForm = WPFormsBuilder.formSave();
|
||||
|
||||
if ( ! saveForm ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
saveForm.done( function() {
|
||||
location.reload();
|
||||
} );
|
||||
|
||||
return false;
|
||||
},
|
||||
},
|
||||
cancel : {
|
||||
text: wpforms_education.close,
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Addon install modal.
|
||||
*
|
||||
* @since 1.7.0
|
||||
*
|
||||
* @param {jQuery} $button jQuery button element.
|
||||
*/
|
||||
installModal( $button ) {
|
||||
const feature = $button.data( 'name' ),
|
||||
url = $button.data( 'url' );
|
||||
|
||||
if ( ! url || '' === url ) {
|
||||
wpf.debug( `Couldn't install the ${ feature } addon: Empty install URL.` );
|
||||
return;
|
||||
}
|
||||
|
||||
const canInstallAddons = wpforms_education.can_install_addons,
|
||||
message = $button.data( 'message' );
|
||||
|
||||
$.alert( {
|
||||
title : false,
|
||||
content : message ? message : wpforms_education.install_prompt.replace( /%name%/g, feature ),
|
||||
icon : 'fa fa-info-circle',
|
||||
type : 'blue',
|
||||
boxWidth: '425px',
|
||||
buttons : {
|
||||
confirm: {
|
||||
text : wpforms_education.install_confirm,
|
||||
btnClass: 'btn-confirm' + ( ! canInstallAddons ? ' hidden' : '' ),
|
||||
keys : [ 'enter' ],
|
||||
isHidden: ! canInstallAddons,
|
||||
action() {
|
||||
this.$$confirm.prop( 'disabled', true )
|
||||
.html( spinner + wpforms_education.installing );
|
||||
|
||||
this.$$cancel
|
||||
.prop( 'disabled', true );
|
||||
|
||||
app.installAddon( $button, this );
|
||||
|
||||
return false;
|
||||
},
|
||||
},
|
||||
cancel : {
|
||||
text: wpforms_education.cancel,
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Install addon via AJAX.
|
||||
*
|
||||
* @since 1.7.0
|
||||
*
|
||||
* @param {jQuery} $button Button object.
|
||||
* @param {object} previousModal Previous modal instance.
|
||||
*/
|
||||
installAddon: function( $button, previousModal ) {
|
||||
|
||||
var url = $button.data( 'url' ),
|
||||
pluginType = $button.data( 'type' ),
|
||||
nonce = $button.data( 'nonce' ),
|
||||
hideOnSuccess = $button.data( 'hide-on-success' );
|
||||
|
||||
$.post(
|
||||
wpforms_education.ajax_url,
|
||||
{
|
||||
action: 'wpforms_install_addon',
|
||||
nonce : nonce,
|
||||
plugin: url,
|
||||
type : pluginType,
|
||||
},
|
||||
function( res ) {
|
||||
|
||||
previousModal.close();
|
||||
|
||||
if ( res.success ) {
|
||||
if ( hideOnSuccess ) {
|
||||
$button.hide();
|
||||
}
|
||||
|
||||
app.saveModal( res.data.msg, false );
|
||||
|
||||
} else {
|
||||
var message = res.data;
|
||||
|
||||
if ( 'object' === typeof res.data ) {
|
||||
message = wpforms_education.addon_error;
|
||||
}
|
||||
|
||||
$.alert( {
|
||||
title : false,
|
||||
content: message,
|
||||
icon : 'fa fa-exclamation-circle',
|
||||
type : 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text : wpforms_education.close,
|
||||
btnClass: 'btn-confirm',
|
||||
keys : [ 'enter' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get upgrade modal width.
|
||||
*
|
||||
* @since 1.7.3
|
||||
*
|
||||
* @param {boolean} isVideoModal Upgrade modal type (with video or not).
|
||||
*
|
||||
* @returns {string} Modal width in pixels.
|
||||
*/
|
||||
getUpgradeModalWidth: function( isVideoModal ) {
|
||||
|
||||
var windowWidth = $( window ).width();
|
||||
|
||||
if ( windowWidth <= 300 ) {
|
||||
return '250px';
|
||||
}
|
||||
|
||||
if ( windowWidth <= 750 ) {
|
||||
return '350px';
|
||||
}
|
||||
|
||||
if ( ! isVideoModal || windowWidth <= 1024 ) {
|
||||
return '550px';
|
||||
}
|
||||
|
||||
return windowWidth > 1070 ? '1040px' : '994px';
|
||||
},
|
||||
|
||||
/**
|
||||
* Error modal.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {string} title Modal title.
|
||||
* @param {string} content Modal content.
|
||||
*/
|
||||
errorModal: function( title, content ) {
|
||||
|
||||
$.alert( {
|
||||
title : title || false,
|
||||
content: content,
|
||||
icon : 'fa fa-exclamation-circle',
|
||||
type : 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text : wpforms_education.close,
|
||||
btnClass: 'btn-confirm',
|
||||
keys : [ 'enter' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
WPFormsEducation.core.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/education/core.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/education/core.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,170 @@
|
||||
/* global Choices */
|
||||
/**
|
||||
* Script for manipulating DOM events in the "Email" settings page.
|
||||
* This script will be accessible in the "WPForms" → "Settings" → "Email" page.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
|
||||
const WPFormsEmailSettings = window.WPFormsEmailSettings || ( function( document, window, $ ) {
|
||||
/**
|
||||
* Elements holder.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
const el = {};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
const app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
init() {
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
ready() {
|
||||
app.setup();
|
||||
app.bindEvents();
|
||||
app.relocateImageSize();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
setup() {
|
||||
// Cache DOM elements.
|
||||
el.$wrapper = $( '.wpforms-admin-settings-email' );
|
||||
el.$headerImage = $( '.wpforms-email-header-image' );
|
||||
el.$imageSize = $( '.wpforms-email-header-image-size' );
|
||||
el.$colorScheme = $( '#wpforms-setting-row-email-color-scheme' );
|
||||
el.$typography = $( '#wpforms-setting-row-email-typography' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
bindEvents() {
|
||||
el.$wrapper
|
||||
.on( 'change', '.wpforms-email-template input[type="radio"]', app.handleOnUpdateTemplate )
|
||||
.on( 'click', '.wpforms-setting-remove-image', app.handleOnRemoveHeaderImage );
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback for template change.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*
|
||||
* @param {Object} event An event which takes place in the DOM.
|
||||
*/
|
||||
handleOnUpdateTemplate( event ) {
|
||||
const selected = $( event.currentTarget ).val();
|
||||
const $hideForNone = el.$wrapper.find( '.hide-for-template-none' );
|
||||
const $imageSizeChoices = el.$headerImage.find( '.choices' );
|
||||
const $backgroundControl = el.$wrapper.find( '.email-background-color' );
|
||||
const $legacyNotice = el.$wrapper.find( '.wpforms-email-legacy-notice' );
|
||||
|
||||
const isPro = el.$wrapper.find( '.education-modal' ).length === 0;
|
||||
const isNone = selected === 'none';
|
||||
const isDefault = selected === 'default';
|
||||
|
||||
$hideForNone.toggle( ! isNone );
|
||||
$imageSizeChoices.toggle( ! isDefault );
|
||||
$legacyNotice.toggle( isDefault );
|
||||
$backgroundControl.toggle( ( isDefault || ! isPro ) && ! isNone );
|
||||
|
||||
el.$colorScheme.toggleClass( 'legacy-template', isDefault );
|
||||
el.$typography.toggleClass( 'legacy-template', isDefault );
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback for "Remove Image" button click.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
handleOnRemoveHeaderImage() {
|
||||
$( this ).closest( '.wpforms-setting-row' ).removeClass( 'has-external-image-url' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback for the image size select input change.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
handleOnUpdateImageSize() {
|
||||
// Get the selected value.
|
||||
const value = $( this ).val();
|
||||
|
||||
// Remove the previous image size class.
|
||||
el.$headerImage.removeClass( ( index, className ) => ( className.match( /has-image-size-\w+/g ) || [] ).join( ' ' ) );
|
||||
// Add the new image size class.
|
||||
el.$headerImage.addClass( `has-image-size-${ value }` );
|
||||
},
|
||||
|
||||
/**
|
||||
* Relocate image size select input for styling purposes.
|
||||
*
|
||||
* @since 1.8.5
|
||||
*/
|
||||
relocateImageSize() {
|
||||
const $removeImage = $( '.wpforms-setting-remove-image' );
|
||||
|
||||
// Bail if there is no "Remove Image" button.
|
||||
if ( $removeImage.length === 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Move the select input before the "Remove Image" button.
|
||||
const $select = el.$imageSize.find( 'select' );
|
||||
const selectHtml = $select.get( 0 ).outerHTML;
|
||||
el.$headerImage.find( '.wpforms-setting-remove-image' ).before( selectHtml );
|
||||
$select.remove();
|
||||
|
||||
try {
|
||||
// Cache the new select input.
|
||||
const $newSelect = el.$headerImage.find( 'select' );
|
||||
// Add the image size class. Note that the default value is 140.
|
||||
el.$headerImage.addClass( `has-image-size-${ $newSelect.val() || 'medium' }` );
|
||||
// Bind the change event, and update the image size class.
|
||||
$newSelect.on( 'change', app.handleOnUpdateImageSize );
|
||||
// Initialize Choices.
|
||||
new Choices( el.$headerImage.find( 'select' ).get( 0 ), {
|
||||
searchEnabled: false,
|
||||
shouldSort: false,
|
||||
itemSelectText: '',
|
||||
} );
|
||||
|
||||
// Disable some settings if default template is selected.
|
||||
if ( el.$wrapper.find( '.wpforms-card-image input:checked' ).val() === 'default' ) {
|
||||
el.$headerImage.find( '.choices' ).toggle();
|
||||
}
|
||||
} catch ( e ) {
|
||||
// Do nothing.
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsEmailSettings.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/email/settings.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/email/settings.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const WPFormsEmailSettings=window.WPFormsEmailSettings||function(n){const g={},r={init(){n(r.ready)},ready(){r.setup(),r.bindEvents(),r.relocateImageSize()},setup(){g.$wrapper=n(".wpforms-admin-settings-email"),g.$headerImage=n(".wpforms-email-header-image"),g.$imageSize=n(".wpforms-email-header-image-size"),g.$colorScheme=n("#wpforms-setting-row-email-color-scheme"),g.$typography=n("#wpforms-setting-row-email-typography")},bindEvents(){g.$wrapper.on("change",'.wpforms-email-template input[type="radio"]',r.handleOnUpdateTemplate).on("click",".wpforms-setting-remove-image",r.handleOnRemoveHeaderImage)},handleOnUpdateTemplate(e){var e=n(e.currentTarget).val(),a=g.$wrapper.find(".hide-for-template-none"),t=g.$headerImage.find(".choices"),r=g.$wrapper.find(".email-background-color"),i=g.$wrapper.find(".wpforms-email-legacy-notice"),m=0===g.$wrapper.find(".education-modal").length,o="none"===e,e="default"===e;a.toggle(!o),t.toggle(!e),i.toggle(e),r.toggle((e||!m)&&!o),g.$colorScheme.toggleClass("legacy-template",e),g.$typography.toggleClass("legacy-template",e)},handleOnRemoveHeaderImage(){n(this).closest(".wpforms-setting-row").removeClass("has-external-image-url")},handleOnUpdateImageSize(){var e=n(this).val();g.$headerImage.removeClass((e,a)=>(a.match(/has-image-size-\w+/g)||[]).join(" ")),g.$headerImage.addClass("has-image-size-"+e)},relocateImageSize(){var e=n(".wpforms-setting-remove-image");if(0!==e.length){var e=g.$imageSize.find("select"),a=e.get(0).outerHTML;g.$headerImage.find(".wpforms-setting-remove-image").before(a),e.remove();try{var t=g.$headerImage.find("select");g.$headerImage.addClass("has-image-size-"+(t.val()||"medium")),t.on("change",r.handleOnUpdateImageSize),new Choices(g.$headerImage.find("select").get(0),{searchEnabled:!1,shouldSort:!1,itemSelectText:""}),"default"===g.$wrapper.find(".wpforms-card-image input:checked").val()&&g.$headerImage.find(".choices").toggle()}catch(e){}}}};return r}((document,window,jQuery));WPFormsEmailSettings.init();
|
@@ -0,0 +1,689 @@
|
||||
/* global wpforms_builder, wpf, tinymce, quicktags */
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* WPForms Content Field builder functions.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
var WPForms = window.WPForms || {};
|
||||
|
||||
WPForms.Admin = WPForms.Admin || {};
|
||||
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
|
||||
WPForms.Admin.Builder.ContentField = WPForms.Admin.Builder.ContentField || ( function( document, window, $ ) {
|
||||
|
||||
let app = {
|
||||
|
||||
/**
|
||||
* Duplicated field id helper variable.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @type {string|undefined}
|
||||
*/
|
||||
duplicatedFieldContent: undefined,
|
||||
|
||||
/**
|
||||
* CSS class for the div ending field content preview.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @type {string}
|
||||
*/
|
||||
contentPreviewEndClass: 'wpforms-field-content-preview-end',
|
||||
|
||||
/**
|
||||
* The id of the layout field where user just added some field.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @type {bool|int}
|
||||
*/
|
||||
updatedLayoutFieldId: false,
|
||||
|
||||
/**
|
||||
* Stores tinymce.PluginManager instance.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @type {object|tinymce.PluginManager}
|
||||
*/
|
||||
_pluginManager: {},
|
||||
|
||||
/**
|
||||
* Textarea ID.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} id Field ID.
|
||||
*
|
||||
* @returns {string} Textarea ID string without # symbol.
|
||||
*/
|
||||
textareaId: function( id ) {
|
||||
|
||||
return `wpforms-field-option-${id}-content`;
|
||||
},
|
||||
|
||||
/**
|
||||
* Content wrap ID.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} id Field ID.
|
||||
*
|
||||
* @returns {string} Content wrap ID.
|
||||
*/
|
||||
contentWrap: function( id ) {
|
||||
|
||||
return `wp-wpforms-field-option-${id}-content-wrap`;
|
||||
},
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
app.bindInitInstanceCallback();
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialized once the DOM is fully loaded.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.setPluginManager();
|
||||
|
||||
$( '#wpforms-builder' )
|
||||
.on( 'wpformsFieldAdd', app.onWpformsFieldAdd )
|
||||
.on( 'wpformsFieldMove', app.onWpformsFieldMove )
|
||||
.on( 'wpformsBeforeFieldDuplicate', app.onWpformsBeforeFieldDuplicate )
|
||||
.on( 'wpformsFieldDuplicated', app.onWpformsFieldDuplicated )
|
||||
.on( 'wpformsBeforeSave', app.onWpformsBeforeSave )
|
||||
.on( 'click', '.wpforms-content-button-update-preview.update-preview', app.updatePreview )
|
||||
.on( 'click', '.wpforms-content-button-expand-editor.expand-editor', app.expandEditor )
|
||||
.on( 'wpformsLayoutAfterReceiveFieldToColumn', app.onWpformsLayoutAfterReceiveFieldToColumn )
|
||||
.on( 'wpformsLayoutAfterUpdateColumnsData', app.layoutChanged )
|
||||
.on( 'click', '.wpforms-expandable-editor .insert-media', app.onInsertMediaButtonClicked )
|
||||
.on( 'click', '.wpforms-expandable-editor .mce-toolbar button, .wpforms-expandable-editor .quicktags-toolbar input', app.onContentUpdated )
|
||||
.on( 'input', '.wpforms-expandable-editor .wp-editor-area', app.onContentUpdated )
|
||||
.on( 'click', '.wpforms-expandable-editor .wp-switch-editor.switch-html', app.setTextareaVisible )
|
||||
.on( 'click', '.wpforms-panel-content-wrap .wpforms-field', app.hideImageToolbar );
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset editor when field is added first time or duplicated.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
* @param {int} id Editor ID.
|
||||
* @param {string} type Field type.
|
||||
*/
|
||||
onWpformsFieldAdd: function( event, id, type ) {
|
||||
|
||||
app.updateContentFieldInColumns();
|
||||
app.hasEditor( type ) && app.resetEditor( id, app.duplicatedFieldContent );
|
||||
},
|
||||
|
||||
/**
|
||||
* When someone puts any field in column, change the flag to mark the action started.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {Event} event wpformsLayoutAfterReceiveFieldToColumn event.
|
||||
* @param {object} data Data object.
|
||||
*/
|
||||
onWpformsLayoutAfterReceiveFieldToColumn: function( event, data ) {
|
||||
|
||||
let $layoutField = data.column.closest( '.wpforms-field.wpforms-field-layout' );
|
||||
|
||||
if ( $layoutField.length > 0 ) {
|
||||
app.updatedLayoutFieldId = $layoutField.data( 'field-id' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* When a layout field is updated (preset is changed, inner fields are added/moved, etc.) - reset content fields inside.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {Event} event jQuery.Event object.
|
||||
* @param {object} data Layout field data.
|
||||
*/
|
||||
layoutChanged: function( event, data ) {
|
||||
|
||||
// If the reason of the layout change was the duplication of content field inside layout, do not proceed.
|
||||
if ( typeof app.duplicatedFieldContent !== 'undefined' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( data.fieldId > 0 ) {
|
||||
app.resetFieldsInLayout( data.fieldId );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* If adding field to layout's column has been triggered, reset all editor fields in the same layout.
|
||||
*
|
||||
* Without this, editor fields gets empty.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
updateContentFieldInColumns: function() {
|
||||
|
||||
if ( app.updatedLayoutFieldId ) {
|
||||
app.resetFieldsInLayout( app.updatedLayoutFieldId );
|
||||
app.updatedLayoutFieldId = false;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset editor on field move.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
* @param {object} ui UI object.
|
||||
*/
|
||||
onWpformsFieldMove: function( event, ui ) {
|
||||
|
||||
if ( ui.item.data( 'field-type' ) === 'layout' ) {
|
||||
app.resetFieldsInLayout( ui.item.data( 'field-id' ) );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! app.hasEditor( ui.item.data( 'field-type' ) ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
let id = ui.item.data( 'field-id' ),
|
||||
currentValue = app.getEditorContent( id );
|
||||
|
||||
app.resetEditor( id, currentValue );
|
||||
app.updateContentFieldInColumns();
|
||||
},
|
||||
|
||||
/**
|
||||
* Traverse all content fields and reset only those which are inside layout field with given ID.
|
||||
*
|
||||
* @param {int} layoutFieldId Layout field ID.
|
||||
*/
|
||||
resetFieldsInLayout: function( layoutFieldId ) {
|
||||
|
||||
$( '.wpforms-field-content.wpforms-field' ).each(
|
||||
function() {
|
||||
let $fieldPreview = $( this ),
|
||||
editorID = $fieldPreview.data( 'field-id' );
|
||||
|
||||
if ( WPForms.Admin.Builder.FieldLayout.columnsHasFieldID( layoutFieldId, editorID ) ) {
|
||||
app.resetEditor( editorID, app.getEditorContent( editorID ) );
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Store temporary field value in variable duplicatedFieldContent before field has been moved.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
* @param {int} id ID of the field which will be duplicated.
|
||||
* @param {jQuery} $field Field object.
|
||||
*/
|
||||
onWpformsBeforeFieldDuplicate: function( event, id, $field ) {
|
||||
|
||||
if ( $field.data( 'field-type' ) !== 'content' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
let $settings = $( `.wpforms-field-has-tinymce[data-field-id=${id}]` );
|
||||
|
||||
app.renderPreview( $settings, id );
|
||||
app.duplicatedFieldContent = $field.find( '.wpforms-field-content-preview' ).html().replace( `<div class="${app.contentPreviewEndClass}"></div>`, '' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset duplicatedFieldContent variable when the field duplication is done.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
* @param {int} id ID of the field which will be duplicated.
|
||||
* @param {jQuery} $field Field object.
|
||||
* @param {int} newFieldId ID of newly created field.
|
||||
* @param {jQuery} $newField New field object.
|
||||
*/
|
||||
onWpformsFieldDuplicated: function( event, id, $field, newFieldId, $newField ) {
|
||||
|
||||
app.duplicatedFieldContent = undefined;
|
||||
|
||||
if ( $field.data( 'field-type' ) === 'layout' ) {
|
||||
app.resetFieldsInLayout( id );
|
||||
app.resetFieldsInLayout( newFieldId );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback triggered before form is going to be saved.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
onWpformsBeforeSave: function() {
|
||||
|
||||
// Sanitize each textarea before saving the value.
|
||||
$( '.wpforms-field-has-tinymce textarea.wp-editor-area' ).each(
|
||||
function() {
|
||||
$( this ).val( wpf.sanitizeHTML( $( this ).val(), wpforms_builder.content_field.allowed_html ) );
|
||||
}
|
||||
);
|
||||
|
||||
// Render preview of each content field.
|
||||
$( '.wpforms-field-has-tinymce' ).each(
|
||||
function() {
|
||||
app.renderPreview( null, $( this ).data( 'field-id' ) );
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback for update preview on button click.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
*/
|
||||
updatePreview: function( event ) {
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
app.renderPreview( $( this ).closest( '.wpforms-field-has-tinymce' ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Re-render field preview.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {jQuery|null} $settings Content field settings element.
|
||||
* @param {int|null} fieldId Field ID.
|
||||
*/
|
||||
renderPreview: function( $settings, fieldId = null ) {
|
||||
|
||||
if ( typeof $settings !== 'object' && typeof fieldId !== 'number' ) {
|
||||
console.log( 'Cannot update preview. ContentField.renderPreview requires valid $settings object or valid fieldId' );
|
||||
return;
|
||||
}
|
||||
|
||||
let id = fieldId > 0 ? fieldId : $settings.data( 'field-id' ),
|
||||
$preview = $( `#wpforms-field-${id}` ).find( '.wpforms-field-content-preview' ),
|
||||
value = app.parseShortcode( wpf.sanitizeHTML( app.getContentFromActiveView( id ), wpforms_builder.content_field.allowed_html ) );
|
||||
|
||||
$preview.html( `${value}<div class="${app.contentPreviewEndClass}"></div>` );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get content depending on which view is active (HTML or WYSIWYG).
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} id Field ID.
|
||||
*
|
||||
* @returns {string} Textarea or editor content.
|
||||
*/
|
||||
getContentFromActiveView: function( id ) {
|
||||
|
||||
if ( $( `#${app.contentWrap( id )}` ).hasClass( 'html-active' ) ) {
|
||||
return wpf.wpautop( $( `#${app.textareaId( id )}` ).val() );
|
||||
}
|
||||
|
||||
return app.getEditorContent( id );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get content from editor.
|
||||
*
|
||||
* Tries to get value from editor. In cases when it is not loaded yet, retrieves value from textarea.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} id The field ID.
|
||||
*
|
||||
* @returns {string} Editors content.
|
||||
*/
|
||||
getEditorContent: function( id ) {
|
||||
|
||||
let editor = tinymce.get( app.textareaId( id ) );
|
||||
|
||||
if ( editor ) {
|
||||
return editor.getContent();
|
||||
}
|
||||
|
||||
return $( `#${app.textareaId( id )}` ).val();
|
||||
},
|
||||
|
||||
/**
|
||||
* Expand and collapse editor.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {object} event Event object.
|
||||
*/
|
||||
expandEditor: function( event ) {
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
let className = 'wpforms-content-editor-expanded',
|
||||
$this = $( this ),
|
||||
$panelSidebar = $this.closest( '.wpforms-panel-sidebar' ),
|
||||
$tabContent = $this.closest( '.wpforms-field-options.wpforms-tab-content' ),
|
||||
$fieldOptionContent = $this.closest( '.wpforms-field-option.wpforms-field-has-tinymce' ),
|
||||
$actionButtons = $this.closest( '.wpforms-field-content-action-buttons' ),
|
||||
$sidebarWrapper = $this.closest( '.wpforms-expandable-editor' ),
|
||||
$editorClear = $sidebarWrapper.next( '.wpforms-expandable-editor-clear' ),
|
||||
editorHeight = $sidebarWrapper.outerHeight( true ) + 20;
|
||||
|
||||
$this.toggleClass( className ); // Add/remove class wpforms-content-editor-expanded to button.
|
||||
|
||||
// Make action button wrapper same width as sidebar width.
|
||||
if ( $this.hasClass( className ) ) {
|
||||
$actionButtons.width( $sidebarWrapper.width() );
|
||||
$editorClear.css( 'margin-bottom', `${editorHeight}px` );
|
||||
} else {
|
||||
$editorClear.css( 'margin-bottom', 0 );
|
||||
}
|
||||
|
||||
// Add/remove class wpforms-content-editor-expanded to editor/sidebar elements which needs different styling when expanded.
|
||||
[ $panelSidebar, $tabContent, $fieldOptionContent ].forEach(
|
||||
function( element ) {
|
||||
|
||||
if ( $this.hasClass( className ) ) {
|
||||
element.addClass( className );
|
||||
$this.find( 'span' ).text( wpforms_builder.content_field.collapse );
|
||||
|
||||
return;
|
||||
}
|
||||
$( `.${className}` ).removeClass( className );
|
||||
$( 'button.expand-editor' ).each(
|
||||
function() {
|
||||
$( this ).find( 'span' ).text( wpforms_builder.content_field.expand );
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Set plugin manager instance.
|
||||
*
|
||||
* Create fake tinymce instance and use it to instantiate tinymce.PluginManager.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
setPluginManager: function() {
|
||||
|
||||
if ( $( '#wpforms-builder' ).length > 0 && typeof tinymce !== 'undefined' ) {
|
||||
let $fakeTextarea = $( document.createElement( 'textarea' ) ),
|
||||
textareaId = 'wpforms-content-field-fake-div';
|
||||
|
||||
$fakeTextarea.attr( 'id', textareaId ).css( 'display', 'none' ).appendTo( 'body' );
|
||||
|
||||
/* eslint-disable camelcase */
|
||||
tinymce.init(
|
||||
{
|
||||
selector: `#${textareaId}`,
|
||||
init_instance_callback: function( instance ) {
|
||||
app._pluginManager = tinymce.PluginManager.get( 'wpeditimage' )( instance );
|
||||
},
|
||||
}
|
||||
);
|
||||
/* eslint-enable */
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback for TinyMCE init_instance_callback.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
bindInitInstanceCallback: function() {
|
||||
|
||||
window.wpformsContentFieldTinyMCECallback = function( editor ) {
|
||||
|
||||
if ( ! editor ) {
|
||||
return;
|
||||
}
|
||||
|
||||
editor.on(
|
||||
'dirty',
|
||||
app.onContentUpdated
|
||||
);
|
||||
editor.on(
|
||||
'keyup',
|
||||
app.onContentUpdated
|
||||
);
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* On content updated callback.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
onContentUpdated: function() {
|
||||
|
||||
app.showUpdatePreviewButton( $( this ).attr( 'id' ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Set textarea visible when user clicks Text editor tab.
|
||||
*
|
||||
* @since 1.7.9
|
||||
*/
|
||||
setTextareaVisible: function() {
|
||||
|
||||
let textareaID = $( this ).data( 'wp-editor-id' );
|
||||
|
||||
$( `#${textareaID}` ).css( 'visibility', 'visible' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide image toolbar when user click other field.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
hideImageToolbar: function() {
|
||||
$( '.mce-toolbar-grp.mce-inline-toolbar-grp' ).hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* On insert media button clicked.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*/
|
||||
onInsertMediaButtonClicked: function() {
|
||||
|
||||
const textareaId = app.textareaId( $( this ).closest( '.wpforms-field-has-tinymce' ).data( 'field-id' ) );
|
||||
|
||||
app.showUpdatePreviewButton( textareaId );
|
||||
},
|
||||
|
||||
/**
|
||||
* Flag saved state and show update preview button when editor content has been updated.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} textareaId Textarea ID.
|
||||
*/
|
||||
showUpdatePreviewButton: function( textareaId ) {
|
||||
|
||||
/**
|
||||
Builder does not see changes in TinyMCE field so if the user edits content and then is going to leave
|
||||
the editor, it is not prompting to save. Let's reset savedState on TinyMCE change.
|
||||
*/
|
||||
wpf.savedState = false;
|
||||
|
||||
/**
|
||||
* Unhide "Update preview" button.
|
||||
*/
|
||||
$( `#${textareaId}` ).closest( '.wpforms-field-option' ).find( '.update-preview' ).show();
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset editor.
|
||||
*
|
||||
* Removes editor and adds it again.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} id Field ID.
|
||||
* @param {string} value Editor value to set after the reset.
|
||||
*/
|
||||
resetEditor: function( id, value ) {
|
||||
|
||||
let textareaId = app.textareaId( id ),
|
||||
editor = tinymce.get( textareaId );
|
||||
|
||||
if ( editor ) {
|
||||
tinymce.execCommand( 'mceRemoveEditor', false, textareaId );
|
||||
} else {
|
||||
app.cleanEditorWrap( id );
|
||||
}
|
||||
|
||||
app.initTinyMCE( id, value );
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize TinyMCE editor instance.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} id Field ID.
|
||||
* @param {undefined|string} value Editor's value.
|
||||
*/
|
||||
initTinyMCE: function( id, value ) {
|
||||
|
||||
let textareaId = app.textareaId( id );
|
||||
|
||||
/*
|
||||
Heads up, if you are going to edit editor settings, bear in mind editor is instantiated in two places:
|
||||
- PHP instance in \WPForms\Admin\Builder\Traits\ContentInput::get_content_editor
|
||||
- JS instance in WPForms.Admin.Builder.ContentField.initTinyMCE
|
||||
*/
|
||||
/* eslint-disable camelcase */
|
||||
tinymce.init(
|
||||
{
|
||||
selector: `#${textareaId}`,
|
||||
textarea_name: `fields[${id}][content]`,
|
||||
media_buttons: true,
|
||||
drag_drop_upload: true,
|
||||
relative_urls: false,
|
||||
remove_script_host: false,
|
||||
menubar: false,
|
||||
branding: false,
|
||||
object_resizing: false,
|
||||
height: wpforms_builder.content_field.editor_height,
|
||||
plugins: wpforms_builder.content_field.content_editor_plugins.join(),
|
||||
toolbar: wpforms_builder.content_field.content_editor_toolbar.join(),
|
||||
imagetools_toolbar: 'rotateleft rotateright | flipv fliph | editimage imageoptions',
|
||||
content_css: wpforms_builder.content_field.content_editor_css_url + '?' + new Date().getTime(), // https://www.tiny.cloud/docs-4x/configure/content-appearance/#browsercaching
|
||||
invalid_elements: wpforms_builder.content_field.invalid_elements,
|
||||
wp_shortcut_labels: window.wp?.editor?.getDefaultSettings?.()?.tinymce?.wp_shortcut_labels,
|
||||
body_class: wpforms_builder.content_field.body_class,
|
||||
init_instance_callback: function( instance ) {
|
||||
|
||||
instance.setContent( typeof value !== 'undefined' ? value : wpforms_builder.content_field.editor_default_value );
|
||||
window.wpformsContentFieldTinyMCECallback( instance );
|
||||
app.setWrapperClasses( tinymce.$( `#${app.contentWrap( id )}` ) );
|
||||
quicktags(
|
||||
{
|
||||
id: textareaId,
|
||||
buttons: wpforms_builder.content_field.quicktags_buttons,
|
||||
}
|
||||
);
|
||||
},
|
||||
}
|
||||
);
|
||||
/* eslint-enable */
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks if field has tinymce editor and editor object is instantiated.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {string} type Field type.
|
||||
*
|
||||
* @returns {boolean} If has editor.
|
||||
*/
|
||||
hasEditor: function( type ) {
|
||||
|
||||
return wpforms_builder.content_input.supported_field_types.includes( type ) && typeof tinymce !== 'undefined';
|
||||
},
|
||||
|
||||
/**
|
||||
* Clean editor wrap element from tinymce element which are about to be replaced with new one.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {int} id Field ID.
|
||||
*/
|
||||
cleanEditorWrap: function( id ) {
|
||||
|
||||
let textarea = $( `#${app.textareaId( id )}` ),
|
||||
$wrap = textarea.closest( '.wp-editor-wrap' ),
|
||||
editorTools = ( wp.template( 'wpforms-content-editor-tools' ) )( { optionId: `option-${id}` } );
|
||||
|
||||
textarea.css( 'display', 'block' );
|
||||
app.setWrapperClasses( $wrap ).empty()
|
||||
.append( editorTools )
|
||||
.append( textarea )
|
||||
.attr( 'id', `${app.contentWrap( id )}` );
|
||||
},
|
||||
|
||||
/**
|
||||
* Set editor wrapper classes.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {jQuery} $wrapper Editor wrapper element.
|
||||
*
|
||||
* @returns {jQuery} Editor wrapper element.
|
||||
*/
|
||||
setWrapperClasses: function( $wrapper ) {
|
||||
|
||||
return $wrapper.addClass( 'tmce-active tmce-initialized' ).removeClass( 'html-active' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Parse string content and replace [caption] shortcode.
|
||||
*
|
||||
* @since 1.7.8
|
||||
*
|
||||
* @param {string|undefined} content Text content to parse.
|
||||
*
|
||||
* @returns {string|undefined} Parsed text.
|
||||
*/
|
||||
parseShortcode: function( content ) {
|
||||
|
||||
if ( typeof content === 'undefined' ) {
|
||||
return content;
|
||||
}
|
||||
|
||||
return app._pluginManager?._do_shcode?.( content ) ?? content;
|
||||
},
|
||||
};
|
||||
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPForms.Admin.Builder.ContentField.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/fields/content-field.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/fields/content-field.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,486 @@
|
||||
/* global wpforms_builder, wpf, WPFormsBuilder, WPForms, md5 */
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* WPForms Internal Information Field builder functions.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
var WPFormsInternalInformationField = window.WPFormsInternalInformationField || ( function( document, window, $ ) { // eslint-disable-line
|
||||
|
||||
/**
|
||||
* WPForms builder element.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @type {jQuery}
|
||||
*/
|
||||
let $builder;
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
let app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialized once the DOM is fully loaded.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
$builder = $( '#wpforms-builder' );
|
||||
|
||||
app.bindUIActionsFields();
|
||||
},
|
||||
|
||||
/**
|
||||
* Element bindings.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
bindUIActionsFields: function() {
|
||||
|
||||
app.dragDisable();
|
||||
|
||||
$builder
|
||||
.on( 'wpformsFieldAdd', app.dragDisable )
|
||||
.on( 'input', '.wpforms-field-option-row-heading input[type="text"]', app.headingUpdates )
|
||||
.on( 'input', '.wpforms-field-option-row-expanded-description textarea', app.expandedDescriptionUpdates )
|
||||
.on( 'input', '.wpforms-field-option-row-cta-label input[type="text"]', app.ctaButtonLabelUpdates )
|
||||
.on( 'input', '.wpforms-field-option-row-cta-link input[type="text"]', app.ctaButtonLinkUpdates )
|
||||
.on( 'click', '.cta-button.cta-expand-description a', app.showExpandedDescription )
|
||||
.on( 'focusout', '.wpforms-field-option-row-cta-link input[type="text"]', app.validateCTAlinkField )
|
||||
.on( 'mousedown', '.wpforms-field-internal-information-checkbox', app.handleCheckboxClick )
|
||||
.on( 'wpformsDescriptionFieldUpdated', app.descriptionFieldUpdated )
|
||||
.on( 'wpformsBeforeFieldDeleteAlert', app.preventDeleteFieldAlert )
|
||||
.on( 'mouseenter', '.internal-information-not-editable .wpforms-field-delete', app.showDismissTitle );
|
||||
},
|
||||
|
||||
/**
|
||||
* Save checkbox state as a post meta.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {string} name Checkbox name.
|
||||
* @param {int} checked Checkbox state.
|
||||
*/
|
||||
saveInternalInformationCheckbox: function( name, checked ) {
|
||||
|
||||
$.post(
|
||||
wpforms_builder.ajax_url,
|
||||
{
|
||||
action: 'wpforms_builder_save_internal_information_checkbox',
|
||||
formId: $( '#wpforms-builder-form' ).data( 'id' ),
|
||||
name: name,
|
||||
checked: checked,
|
||||
nonce: wpforms_builder.nonce,
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Replace checkboxes.
|
||||
*
|
||||
* @since 1.7.6
|
||||
* @since 1.7.9 Added ID parameter.
|
||||
*
|
||||
* @param {string} description Expanded description.
|
||||
* @param {int} id Field ID.
|
||||
*
|
||||
* @returns {string} Expanded description with checkboxes HTML.
|
||||
*/
|
||||
replaceCheckboxes: function( description, id ) {
|
||||
|
||||
const lines = description.split( /\r?\n/ ),
|
||||
replaced = [],
|
||||
needle = '[] ';
|
||||
|
||||
let lineNumber = -1;
|
||||
|
||||
for ( let line of lines ) {
|
||||
|
||||
lineNumber++;
|
||||
line = line.trim();
|
||||
|
||||
if ( ! line.startsWith( needle ) ) {
|
||||
replaced.push( line );
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
const hash = md5( line ),
|
||||
name = `iif-${id}-${hash}-${lineNumber}`;
|
||||
|
||||
line = line.replace( '[] ', `<div class="wpforms-field-internal-information-checkbox-wrap"><div class="wpforms-field-internal-information-checkbox-input"><input type="checkbox" name="${name}" value="1" class="wpforms-field-internal-information-checkbox" /></div><div class="wpforms-field-internal-information-checkbox-label">` ); line += '</div></div>';
|
||||
|
||||
replaced.push( line );
|
||||
}
|
||||
|
||||
return ( wpf.wpautop( replaced.join( '\n' ) ) ).replace( /<br \/>\n$/, '' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Do not allow field to be draggable.
|
||||
*
|
||||
* @since 1.7.9
|
||||
*/
|
||||
dragDisable: function() {
|
||||
|
||||
WPForms.Admin.Builder.DragFields.fieldDragDisable( $( '.internal-information-not-draggable' ), false );
|
||||
},
|
||||
|
||||
/**
|
||||
* Real-time updates for "Heading" field option.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
headingUpdates: function() {
|
||||
|
||||
let $this = $( this ),
|
||||
value = wpf.sanitizeHTML( $this.val() ),
|
||||
$head = $( '#wpforms-field-' + $this.parent().data( 'field-id' ) ).find( '.wpforms-field-internal-information-row-heading .heading' );
|
||||
|
||||
$head.toggle( value.length !== 0 );
|
||||
WPFormsBuilder.updateDescription( $head.find( '.text' ), value );
|
||||
},
|
||||
|
||||
/**
|
||||
* Real-time updates for "Expanded Description" field option.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
expandedDescriptionUpdates: function() {
|
||||
|
||||
const $this = $( this ),
|
||||
value = wpf.sanitizeHTML( $this.val() ),
|
||||
id = $this.parent().data( 'field-id' ),
|
||||
$field = $( '#wpforms-field-' + id ),
|
||||
$wrapper = $field.find( '.internal-information-wrap' ),
|
||||
$buttonContainer = $field.find( '.wpforms-field-internal-information-row-cta-button' ),
|
||||
$options = $( '#wpforms-field-option-' + id ),
|
||||
link = $options.find( '.wpforms-field-option-row-cta-link input[type="text"]' ).val(),
|
||||
label = $options.find( '.wpforms-field-option-row-cta-label input[type="text"]' ).val().length !== 0 ? $options.find( '.wpforms-field-option-row-cta-label input[type="text"]' ).val() : wpforms_builder.empty_label,
|
||||
$expandable = $wrapper.find( '.wpforms-field-internal-information-row-expanded-description' );
|
||||
|
||||
const newLines = app.replaceCheckboxes( value, id );
|
||||
|
||||
WPFormsBuilder.updateDescription( $wrapper.find( '.expanded-description' ), newLines );
|
||||
|
||||
if ( value.length !== 0 ) { // Expanded description has content.
|
||||
if ( $expandable.hasClass( 'expanded' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Update CTA button.
|
||||
$buttonContainer.html( app.notExpandedButton() );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$expandable.hide().removeClass( 'expanded' );
|
||||
|
||||
if ( link.length === 0 ) { // Expanded description does not have value and button has no link.
|
||||
$buttonContainer.html( '' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$buttonContainer.html( app.standardCtaButton( link, label ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Expand additional description on button click.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {object} event Click event.
|
||||
*/
|
||||
showExpandedDescription: function( event ) {
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
const $this = $( this ),
|
||||
id = $this.closest( '.wpforms-field-internal-information' ).data( 'field-id' ),
|
||||
$expandable = $this.closest( '.internal-information-content' ).find( '.wpforms-field-internal-information-row-expanded-description' ),
|
||||
$buttonContainer = $( '#wpforms-field-' + id ).find( '.wpforms-field-internal-information-row-cta-button' ),
|
||||
isExpanded = $expandable.hasClass( 'expanded' );
|
||||
|
||||
$expandable.toggleClass( 'expanded' );
|
||||
|
||||
if ( ! isExpanded ) {
|
||||
$expandable.slideDown( 400 );
|
||||
$buttonContainer.html( app.expandedButton() );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$expandable.slideUp( 400 );
|
||||
$buttonContainer.html( app.notExpandedButton() );
|
||||
},
|
||||
|
||||
/**
|
||||
* Validate if the CTA Link field has correct url.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
validateCTAlinkField: function() {
|
||||
|
||||
const $field = $( this ),
|
||||
url = $field.val().trim();
|
||||
|
||||
$field.val( url );
|
||||
|
||||
if ( url === '' || wpf.isURL( url ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.confirm(
|
||||
{
|
||||
title: wpforms_builder.heads_up,
|
||||
content: wpforms_builder.iif_redirect_url_field_error,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
$field.trigger( 'focus' );
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle checkbox checking.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {object} event Click event.
|
||||
*/
|
||||
handleCheckboxClick: function( event ) {
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
const $this = $( this ),
|
||||
checked = ! $this.prop( 'checked' );
|
||||
|
||||
$this.prop( 'checked', checked );
|
||||
|
||||
app.saveInternalInformationCheckbox( $this.prop( 'name' ), Number( checked ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Replace checkboxes on description field.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {object} event Triggered event.
|
||||
* @param {object} data Field element and field value.
|
||||
*/
|
||||
descriptionFieldUpdated: function( event, data ) {
|
||||
|
||||
const type = $( '#wpforms-field-' + data.id ).data( 'field-type' );
|
||||
|
||||
if ( type !== 'internal-information' || data.value.length === 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
data.value = app.replaceCheckboxes( data.value, data.id );
|
||||
|
||||
WPFormsBuilder.updateDescription( data.descField, data.value );
|
||||
},
|
||||
|
||||
/**
|
||||
* Prevent delete field alert to show.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {object} event Triggered event.
|
||||
* @param {object} fieldData Field data.
|
||||
* @param {string} type Field type.
|
||||
*/
|
||||
preventDeleteFieldAlert: function( event, fieldData, type ) {
|
||||
|
||||
if ( type === 'internal-information' ) {
|
||||
event.preventDefault();
|
||||
WPFormsBuilder.fieldDeleteById( fieldData.id, type, 50 );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Replace Delete field button title with Dismiss.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
showDismissTitle: function() {
|
||||
|
||||
$( this ).attr( 'title', wpforms_builder.iif_dismiss );
|
||||
},
|
||||
|
||||
/**
|
||||
* Real-time updates for "CTA button" link.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
ctaButtonLinkUpdates() {
|
||||
|
||||
let $this = $( this ),
|
||||
id = $this.parent().data( 'field-id' ),
|
||||
$field = $( '#wpforms-field-' + id ),
|
||||
$buttonContainer = $field.find( '.wpforms-field-internal-information-row-cta-button' ),
|
||||
$expandable = $field.find( '.wpforms-field-internal-information-row-expanded-description' ),
|
||||
desc = $this.closest( '#wpforms-field-option-' + id ).find( '.wpforms-field-option-row-expanded-description textarea' ).val(),
|
||||
label = $this.closest( '#wpforms-field-option-' + id ).find( '.wpforms-field-option-row-cta-label input[type="text"]' ).val();
|
||||
|
||||
if ( desc.length !== 0 ) {
|
||||
|
||||
if ( $expandable.hasClass( 'expanded' ) ) {
|
||||
|
||||
$buttonContainer.html( app.expandedButton() );
|
||||
|
||||
return;
|
||||
}
|
||||
$buttonContainer.html( app.notExpandedButton() );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( wpf.isURL( $this.val() ) && label.length !== 0 ) {
|
||||
$buttonContainer.html( app.standardCtaButton( $this.val(), label ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$buttonContainer.html( '' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Real-time updates for "CTA button" label.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*/
|
||||
ctaButtonLabelUpdates: function() {
|
||||
|
||||
let $this = $( this ),
|
||||
value = wpf.sanitizeHTML( $this.val() ),
|
||||
id = $this.parent().data( 'field-id' ),
|
||||
$field = $( '#wpforms-field-' + id ),
|
||||
$buttonContainer = $field.find( '.wpforms-field-internal-information-row-cta-button' ),
|
||||
$expandable = $field.find( '.wpforms-field-internal-information-row-expanded-description' ),
|
||||
desc = $this.closest( '#wpforms-field-option-' + id ).find( '.wpforms-field-option-row-expanded-description textarea' ).val(),
|
||||
link = $this.closest( '#wpforms-field-option-' + id ).find( '.wpforms-field-option-row-cta-link input[type="text"]' ).val();
|
||||
|
||||
if ( desc.length !== 0 && value.length !== 0 ) {
|
||||
if ( $expandable.hasClass( 'expanded' ) ) {
|
||||
|
||||
$buttonContainer.html( app.expandedButton() );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$buttonContainer.html( app.notExpandedButton() );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( value.length !== 0 && wpf.isURL( link ) ) {
|
||||
$buttonContainer.html( app.standardCtaButton( link, value ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( desc.length === 0 ) {
|
||||
$buttonContainer.html( '' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Standard CTA button template.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @param {string} url Button URL.
|
||||
* @param {string} label Button label.
|
||||
*
|
||||
* @returns {string} Button HTML.
|
||||
*/
|
||||
standardCtaButton: function( url, label ) {
|
||||
|
||||
let button = `<div class="cta-button cta-link-external ">
|
||||
<a href="%url%" target="_blank" rel="noopener noreferrer">
|
||||
<span class="button-label">%label%</span>
|
||||
</a></div>`;
|
||||
|
||||
return button.replace( '%url%', wpf.sanitizeHTML( url ) ).replace( '%label%', wpf.sanitizeHTML( label ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Not expanded button.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @returns {string} Not expanded button HTML.
|
||||
*/
|
||||
notExpandedButton: function() {
|
||||
|
||||
let button = `<div class="cta-button cta-expand-description not-expanded">
|
||||
<a href="#" target="_blank" rel="noopener noreferrer">
|
||||
<span class="button-label">%label%</span>
|
||||
<span class="icon not-expanded">
|
||||
<svg viewBox="0 0 10 7">
|
||||
<path d="M4.91016 5.90234C5.15625 6.14844 5.56641 6.14844 5.8125 5.90234L9.53125 2.18359C9.80469 1.91016 9.80469 1.5 9.53125 1.25391L8.92969 0.625C8.65625 0.378906 8.24609 0.378906 8 0.625L5.34766 3.27734L2.72266 0.625C2.47656 0.378906 2.06641 0.378906 1.79297 0.625L1.19141 1.25391C0.917969 1.5 0.917969 1.91016 1.19141 2.18359L4.91016 5.90234Z"></path>
|
||||
<path d="M4.91016 5.90234C5.15625 6.14844 5.56641 6.14844 5.8125 5.90234L9.53125 2.18359C9.80469 1.91016 9.80469 1.5 9.53125 1.25391L8.92969 0.625C8.65625 0.378906 8.24609 0.378906 8 0.625L5.34766 3.27734L2.72266 0.625C2.47656 0.378906 2.06641 0.378906 1.79297 0.625L1.19141 1.25391C0.917969 1.5 0.917969 1.91016 1.19141 2.18359L4.91016 5.90234Z"></path>
|
||||
</svg>
|
||||
</span>
|
||||
</a></div>`;
|
||||
|
||||
return button.replace( '%label%', wpforms_builder.iif_more );
|
||||
},
|
||||
|
||||
/**
|
||||
* Expanded button.
|
||||
*
|
||||
* @since 1.7.6
|
||||
*
|
||||
* @returns {string} Expanded button HTML.
|
||||
*/
|
||||
expandedButton: function() {
|
||||
|
||||
let button = `<div class="cta-button cta-expand-description expanded">
|
||||
<a href="#" target="_blank" rel="noopener noreferrer">
|
||||
<span class="button-label">%label%</span>
|
||||
<span class="icon expanded">
|
||||
<svg viewBox="0 0 10 7">
|
||||
<path d="M5.83984 0.625C5.56641 0.378906 5.15625 0.378906 4.91016 0.625L1.19141 4.34375C0.917969 4.61719 0.917969 5.02734 1.19141 5.27344L1.79297 5.90234C2.06641 6.14844 2.47656 6.14844 2.72266 5.90234L5.375 3.25L8 5.90234C8.24609 6.14844 8.68359 6.14844 8.92969 5.90234L9.55859 5.27344C9.80469 5.02734 9.80469 4.61719 9.55859 4.34375L5.83984 0.625Z" fill="red"></path>
|
||||
</svg>
|
||||
</span>
|
||||
</a></div>`;
|
||||
|
||||
return button.replace( '%label%', wpforms_builder.close );
|
||||
},
|
||||
};
|
||||
|
||||
return app;
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
WPFormsInternalInformationField.init();
|
File diff suppressed because one or more lines are too long
@@ -0,0 +1,596 @@
|
||||
/* global wpforms_admin_form_embed_wizard, WPFormsBuilder, ajaxurl, WPFormsChallenge, wpforms_builder, WPForms */
|
||||
|
||||
/**
|
||||
* Form Embed Wizard function.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsFormEmbedWizard = window.WPFormsFormEmbedWizard || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var el = {};
|
||||
|
||||
/**
|
||||
* Runtime variables.
|
||||
*
|
||||
* @since 1.6.2
|
||||
* @since 1.7.9 Added `lastEmbedSearchPageTerm` property.
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var vars = {
|
||||
formId: 0,
|
||||
isBuilder: false,
|
||||
isChallengeActive: false,
|
||||
lastEmbedSearchPageTerm: '',
|
||||
};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
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.6.2
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.initVars();
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Window load.
|
||||
*
|
||||
* @since 1.6.2
|
||||
* @since 1.7.9 Initialize 'Select Pages' ChoicesJS.
|
||||
*/
|
||||
load: function() {
|
||||
|
||||
// Initialize tooltip in page editor.
|
||||
if ( wpforms_admin_form_embed_wizard.is_edit_page === '1' && ! vars.isChallengeActive ) {
|
||||
app.initTooltip();
|
||||
}
|
||||
|
||||
// Initialize wizard state in the form builder only.
|
||||
if ( vars.isBuilder ) {
|
||||
app.initialStateToggle();
|
||||
}
|
||||
|
||||
app.initSelectPagesChoicesJS();
|
||||
|
||||
$( document ).on( 'wpformsWizardPopupClose', app.enableLetsGoButton );
|
||||
},
|
||||
|
||||
/**
|
||||
* Init variables.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
initVars: function() {
|
||||
|
||||
// Caching some DOM elements for further use.
|
||||
el = {
|
||||
$wizardContainer: $( '#wpforms-admin-form-embed-wizard-container' ),
|
||||
$wizard: $( '#wpforms-admin-form-embed-wizard' ),
|
||||
$contentInitial: $( '#wpforms-admin-form-embed-wizard-content-initial' ),
|
||||
$contentSelectPage: $( '#wpforms-admin-form-embed-wizard-content-select-page' ),
|
||||
$contentCreatePage: $( '#wpforms-admin-form-embed-wizard-content-create-page' ),
|
||||
$sectionBtns: $( '#wpforms-admin-form-embed-wizard-section-btns' ),
|
||||
$sectionGo: $( '#wpforms-admin-form-embed-wizard-section-go' ),
|
||||
$newPageTitle: $( '#wpforms-admin-form-embed-wizard-new-page-title' ),
|
||||
$selectPage: $( '#wpforms-setting-form-embed-wizard-choicesjs-select-pages' ),
|
||||
$videoTutorial: $( '#wpforms-admin-form-embed-wizard-tutorial' ),
|
||||
$sectionToggles: $( '#wpforms-admin-form-embed-wizard-section-toggles' ),
|
||||
$sectionGoBack: $( '#wpforms-admin-form-embed-wizard-section-goback' ),
|
||||
$shortcode: $( '#wpforms-admin-form-embed-wizard-shortcode-wrap' ),
|
||||
$shortcodeInput: $( '#wpforms-admin-form-embed-wizard-shortcode' ),
|
||||
$shortcodeCopy: $( '#wpforms-admin-form-embed-wizard-shortcode-copy' ),
|
||||
};
|
||||
|
||||
el.$selectPageContainer = el.$selectPage.parents( 'span.choicesjs-select-wrap' );
|
||||
|
||||
// Detect the form builder screen and store the flag.
|
||||
vars.isBuilder = typeof WPFormsBuilder !== 'undefined';
|
||||
|
||||
// Detect the Challenge and store the flag.
|
||||
vars.isChallengeActive = typeof WPFormsChallenge !== 'undefined';
|
||||
|
||||
// Are the pages exists?
|
||||
vars.pagesExists = el.$wizard.data( 'pages-exists' ) === 1;
|
||||
},
|
||||
|
||||
/**
|
||||
* Init ChoicesJS for "Select Pages" field in embed.
|
||||
*
|
||||
* @since 1.7.9
|
||||
*/
|
||||
initSelectPagesChoicesJS: function() {
|
||||
|
||||
if ( el.$selectPage.length <= 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const useAjax = el.$selectPage.data( 'use_ajax' ) === 1;
|
||||
|
||||
WPForms.Admin.Builder.WPFormsChoicesJS.setup(
|
||||
el.$selectPage[0],
|
||||
{},
|
||||
{
|
||||
action: 'wpforms_admin_form_embed_wizard_search_pages_choicesjs',
|
||||
nonce: useAjax ? wpforms_admin_form_embed_wizard.nonce : null,
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Register JS events.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
// Skip wizard events in the page editor.
|
||||
if ( ! el.$wizard.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
el.$wizard
|
||||
.on( 'click', 'button', app.popupButtonsClick )
|
||||
.on( 'click', '.tutorial-toggle', app.tutorialToggle )
|
||||
.on( 'click', '.shortcode-toggle', app.shortcodeToggle )
|
||||
.on( 'click', '.initialstate-toggle', app.initialStateToggle )
|
||||
.on( 'click', '.wpforms-admin-popup-close', app.closePopup )
|
||||
.on( 'click', '#wpforms-admin-form-embed-wizard-shortcode-copy', app.copyShortcodeToClipboard )
|
||||
.on( 'keyup', '#wpforms-admin-form-embed-wizard-new-page-title', app.enableLetsGoButton );
|
||||
},
|
||||
|
||||
/**
|
||||
* Popup buttons events handler.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
popupButtonsClick: function( e ) {
|
||||
|
||||
var $btn = $( e.target );
|
||||
|
||||
if ( ! $btn.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var $div = $btn.closest( 'div' ),
|
||||
action = $btn.data( 'action' ) || '';
|
||||
|
||||
el.$contentInitial.hide();
|
||||
|
||||
switch ( action ) {
|
||||
|
||||
// Select existing page.
|
||||
case 'select-page':
|
||||
el.$newPageTitle.hide();
|
||||
el.$contentSelectPage.show();
|
||||
break;
|
||||
|
||||
// Create a new page.
|
||||
case 'create-page':
|
||||
el.$selectPageContainer.hide();
|
||||
el.$contentCreatePage.show();
|
||||
break;
|
||||
|
||||
// Let's Go!
|
||||
case 'go':
|
||||
if ( el.$selectPageContainer.is( ':visible' ) && el.$selectPage.val() === '' ) {
|
||||
return;
|
||||
}
|
||||
$btn.prop( 'disabled', true );
|
||||
app.saveFormAndRedirect();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$div.hide();
|
||||
$div.next().fadeIn();
|
||||
el.$sectionToggles.hide();
|
||||
el.$sectionGoBack.fadeIn();
|
||||
|
||||
// Set focus to the field that is currently displayed.
|
||||
$.each( [ el.$selectPage, el.$newPageTitle ], function() {
|
||||
if ( this.is( ':visible' ) ) {
|
||||
this.trigger( 'focus' );
|
||||
}
|
||||
} );
|
||||
|
||||
app.tutorialControl( 'Stop' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle video tutorial inside popup.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
tutorialToggle: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
el.$shortcode.hide();
|
||||
el.$videoTutorial.toggle();
|
||||
|
||||
if ( el.$videoTutorial.attr( 'src' ) === 'about:blank' ) {
|
||||
el.$videoTutorial.attr( 'src', wpforms_admin_form_embed_wizard.video_url );
|
||||
}
|
||||
|
||||
if ( el.$videoTutorial[0].src.indexOf( '&autoplay=1' ) < 0 ) {
|
||||
app.tutorialControl( 'Play' );
|
||||
} else {
|
||||
app.tutorialControl( 'Stop' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle video tutorial inside popup.
|
||||
*
|
||||
* @since 1.6.2.3
|
||||
*
|
||||
* @param {string} action One of 'Play' or 'Stop'.
|
||||
*/
|
||||
tutorialControl: function( action ) {
|
||||
|
||||
var iframe = el.$videoTutorial[0];
|
||||
|
||||
if ( typeof iframe === 'undefined' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( action !== 'Stop' ) {
|
||||
iframe.src += iframe.src.indexOf( '&autoplay=1' ) < 0 ? '&autoplay=1' : '';
|
||||
} else {
|
||||
iframe.src = iframe.src.replace( '&autoplay=1', '' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle shortcode input field.
|
||||
*
|
||||
* @since 1.6.2.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
shortcodeToggle: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
el.$videoTutorial.hide();
|
||||
app.tutorialControl( 'Stop' );
|
||||
el.$shortcodeInput.val( '[wpforms id="' + vars.formId + '" title="false"]' );
|
||||
el.$shortcode.toggle();
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable the "Let's Go!" button.
|
||||
*
|
||||
* @since 1.8.2.3
|
||||
*/
|
||||
enableLetsGoButton: function() {
|
||||
|
||||
const $btn = el.$sectionGo.find( 'button' );
|
||||
|
||||
$btn.prop( 'disabled', false );
|
||||
},
|
||||
|
||||
/**
|
||||
* Copies the shortcode embed code to the clipboard.
|
||||
*
|
||||
* @since 1.6.4
|
||||
*/
|
||||
copyShortcodeToClipboard: function() {
|
||||
|
||||
// Remove disabled attribute, select the text, and re-add disabled attribute.
|
||||
el.$shortcodeInput
|
||||
.prop( 'disabled', false )
|
||||
.select()
|
||||
.prop( 'disabled', true );
|
||||
|
||||
// Copy it.
|
||||
document.execCommand( 'copy' );
|
||||
|
||||
var $icon = el.$shortcodeCopy.find( 'i' );
|
||||
|
||||
// Add visual feedback to copy command.
|
||||
$icon.removeClass( 'fa-files-o' ).addClass( 'fa-check' );
|
||||
|
||||
// Reset visual confirmation back to default state after 2.5 sec.
|
||||
window.setTimeout( function() {
|
||||
$icon.removeClass( 'fa-check' ).addClass( 'fa-files-o' );
|
||||
}, 2500 );
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle initial state.
|
||||
*
|
||||
* @since 1.6.2.3
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
initialStateToggle: function( e ) {
|
||||
|
||||
if ( e ) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
if ( vars.pagesExists ) {
|
||||
el.$contentInitial.show();
|
||||
el.$contentSelectPage.hide();
|
||||
el.$contentCreatePage.hide();
|
||||
el.$selectPageContainer.show();
|
||||
el.$newPageTitle.show();
|
||||
el.$sectionBtns.show();
|
||||
el.$sectionGo.hide();
|
||||
} else {
|
||||
el.$contentInitial.hide();
|
||||
el.$contentSelectPage.hide();
|
||||
el.$contentCreatePage.show();
|
||||
el.$selectPageContainer.hide();
|
||||
el.$newPageTitle.show();
|
||||
el.$sectionBtns.hide();
|
||||
el.$sectionGo.show();
|
||||
}
|
||||
el.$shortcode.hide();
|
||||
el.$videoTutorial.hide();
|
||||
app.tutorialControl( 'Stop' );
|
||||
el.$sectionToggles.show();
|
||||
el.$sectionGoBack.hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* Save the form and redirect to form embed page.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
saveFormAndRedirect: function() {
|
||||
|
||||
// Just redirect if no need to save the form.
|
||||
if ( ! vars.isBuilder || WPFormsBuilder.formIsSaved() ) {
|
||||
app.embedPageRedirect();
|
||||
return;
|
||||
}
|
||||
|
||||
// Embedding in Challenge should save the form silently.
|
||||
if ( vars.isBuilder && vars.isChallengeActive ) {
|
||||
WPFormsBuilder.formSave().done( app.embedPageRedirect );
|
||||
return;
|
||||
}
|
||||
|
||||
$.confirm( {
|
||||
title: false,
|
||||
content: wpforms_builder.exit_confirm,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
closeIcon: true,
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_builder.save_embed,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
WPFormsBuilder.formSave().done( app.embedPageRedirect );
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_builder.embed,
|
||||
action: function() {
|
||||
WPFormsBuilder.setCloseConfirmation( false );
|
||||
app.embedPageRedirect();
|
||||
},
|
||||
},
|
||||
},
|
||||
onClose: function() {
|
||||
el.$sectionGo.find( 'button' ).prop( 'disabled', false );
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Prepare data for requesting redirect URL.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @returns {object} AJAX data object.
|
||||
*/
|
||||
embedPageRedirectAjaxData: function() {
|
||||
|
||||
var data = {
|
||||
action : 'wpforms_admin_form_embed_wizard_embed_page_url',
|
||||
_wpnonce: wpforms_admin_form_embed_wizard.nonce,
|
||||
formId: vars.formId,
|
||||
};
|
||||
|
||||
if ( el.$selectPageContainer.is( ':visible' ) ) {
|
||||
data.pageId = el.$selectPage.val();
|
||||
}
|
||||
|
||||
if ( el.$newPageTitle.is( ':visible' ) ) {
|
||||
data.pageTitle = el.$newPageTitle.val();
|
||||
}
|
||||
|
||||
return data;
|
||||
},
|
||||
|
||||
/**
|
||||
* Redirect to form embed page.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
embedPageRedirect: function() {
|
||||
|
||||
var data = app.embedPageRedirectAjaxData();
|
||||
|
||||
// Exit if no one page is selected.
|
||||
if ( typeof data.pageId !== 'undefined' && data.pageId === '' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.post( ajaxurl, data, function( response ) {
|
||||
if ( response.success ) {
|
||||
window.location = response.data;
|
||||
}
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Display wizard popup.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @param {numeric} openFormId Form ID to embed. Used only if called outside the form builder.
|
||||
*/
|
||||
openPopup: function( openFormId ) {
|
||||
|
||||
openFormId = openFormId || 0;
|
||||
|
||||
vars.formId = vars.isBuilder ? $( '#wpforms-builder-form' ).data( 'id' ) : openFormId;
|
||||
|
||||
// Regular wizard and wizard in Challenge has differences.
|
||||
el.$wizard.toggleClass( 'wpforms-challenge-popup', vars.isChallengeActive );
|
||||
el.$wizard.find( '.wpforms-admin-popup-content-regular' ).toggle( ! vars.isChallengeActive );
|
||||
el.$wizard.find( '.wpforms-admin-popup-content-challenge' ).toggle( vars.isChallengeActive );
|
||||
|
||||
// Re-init sections.
|
||||
if ( el.$selectPage.length === 0 ) {
|
||||
el.$sectionBtns.hide();
|
||||
el.$sectionGo.show();
|
||||
} else {
|
||||
el.$sectionBtns.show();
|
||||
el.$sectionGo.hide();
|
||||
}
|
||||
el.$newPageTitle.show();
|
||||
el.$selectPageContainer.show();
|
||||
|
||||
el.$wizardContainer.fadeIn();
|
||||
},
|
||||
|
||||
/**
|
||||
* Close wizard popup.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
closePopup: function() {
|
||||
|
||||
el.$wizardContainer.fadeOut();
|
||||
app.initialStateToggle();
|
||||
|
||||
$( document ).trigger( 'wpformsWizardPopupClose' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Init embed page tooltip.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*/
|
||||
initTooltip: function() {
|
||||
|
||||
if ( typeof $.fn.tooltipster === 'undefined' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var $dot = $( '<span class="wpforms-admin-form-embed-wizard-dot"> </span>' ),
|
||||
isGutenberg = app.isGutenberg(),
|
||||
anchor = isGutenberg ? '.block-editor .edit-post-header' : '#wp-content-editor-tools .wpforms-insert-form-button';
|
||||
|
||||
var tooltipsterArgs = {
|
||||
content : $( '#wpforms-admin-form-embed-wizard-tooltip-content' ),
|
||||
trigger : 'custom',
|
||||
interactive : true,
|
||||
animationDuration: 0,
|
||||
delay : 0,
|
||||
theme : [ 'tooltipster-default', 'wpforms-admin-form-embed-wizard' ],
|
||||
side : isGutenberg ? 'bottom' : 'right',
|
||||
distance : 3,
|
||||
functionReady : function( instance, helper ) {
|
||||
|
||||
instance._$tooltip.on( 'click', 'button', function() {
|
||||
|
||||
instance.close();
|
||||
$( '.wpforms-admin-form-embed-wizard-dot' ).remove();
|
||||
} );
|
||||
|
||||
instance.reposition();
|
||||
},
|
||||
};
|
||||
|
||||
if ( ! isGutenberg ) {
|
||||
$dot.insertAfter( anchor ).tooltipster( tooltipsterArgs ).tooltipster( 'open' );
|
||||
}
|
||||
|
||||
// The Gutenberg header can be loaded after the window load event.
|
||||
// We have to wait until the Gutenberg heading is added to the DOM.
|
||||
const closeAnchorListener = wp.data.subscribe( function() {
|
||||
|
||||
if ( ! $( anchor ).length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Close the listener to avoid an infinite loop.
|
||||
closeAnchorListener();
|
||||
|
||||
$dot.insertAfter( anchor ).tooltipster( tooltipsterArgs ).tooltipster( 'open' );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if we're in Gutenberg editor.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @returns {boolean} Is Gutenberg or not.
|
||||
*/
|
||||
isGutenberg: function() {
|
||||
|
||||
return typeof wp !== 'undefined' && Object.prototype.hasOwnProperty.call( wp, 'blocks' );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsFormEmbedWizard.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/form-embed-wizard.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/form-embed-wizard.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,644 @@
|
||||
/* global List, wpforms_form_templates, wpforms_addons, wpf */
|
||||
|
||||
/**
|
||||
* Form Templates function.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsFormTemplates = window.WPFormsFormTemplates || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Runtime variables.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var vars = {};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
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.7.7
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.setup();
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Window load.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
load: function() {
|
||||
|
||||
app.showUpgradeBanner();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup. Prepare some variables.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
setup: function() {
|
||||
|
||||
// Template list object.
|
||||
vars.templateList = new List( 'wpforms-setup-templates-list', {
|
||||
valueNames: [
|
||||
'wpforms-template-name',
|
||||
'wpforms-template-desc',
|
||||
{
|
||||
name: 'slug',
|
||||
attr: 'data-slug',
|
||||
},
|
||||
{
|
||||
name: 'categories',
|
||||
attr: 'data-categories',
|
||||
},
|
||||
{
|
||||
name: 'subcategories',
|
||||
attr: 'data-subcategories',
|
||||
},
|
||||
{
|
||||
name: 'has-access',
|
||||
attr: 'data-has-access',
|
||||
},
|
||||
{
|
||||
name: 'favorite',
|
||||
attr: 'data-favorite',
|
||||
},
|
||||
],
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
$( '#wpforms-setup-templates-list' )
|
||||
.on( 'click', '.wpforms-template-favorite i', app.selectFavorite );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select Favorite Templates.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
// eslint-disable-next-line max-lines-per-function
|
||||
selectFavorite: function( e ) {
|
||||
|
||||
let $heartIcon = $( this ),
|
||||
favorite = $heartIcon.hasClass( 'fa-heart-o' ),
|
||||
$favorite = $heartIcon.closest( '.wpforms-template-favorite' ),
|
||||
$template = $heartIcon.closest( '.wpforms-template' ),
|
||||
$templateName = $template.find( '.wpforms-template-name' ),
|
||||
templateSlug = $template.find( '.wpforms-template-select' ).data( 'slug' ),
|
||||
$favoritesCategory = $( '.wpforms-setup-templates-categories' ).find( '[data-category=\'favorites\']' ),
|
||||
$favoritesCount = $favoritesCategory.find( 'span' ),
|
||||
favoritesCount = parseInt( $favoritesCount.html(), 10 ),
|
||||
data = {
|
||||
action: 'wpforms_templates_favorite',
|
||||
slug: templateSlug,
|
||||
favorite: favorite,
|
||||
nonce: wpforms_form_templates.nonce,
|
||||
};
|
||||
|
||||
let item = vars.templateList.get( 'slug', templateSlug )[0],
|
||||
values = item.values();
|
||||
|
||||
let toggleHeartIcon = function() {
|
||||
|
||||
$favorite.find( '.fa-heart-o' ).toggleClass( 'wpforms-hidden', values.favorite );
|
||||
$favorite.find( '.fa-heart' ).toggleClass( 'wpforms-hidden', ! values.favorite );
|
||||
};
|
||||
|
||||
let unMarkFavorite = function() {
|
||||
|
||||
values.favorite = false;
|
||||
favoritesCount = favoritesCount - 1;
|
||||
|
||||
item.values( values );
|
||||
|
||||
toggleHeartIcon();
|
||||
$templateName.data( 'data-favorite', 0 );
|
||||
$favoritesCount.html( favoritesCount );
|
||||
|
||||
app.maybeHideFavoritesCategory();
|
||||
};
|
||||
|
||||
let markFavorite = function() {
|
||||
|
||||
values.favorite = true;
|
||||
favoritesCount = favoritesCount + 1;
|
||||
|
||||
item.values( values );
|
||||
|
||||
toggleHeartIcon();
|
||||
$templateName.data( 'data-favorite', 1 );
|
||||
$favoritesCount.html( favoritesCount );
|
||||
|
||||
app.maybeHideFavoritesCategory();
|
||||
};
|
||||
|
||||
$.post( wpforms_form_templates.ajaxurl, data, function( res ) {
|
||||
|
||||
if ( ! res.success ) {
|
||||
|
||||
if ( favorite ) {
|
||||
unMarkFavorite();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
markFavorite();
|
||||
}
|
||||
} );
|
||||
|
||||
if ( favorite ) {
|
||||
markFavorite();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
unMarkFavorite();
|
||||
},
|
||||
|
||||
/**
|
||||
* Maybe hide favorites category if there are no templates.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
maybeHideFavoritesCategory: function() {
|
||||
|
||||
let $categoriesList = $( '.wpforms-setup-templates-categories' ),
|
||||
$favoritesCategory = $categoriesList.find( '[data-category=\'favorites\']' ),
|
||||
favoritesCount = parseInt( $favoritesCategory.find( 'span' ).html(), 10 );
|
||||
|
||||
$favoritesCategory.toggleClass( 'wpforms-hidden', ! favoritesCount );
|
||||
|
||||
if ( $favoritesCategory.hasClass( 'active' ) ) {
|
||||
|
||||
if ( ! favoritesCount ) {
|
||||
$categoriesList.find( '[data-category=\'all\']' ).trigger( 'click' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$favoritesCategory.trigger( 'click' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Search template callback.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
searchTemplate: function( e ) {
|
||||
|
||||
app.performSearch( $( this ).val() );
|
||||
app.showUpgradeBanner();
|
||||
},
|
||||
|
||||
/**
|
||||
* Perform search value.
|
||||
*
|
||||
* @since 1.7.7.2
|
||||
*
|
||||
* @param {string} query Value to search.
|
||||
*/
|
||||
performSearch( query ) {
|
||||
const searchResult = vars.templateList.search( query, [ 'name' ], function( searchString ) {
|
||||
for ( let index = 0, length = vars.templateList.items.length; index < length; index++ ) {
|
||||
vars.templateList.items[ index ].found = ( new RegExp( searchString ) ).test( vars.templateList.items[ index ].values()[ 'wpforms-template-name' ].toLowerCase() );
|
||||
}
|
||||
} );
|
||||
|
||||
$( '.wpforms-templates-no-results' ).toggle( ! searchResult.length );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select subcategory.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @param {Object} e Event object.
|
||||
*/
|
||||
selectSubCategory( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
const $item = $( this );
|
||||
const $active = $item.closest( 'ul' ).find( '.active' );
|
||||
const subcategory = $item.data( 'subcategory' );
|
||||
const category = $item.parents( 'li' ).data( 'category' );
|
||||
const searchQuery = $( '#wpforms-setup-template-search' ).val();
|
||||
|
||||
$active.removeClass( 'active' );
|
||||
$item.addClass( 'active' );
|
||||
|
||||
vars.templateList.filter( function( item ) {
|
||||
return category === 'all' || ( item.values().categories.split( ',' ).indexOf( category ) > -1 && item.values().subcategories.split( ',' ).indexOf( subcategory ) > -1 );
|
||||
} );
|
||||
|
||||
if ( searchQuery !== '' ) {
|
||||
app.performSearch( searchQuery );
|
||||
}
|
||||
|
||||
app.showUpgradeBanner();
|
||||
},
|
||||
|
||||
/**
|
||||
* Select category.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {Object} e Event object.
|
||||
*/
|
||||
selectCategory( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
const $item = $( this ).parent(),
|
||||
$active = $item.closest( 'ul' ).find( '.active' ),
|
||||
category = $item.data( 'category' ),
|
||||
searchQuery = $( '#wpforms-setup-template-search' ).val();
|
||||
|
||||
$active.removeClass( 'active' );
|
||||
$item.addClass( 'active' );
|
||||
|
||||
vars.templateList.filter( function( item ) {
|
||||
if ( category === 'available' ) {
|
||||
return item.values()[ 'has-access' ];
|
||||
}
|
||||
|
||||
if ( category === 'favorites' ) {
|
||||
return item.values().favorite;
|
||||
}
|
||||
|
||||
return category === 'all' || item.values().categories.split( ',' ).indexOf( category ) > -1;
|
||||
} );
|
||||
|
||||
if ( searchQuery !== '' ) {
|
||||
app.performSearch( searchQuery );
|
||||
}
|
||||
|
||||
app.showUpgradeBanner();
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel button click routine.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
selectTemplateCancel: function( ) {
|
||||
|
||||
let $template = $( '#wpforms-setup-templates-list' ).find( '.wpforms-template.active' ),
|
||||
$button = $template.find( '.wpforms-template-select' );
|
||||
|
||||
$template.removeClass( 'active' );
|
||||
$button.html( $button.data( 'labelOriginal' ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Show upgrade banner if licence type is less than Pro.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
showUpgradeBanner: function() {
|
||||
|
||||
if ( ! $( '#tmpl-wpforms-templates-upgrade-banner' ).length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
let template = wp.template( 'wpforms-templates-upgrade-banner' );
|
||||
|
||||
if ( ! template ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const $templates = $( '#wpforms-setup-templates-list .wpforms-template' );
|
||||
|
||||
if ( $templates.length > 5 ) {
|
||||
$templates.eq( 5 ).after( template() );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$templates.last().after( template() );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {jQuery} $button Use template button object.
|
||||
* @param {Function} callback The function to set the template.
|
||||
*/
|
||||
selectTemplateProcess: function( formName, template, $button, callback ) {
|
||||
|
||||
if ( $button.data( 'addons' ) ) {
|
||||
app.addonsModal( formName, template, $button, callback );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
callback( formName, template );
|
||||
},
|
||||
|
||||
/**
|
||||
* Open required addons alert.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {jQuery} $button Use template button object.
|
||||
* @param {Function} callback The function to set the template.
|
||||
*/
|
||||
addonsModal: function( formName, template, $button, callback ) {
|
||||
|
||||
const templateName = $button.data( 'template-name-raw' );
|
||||
const addonsNames = $button.data( 'addons-names' );
|
||||
const addonsSlugs = $button.data( 'addons' );
|
||||
const addons = addonsSlugs.split( ',' );
|
||||
let prompt = addons.length > 1 ? wpforms_form_templates.template_addons_prompt : wpforms_form_templates.template_addon_prompt;
|
||||
|
||||
prompt = prompt.replace( /%template%/g, templateName ).replace( /%addons%/g, addonsNames );
|
||||
|
||||
if ( ! addons.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! wpforms_form_templates.can_install_addons ) {
|
||||
app.userCannotInstallAddonsModal( prompt );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.userCanInstallAddonsModal( formName, template, addons, prompt, callback );
|
||||
},
|
||||
|
||||
/**
|
||||
* Open the template addon alert for admins.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {Array} addons Array of addon slugs.
|
||||
* @param {string} prompt Modal content.
|
||||
* @param {Function} callback The function to set the template.
|
||||
*/
|
||||
userCanInstallAddonsModal: function( formName, template, addons, prompt, callback ) {
|
||||
|
||||
const spinner = '<i class="wpforms-loading-spinner wpforms-loading-white wpforms-loading-inline"></i>';
|
||||
|
||||
$.confirm( {
|
||||
title: wpforms_form_templates.heads_up,
|
||||
content: prompt,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_form_templates.install_confirm,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
this.$$confirm
|
||||
.prop( 'disabled', true )
|
||||
.html( spinner + wpforms_form_templates.activating );
|
||||
|
||||
this.$$cancel
|
||||
.prop( 'disabled', true );
|
||||
|
||||
app.installActivateAddons( addons, this, formName, template, callback );
|
||||
|
||||
return false;
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_form_templates.cancel,
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Open the template addon alert for non-admins.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @param {string} prompt Modal content.
|
||||
*/
|
||||
userCannotInstallAddonsModal: function( prompt ) {
|
||||
|
||||
$.alert( {
|
||||
title: wpforms_form_templates.heads_up,
|
||||
content: prompt,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
ok: {
|
||||
text: wpforms_form_templates.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Install & Activate addons via AJAX.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @param {Array} addons Addons slugs.
|
||||
* @param {object} previousModal Previous modal instance.
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {Function} callback The function to set the template.
|
||||
*/
|
||||
installActivateAddons: function( addons, previousModal, formName, template, callback ) {
|
||||
|
||||
const ajaxResults = [];
|
||||
const ajaxErrors = [];
|
||||
let promiseChain = false;
|
||||
|
||||
// Put each of the ajax call promise to the chain.
|
||||
addons.forEach( function( addon ) {
|
||||
|
||||
if ( typeof promiseChain.done !== 'function' ) {
|
||||
promiseChain = app.installActivateAddonAjax( addon );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
promiseChain = promiseChain
|
||||
.done( function( value ) {
|
||||
|
||||
ajaxResults.push( value );
|
||||
|
||||
return app.installActivateAddonAjax( addon );
|
||||
} )
|
||||
.fail( function( error ) {
|
||||
ajaxErrors.push( error );
|
||||
} );
|
||||
} );
|
||||
|
||||
promiseChain
|
||||
|
||||
// Latest promise result and error.
|
||||
.done( function( value ) {
|
||||
ajaxResults.push( value );
|
||||
} )
|
||||
.fail( function( error ) {
|
||||
ajaxErrors.push( error );
|
||||
} )
|
||||
|
||||
// Finally, resolve all the promises.
|
||||
.always( function() {
|
||||
|
||||
previousModal.close();
|
||||
|
||||
if (
|
||||
ajaxResults.length > 0 &&
|
||||
wpf.listPluck( ajaxResults, 'success' ).every( Boolean ) && // Check if every `success` is true.
|
||||
ajaxErrors.length === 0
|
||||
) {
|
||||
callback( formName, template );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.installActivateAddonsError( formName, template, callback );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Install & Activate addons error modal.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
* @param {Function} callback The function to set the template.
|
||||
*/
|
||||
installActivateAddonsError: function( formName, template, callback ) {
|
||||
|
||||
$.confirm( {
|
||||
title: wpforms_form_templates.heads_up,
|
||||
content: wpforms_form_templates.template_addons_error,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_form_templates.use_template,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
callback( formName, template );
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_form_templates.cancel,
|
||||
action: function() {
|
||||
|
||||
app.selectTemplateCancel();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Install & Activate single addon via AJAX.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @param {string} addon Addon slug.
|
||||
*
|
||||
* @returns {Promise} jQuery ajax call promise.
|
||||
*/
|
||||
installActivateAddonAjax: function( addon ) {
|
||||
|
||||
const addonData = wpforms_addons[ addon ];
|
||||
const deferred = new $.Deferred();
|
||||
|
||||
if (
|
||||
! addonData ||
|
||||
[ 'activate', 'install' ].indexOf( addonData.action ) < 0
|
||||
) {
|
||||
deferred.resolve( false );
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
return $.post(
|
||||
wpforms_form_templates.ajaxurl,
|
||||
{
|
||||
action: 'wpforms_' + addonData.action + '_addon',
|
||||
nonce: wpforms_form_templates.admin_nonce,
|
||||
plugin: addonData.action === 'activate' ? addon + '/' + addon + '.php' : addonData.url,
|
||||
}
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsFormTemplates.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/form-templates.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/form-templates.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
10
wp-content/plugins/wpforms-lite/assets/js/components/admin/forms/overview.min.js
vendored
Normal file
10
wp-content/plugins/wpforms-lite/assets/js/components/admin/forms/overview.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,284 @@
|
||||
/* global wpforms_gutenberg_form_selector */
|
||||
/* jshint es3: false, esversion: 6 */
|
||||
|
||||
'use strict';
|
||||
|
||||
const { serverSideRender: ServerSideRender = wp.components.ServerSideRender } = wp;
|
||||
const { createElement, Fragment } = wp.element;
|
||||
const { registerBlockType } = wp.blocks;
|
||||
const { InspectorControls } = wp.blockEditor || wp.editor;
|
||||
const { SelectControl, ToggleControl, PanelBody, Placeholder } = wp.components;
|
||||
const { __ } = wp.i18n;
|
||||
|
||||
const wpformsIcon = createElement( 'svg', { width: 20, height: 20, viewBox: '0 0 612 612', className: 'dashicon' },
|
||||
createElement( 'path', {
|
||||
fill: 'currentColor',
|
||||
d: 'M544,0H68C30.445,0,0,30.445,0,68v476c0,37.556,30.445,68,68,68h476c37.556,0,68-30.444,68-68V68 C612,30.445,581.556,0,544,0z M464.44,68L387.6,120.02L323.34,68H464.44z M288.66,68l-64.26,52.02L147.56,68H288.66z M544,544H68 V68h22.1l136,92.14l79.9-64.6l79.56,64.6l136-92.14H544V544z M114.24,263.16h95.88v-48.28h-95.88V263.16z M114.24,360.4h95.88 v-48.62h-95.88V360.4z M242.76,360.4h255v-48.62h-255V360.4L242.76,360.4z M242.76,263.16h255v-48.28h-255V263.16L242.76,263.16z M368.22,457.3h129.54V408H368.22V457.3z',
|
||||
} )
|
||||
);
|
||||
|
||||
/**
|
||||
* Popup container.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
let $popup = {};
|
||||
|
||||
/**
|
||||
* Close button (inside the form builder) click event.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*
|
||||
* @param {string} clientID Block Client ID.
|
||||
*/
|
||||
const builderCloseButtonEvent = function( clientID ) {
|
||||
|
||||
$popup
|
||||
.off( 'wpformsBuilderInPopupClose' )
|
||||
.on( 'wpformsBuilderInPopupClose', function( e, action, formId, formTitle ) {
|
||||
if ( action !== 'saved' || ! formId ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Insert a new block when a new form is created from the popup to update the form list and attributes.
|
||||
const newBlock = wp.blocks.createBlock( 'wpforms/form-selector', {
|
||||
formId: formId.toString(), // Expects string value, make sure we insert string.
|
||||
} );
|
||||
|
||||
// eslint-disable-next-line camelcase
|
||||
wpforms_gutenberg_form_selector.forms = [ { ID: formId, post_title: formTitle } ];
|
||||
|
||||
// Insert a new block.
|
||||
wp.data.dispatch( 'core/block-editor' ).removeBlock( clientID );
|
||||
wp.data.dispatch( 'core/block-editor' ).insertBlocks( newBlock );
|
||||
|
||||
} );
|
||||
};
|
||||
|
||||
/**
|
||||
* Open builder popup.
|
||||
*
|
||||
* @since 1.6.2
|
||||
*
|
||||
* @param {string} clientID Block Client ID.
|
||||
*/
|
||||
const openBuilderPopup = function( clientID ) {
|
||||
|
||||
if ( jQuery.isEmptyObject( $popup ) ) {
|
||||
let tmpl = jQuery( '#wpforms-gutenberg-popup' );
|
||||
let parent = jQuery( '#wpwrap' );
|
||||
|
||||
parent.after( tmpl );
|
||||
|
||||
$popup = parent.siblings( '#wpforms-gutenberg-popup' );
|
||||
}
|
||||
|
||||
const url = wpforms_gutenberg_form_selector.get_started_url,
|
||||
$iframe = $popup.find( 'iframe' );
|
||||
|
||||
builderCloseButtonEvent( clientID );
|
||||
$iframe.attr( 'src', url );
|
||||
$popup.fadeIn();
|
||||
};
|
||||
|
||||
const hasForms = function() {
|
||||
return wpforms_gutenberg_form_selector.forms.length > 0;
|
||||
};
|
||||
|
||||
registerBlockType( 'wpforms/form-selector', {
|
||||
title: wpforms_gutenberg_form_selector.strings.title,
|
||||
description: wpforms_gutenberg_form_selector.strings.description,
|
||||
icon: wpformsIcon,
|
||||
keywords: wpforms_gutenberg_form_selector.strings.form_keywords,
|
||||
category: 'widgets',
|
||||
attributes: {
|
||||
formId: {
|
||||
type: 'string',
|
||||
},
|
||||
displayTitle: {
|
||||
type: 'boolean',
|
||||
},
|
||||
displayDesc: {
|
||||
type: 'boolean',
|
||||
},
|
||||
preview: {
|
||||
type: 'boolean',
|
||||
},
|
||||
},
|
||||
example: {
|
||||
attributes: {
|
||||
preview: true,
|
||||
},
|
||||
},
|
||||
supports: {
|
||||
customClassName: hasForms(),
|
||||
},
|
||||
edit( props ) { // eslint-disable-line max-lines-per-function
|
||||
const { attributes: { formId = '', displayTitle = false, displayDesc = false, preview = false }, setAttributes } = props;
|
||||
const formOptions = wpforms_gutenberg_form_selector.forms.map( value => (
|
||||
{ value: value.ID, label: value.post_title }
|
||||
) );
|
||||
|
||||
const strings = wpforms_gutenberg_form_selector.strings;
|
||||
let jsx;
|
||||
|
||||
formOptions.unshift( { value: '', label: wpforms_gutenberg_form_selector.strings.form_select } );
|
||||
|
||||
function selectForm( value ) { // eslint-disable-line jsdoc/require-jsdoc
|
||||
setAttributes( { formId: value } );
|
||||
}
|
||||
|
||||
function toggleDisplayTitle( value ) { // eslint-disable-line jsdoc/require-jsdoc
|
||||
setAttributes( { displayTitle: value } );
|
||||
}
|
||||
|
||||
function toggleDisplayDesc( value ) { // eslint-disable-line jsdoc/require-jsdoc
|
||||
setAttributes( { displayDesc: value } );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get block empty JSX code.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*
|
||||
* @param {object} props Block properties.
|
||||
* @returns {JSX.Element} Block empty JSX code.
|
||||
*/
|
||||
function getEmptyFormsPreview( props ) {
|
||||
|
||||
const clientId = props.clientId;
|
||||
|
||||
return (
|
||||
<Fragment
|
||||
key="wpforms-gutenberg-form-selector-fragment-block-empty">
|
||||
<div className="wpforms-no-form-preview">
|
||||
<img src={ wpforms_gutenberg_form_selector.block_empty_url } />
|
||||
<p dangerouslySetInnerHTML={{ __html: strings.wpforms_empty_info }}></p>
|
||||
<button type="button" className="get-started-button components-button is-button is-primary"
|
||||
onClick={
|
||||
() => {
|
||||
openBuilderPopup( clientId );
|
||||
}
|
||||
}
|
||||
>
|
||||
{ __( 'Get Started', 'wpforms-lite' ) }
|
||||
</button>
|
||||
<p className="empty-desc" dangerouslySetInnerHTML={{ __html: strings.wpforms_empty_help }}></p>
|
||||
|
||||
{/* Template for popup with builder iframe */}
|
||||
<div id="wpforms-gutenberg-popup" className="wpforms-builder-popup">
|
||||
<iframe src="about:blank" width="100%" height="100%" id="wpforms-builder-iframe"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print empty forms notice.
|
||||
*
|
||||
* @since 1.8.3
|
||||
*
|
||||
* @param {string} clientId Block client ID.
|
||||
*
|
||||
* @returns {JSX.Element} Field styles JSX code.
|
||||
*/
|
||||
function printEmptyFormsNotice( clientId ) {
|
||||
return (
|
||||
<InspectorControls key="wpforms-gutenberg-form-selector-inspector-main-settings">
|
||||
<PanelBody className="wpforms-gutenberg-panel" title={ strings.form_settings }>
|
||||
<p className="wpforms-gutenberg-panel-notice wpforms-warning wpforms-empty-form-notice" style={{ display: 'block' }}>
|
||||
<strong>{ __( 'You haven’t created a form, yet!', 'wpforms-lite' ) }</strong>
|
||||
{ __( 'What are you waiting for?', 'wpforms-lite' ) }
|
||||
</p>
|
||||
<button type="button" className="get-started-button components-button is-button is-secondary"
|
||||
onClick={
|
||||
() => {
|
||||
openBuilderPopup( clientId );
|
||||
}
|
||||
}
|
||||
>
|
||||
{ __( 'Get Started', 'wpforms-lite' ) }
|
||||
</button>
|
||||
</PanelBody>
|
||||
</InspectorControls>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if ( ! hasForms() ) {
|
||||
|
||||
jsx = [ printEmptyFormsNotice( props.clientId ) ];
|
||||
|
||||
jsx.push( getEmptyFormsPreview( props ) );
|
||||
return jsx;
|
||||
}
|
||||
|
||||
jsx = [
|
||||
<InspectorControls key="wpforms-gutenberg-form-selector-inspector-controls">
|
||||
<PanelBody title={ wpforms_gutenberg_form_selector.strings.form_settings }>
|
||||
<SelectControl
|
||||
label={ wpforms_gutenberg_form_selector.strings.form_selected }
|
||||
value={ formId }
|
||||
options={ formOptions }
|
||||
onChange={ selectForm }
|
||||
/>
|
||||
<ToggleControl
|
||||
label={ wpforms_gutenberg_form_selector.strings.show_title }
|
||||
checked={ displayTitle }
|
||||
onChange={ toggleDisplayTitle }
|
||||
/>
|
||||
<ToggleControl
|
||||
label={ wpforms_gutenberg_form_selector.strings.show_description }
|
||||
checked={ displayDesc }
|
||||
onChange={ toggleDisplayDesc }
|
||||
/>
|
||||
<p className="wpforms-gutenberg-panel-notice">
|
||||
<strong>{ strings.update_wp_notice_head }</strong>
|
||||
{ strings.update_wp_notice_text } <a href={strings.update_wp_notice_link} rel="noreferrer" target="_blank">{ strings.learn_more }</a>
|
||||
</p>
|
||||
|
||||
</PanelBody>
|
||||
</InspectorControls>,
|
||||
];
|
||||
|
||||
if ( formId ) {
|
||||
jsx.push(
|
||||
<ServerSideRender
|
||||
key="wpforms-gutenberg-form-selector-server-side-renderer"
|
||||
block="wpforms/form-selector"
|
||||
attributes={ props.attributes }
|
||||
/>
|
||||
);
|
||||
} else if ( preview ) {
|
||||
jsx.push(
|
||||
<Fragment
|
||||
key="wpforms-gutenberg-form-selector-fragment-block-preview">
|
||||
<img src={ wpforms_gutenberg_form_selector.block_preview_url } style={{ width: '100%' }}/>
|
||||
</Fragment>
|
||||
);
|
||||
} else {
|
||||
jsx.push(
|
||||
<Placeholder
|
||||
key="wpforms-gutenberg-form-selector-wrap"
|
||||
className="wpforms-gutenberg-form-selector-wrap">
|
||||
<img src={ wpforms_gutenberg_form_selector.logo_url }/>
|
||||
<h3>{ wpforms_gutenberg_form_selector.strings.title }</h3>
|
||||
<SelectControl
|
||||
key="wpforms-gutenberg-form-selector-select-control"
|
||||
value={ formId }
|
||||
options={ formOptions }
|
||||
onChange={ selectForm }
|
||||
/>
|
||||
</Placeholder>
|
||||
);
|
||||
}
|
||||
|
||||
return jsx;
|
||||
},
|
||||
save() {
|
||||
return null;
|
||||
},
|
||||
} );
|
File diff suppressed because one or more lines are too long
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/gutenberg/formselector.es5.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/gutenberg/formselector.es5.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,122 @@
|
||||
/* global wpforms_admin */
|
||||
|
||||
/**
|
||||
* Logger scripts
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsLogger = window.WPFormsLogger || ( function( document, window, $ ) {
|
||||
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
ready: function() {
|
||||
|
||||
$( app.bindPopup() );
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind popup to the click on logger link.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*/
|
||||
bindPopup: function() {
|
||||
|
||||
$( '.wpforms-list-table--logs .wp-list-table' ).on( 'click', '.js-single-log-target', function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
app.showPopup( $( this ).attr( 'data-log-id' ) );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Show popup.
|
||||
*
|
||||
* @since 1.6.3
|
||||
*
|
||||
* @param {numeric} recordId Record Id.
|
||||
*/
|
||||
showPopup: function( recordId ) {
|
||||
|
||||
if ( ! recordId ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var popupTemplate = wp.template( 'wpforms-log-record' );
|
||||
|
||||
$.dialog( {
|
||||
title: false,
|
||||
boxWidth: Math.min( 1200, $( window ).width() * 0.8 ),
|
||||
content: function() {
|
||||
|
||||
var self = this;
|
||||
|
||||
return $.get(
|
||||
wpforms_admin.ajax_url,
|
||||
{
|
||||
action: 'wpforms_get_log_record',
|
||||
nonce: wpforms_admin.nonce,
|
||||
recordId: recordId,
|
||||
}
|
||||
).done( function( res ) {
|
||||
|
||||
if ( ! res.success || ! res.data ) {
|
||||
app.error( res.data );
|
||||
self.close();
|
||||
|
||||
return;
|
||||
}
|
||||
self.setContent( popupTemplate( res.data ) );
|
||||
|
||||
} ).fail( function( xhr, textStatus, e ) {
|
||||
|
||||
app.error( textStatus + ' ' + xhr.responseText );
|
||||
self.close();
|
||||
} );
|
||||
},
|
||||
animation: 'scale',
|
||||
columnClass: 'medium',
|
||||
closeIcon: true,
|
||||
closeAnimation: 'scale',
|
||||
backgroundDismiss: true,
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Output error to the console if debug mode is on.
|
||||
*
|
||||
* @since 1.6.4
|
||||
*
|
||||
* @param {string} msg Error text.
|
||||
*/
|
||||
error: function( msg ) {
|
||||
|
||||
if ( ! wpforms_admin.debug ) {
|
||||
return;
|
||||
}
|
||||
|
||||
msg = _.isEmpty( msg ) ? '' : ': ' + msg;
|
||||
console.log( 'WPForms Debug: Error receiving log record data' + msg );
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsLogger.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/logger/logger.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/logger/logger.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPFormsLogger=window.WPFormsLogger||function(t,e){var i={init:function(){e(i.ready)},ready:function(){e(i.bindPopup())},bindPopup:function(){e(".wpforms-list-table--logs .wp-list-table").on("click",".js-single-log-target",function(o){o.preventDefault(),i.showPopup(e(this).attr("data-log-id"))})},showPopup:function(o){var n;o&&(n=wp.template("wpforms-log-record"),e.dialog({title:!1,boxWidth:Math.min(1200,.8*e(t).width()),content:function(){var r=this;return e.get(wpforms_admin.ajax_url,{action:"wpforms_get_log_record",nonce:wpforms_admin.nonce,recordId:o}).done(function(o){o.success&&o.data?r.setContent(n(o.data)):(i.error(o.data),r.close())}).fail(function(o,n,t){i.error(n+" "+o.responseText),r.close()})},animation:"scale",columnClass:"medium",closeIcon:!0,closeAnimation:"scale",backgroundDismiss:!0}))},error:function(o){wpforms_admin.debug&&(o=_.isEmpty(o)?"":": "+o,console.log("WPForms Debug: Error receiving log record data"+o))}};return i}((document,window),jQuery);WPFormsLogger.init();
|
@@ -0,0 +1,89 @@
|
||||
/* global wpforms_admin_notices */
|
||||
|
||||
/**
|
||||
* WPForms Dismissible Notices.
|
||||
*
|
||||
* @since 1.6.7.1
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsAdminNotices = window.WPFormsAdminNotices || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.6.7.1
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.6.7.1
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.6.7.1
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Dismissible notices events.
|
||||
*
|
||||
* @since 1.6.7.1
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
$( document ).on(
|
||||
'click',
|
||||
'.wpforms-notice .notice-dismiss, .wpforms-notice .wpforms-notice-dismiss',
|
||||
app.dismissNotice
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Dismiss notice event handler.
|
||||
*
|
||||
* @since 1.6.7.1
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
* */
|
||||
dismissNotice: function( e ) {
|
||||
|
||||
const $element = $( e.target );
|
||||
|
||||
if ( ! $element.hasClass( 'wpforms-review-out' ) ) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
$element.closest( '.wpforms-notice' ).remove();
|
||||
|
||||
$.post(
|
||||
wpforms_admin_notices.ajax_url,
|
||||
{
|
||||
action: 'wpforms_notice_dismiss',
|
||||
nonce: wpforms_admin_notices.nonce,
|
||||
id: ( $element.closest( '.wpforms-notice' ).attr( 'id' ) || '' ).replace( 'wpforms-notice-', '' ),
|
||||
}
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsAdminNotices.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/notices.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/notices.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPFormsAdminNotices=window.WPFormsAdminNotices||function(i,s){var o={init:function(){s(o.ready)},ready:function(){o.events()},events:function(){s(i).on("click",".wpforms-notice .notice-dismiss, .wpforms-notice .wpforms-notice-dismiss",o.dismissNotice)},dismissNotice:function(i){var o=s(i.target);o.hasClass("wpforms-review-out")||i.preventDefault(),o.closest(".wpforms-notice").remove(),s.post(wpforms_admin_notices.ajax_url,{action:"wpforms_notice_dismiss",nonce:wpforms_admin_notices.nonce,id:(o.closest(".wpforms-notice").attr("id")||"").replace("wpforms-notice-","")})}};return o}(document,(window,jQuery));WPFormsAdminNotices.init();
|
@@ -0,0 +1,218 @@
|
||||
/* global wpforms_admin, WPFormsFormTemplates, wpforms_admin_form_templates */
|
||||
|
||||
/**
|
||||
* Admin Sub-page Form Templates function.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsAdminFormTemplates = window.WPFormsAdminFormTemplates || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
let app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind events.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
$( '.wpforms-form-setup-content' )
|
||||
.on( 'keyup', '#wpforms-setup-template-search', WPFormsFormTemplates.searchTemplate )
|
||||
.on( 'click', '.wpforms-setup-templates-categories li div', WPFormsFormTemplates.selectCategory )
|
||||
.on( 'click', '.wpforms-setup-templates-subcategories li', WPFormsFormTemplates.selectSubCategory )
|
||||
.on( 'click', '.wpforms-template-select', app.selectTemplate )
|
||||
.on( 'click', '.wpforms-trigger-blank', app.selectBlankTemplate );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
selectTemplate: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
let $button = $( this ),
|
||||
spinner = '<i class="wpforms-loading-spinner wpforms-loading-white wpforms-loading-inline"></i>';
|
||||
|
||||
// Don't do anything for templates that trigger education modal OR addons-modal.
|
||||
if ( $button.hasClass( 'education-modal' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$( '.wpforms-form-setup-content' ).find( '.wpforms-template' ).removeClass( 'active' );
|
||||
$button.closest( '.wpforms-template' ).addClass( 'active' );
|
||||
|
||||
// Save original label.
|
||||
$button.data( 'labelOriginal', $button.html() );
|
||||
|
||||
// Display loading indicator.
|
||||
$button.html( spinner + wpforms_admin.loading );
|
||||
|
||||
WPFormsFormTemplates.selectTemplateProcess( $button.data( 'template-name-raw' ), $button.data( 'template' ), $button, app.selectTemplateProcessAjax );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select Blank template.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {object} e Event object.
|
||||
*/
|
||||
selectBlankTemplate: function( e ) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
app.selectTemplateProcessAjax( 'Blank Form', 'blank' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template. Create or update form AJAX call.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {string} formName Name of the form.
|
||||
* @param {string} template Template slug.
|
||||
*/
|
||||
selectTemplateProcessAjax: function( formName, template ) {
|
||||
|
||||
let data = {
|
||||
title: formName,
|
||||
action: 'wpforms_new_form',
|
||||
template: template,
|
||||
// eslint-disable-next-line camelcase
|
||||
form_id: 0,
|
||||
nonce: wpforms_admin_form_templates.nonce,
|
||||
};
|
||||
|
||||
$.post( wpforms_admin.ajax_url, data )
|
||||
.done( function( res ) {
|
||||
|
||||
if ( res.success ) {
|
||||
window.location.href = res.data.redirect;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( res.data.error_type === 'invalid_template' ) {
|
||||
app.selectTemplateProcessInvalidTemplateError( res.data.message, formName );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.selectTemplateProcessError( res.data.message );
|
||||
} )
|
||||
.fail( function( xhr, textStatus, e ) {
|
||||
|
||||
app.selectTemplateProcessError( '' );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template AJAX call error modal for invalid template using.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {string} errorMessage Error message.
|
||||
* @param {string} formName Name of the form.
|
||||
*/
|
||||
selectTemplateProcessInvalidTemplateError: function( errorMessage, formName ) {
|
||||
|
||||
$.alert( {
|
||||
title: wpforms_admin.heads_up,
|
||||
content: errorMessage,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
boxWidth: '600px',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_admin.use_simple_contact_form,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
app.selectTemplateProcessAjax( formName, 'simple-contact-form-template' );
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_admin.cancel,
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Select template AJAX call error modal.
|
||||
*
|
||||
* @since 1.7.7
|
||||
*
|
||||
* @param {string} error Error message.
|
||||
*/
|
||||
selectTemplateProcessError: function( error ) {
|
||||
|
||||
var content = error && error.length ? '<p>' + error + '</p>' : '';
|
||||
|
||||
$.alert( {
|
||||
title: wpforms_admin.heads_up,
|
||||
content: wpforms_admin.error_select_template + content,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_admin.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: function() {
|
||||
|
||||
WPFormsFormTemplates.selectTemplateCancel();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsAdminFormTemplates.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/pages/form-templates.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/pages/form-templates.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPFormsAdminFormTemplates=window.WPFormsAdminFormTemplates||function(a,s){let o={init:function(){s(o.ready)},ready:function(){o.events()},events:function(){s(".wpforms-form-setup-content").on("keyup","#wpforms-setup-template-search",WPFormsFormTemplates.searchTemplate).on("click",".wpforms-setup-templates-categories li div",WPFormsFormTemplates.selectCategory).on("click",".wpforms-setup-templates-subcategories li",WPFormsFormTemplates.selectSubCategory).on("click",".wpforms-template-select",o.selectTemplate).on("click",".wpforms-trigger-blank",o.selectBlankTemplate)},selectTemplate:function(e){e.preventDefault();e=s(this);e.hasClass("education-modal")||(s(".wpforms-form-setup-content").find(".wpforms-template").removeClass("active"),e.closest(".wpforms-template").addClass("active"),e.data("labelOriginal",e.html()),e.html('<i class="wpforms-loading-spinner wpforms-loading-white wpforms-loading-inline"></i>'+wpforms_admin.loading),WPFormsFormTemplates.selectTemplateProcess(e.data("template-name-raw"),e.data("template"),e,o.selectTemplateProcessAjax))},selectBlankTemplate:function(e){e.preventDefault(),o.selectTemplateProcessAjax("Blank Form","blank")},selectTemplateProcessAjax:function(t,e){e={title:t,action:"wpforms_new_form",template:e,form_id:0,nonce:wpforms_admin_form_templates.nonce};s.post(wpforms_admin.ajax_url,e).done(function(e){e.success?a.location.href=e.data.redirect:"invalid_template"===e.data.error_type?o.selectTemplateProcessInvalidTemplateError(e.data.message,t):o.selectTemplateProcessError(e.data.message)}).fail(function(e,t,a){o.selectTemplateProcessError("")})},selectTemplateProcessInvalidTemplateError:function(e,t){s.alert({title:wpforms_admin.heads_up,content:e,icon:"fa fa-exclamation-circle",type:"orange",boxWidth:"600px",buttons:{confirm:{text:wpforms_admin.use_simple_contact_form,btnClass:"btn-confirm",keys:["enter"],action:function(){o.selectTemplateProcessAjax(t,"simple-contact-form-template")}},cancel:{text:wpforms_admin.cancel,action:function(){WPFormsFormTemplates.selectTemplateCancel()}}}})},selectTemplateProcessError:function(e){e=e&&e.length?"<p>"+e+"</p>":"";s.alert({title:wpforms_admin.heads_up,content:wpforms_admin.error_select_template+e,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action:function(){WPFormsFormTemplates.selectTemplateCancel()}}}})}};return o}((document,window),jQuery);WPFormsAdminFormTemplates.init();
|
@@ -0,0 +1,259 @@
|
||||
/* global wpforms_pluginlanding, wpforms_admin */
|
||||
|
||||
/**
|
||||
* Analytics Sub-page.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsPagesAnalytics = window.WPFormsPagesAnalytics || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var el = {};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.initVars();
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Init variables.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
initVars: function() {
|
||||
|
||||
el = {
|
||||
$stepInstall: $( 'section.step-install' ),
|
||||
$stepInstallNum: $( 'section.step-install .num img' ),
|
||||
$stepSetup: $( 'section.step-setup' ),
|
||||
$stepSetupNum: $( 'section.step-setup .num img' ),
|
||||
$stepAddon: $( 'section.step-addon' ),
|
||||
$stepAddonNum: $( 'section.step-addon .num img' ),
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Register JS events.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
// Step 'Install' button click.
|
||||
el.$stepInstall.on( 'click', 'button', app.stepInstallClick );
|
||||
|
||||
// Step 'Setup' button click.
|
||||
el.$stepSetup.on( 'click', 'button', app.gotoURL );
|
||||
|
||||
// Step 'Addon' button click.
|
||||
el.$stepAddon.on( 'click', 'button', app.gotoURL );
|
||||
},
|
||||
|
||||
/**
|
||||
* Step 'Install' button click.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
*/
|
||||
stepInstallClick: function() {
|
||||
|
||||
var $btn = $( this ),
|
||||
action = $btn.attr( 'data-action' ),
|
||||
plugin = $btn.attr( 'data-plugin' ),
|
||||
ajaxAction = '';
|
||||
|
||||
if ( $btn.hasClass( 'disabled' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( action ) {
|
||||
case 'activate':
|
||||
ajaxAction = 'wpforms_activate_addon';
|
||||
$btn.text( wpforms_pluginlanding.activating );
|
||||
break;
|
||||
|
||||
case 'install':
|
||||
ajaxAction = 'wpforms_install_addon';
|
||||
$btn.text( wpforms_pluginlanding.installing );
|
||||
break;
|
||||
|
||||
case 'goto-url':
|
||||
window.location.href = $btn.attr( 'data-url' );
|
||||
return;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
$btn.addClass( 'disabled' );
|
||||
app.showSpinner( el.$stepInstallNum );
|
||||
|
||||
var data = {
|
||||
action: ajaxAction,
|
||||
nonce : wpforms_admin.nonce,
|
||||
plugin: plugin,
|
||||
type : 'plugin',
|
||||
};
|
||||
$.post( wpforms_admin.ajax_url, data )
|
||||
.done( function( res ) {
|
||||
app.stepInstallDone( res, $btn, action );
|
||||
} )
|
||||
.always( function() {
|
||||
app.hideSpinner( el.$stepInstallNum );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Done part of the step 'Install'.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {object} res Result of $.post() query.
|
||||
* @param {jQuery} $btn Button.
|
||||
* @param {string} action Action (for more info look at the app.stepInstallClick() function).
|
||||
*/
|
||||
stepInstallDone: function( res, $btn, action ) {
|
||||
|
||||
var success = 'install' === action ? res.success && res.data.is_activated : res.success;
|
||||
|
||||
if ( success ) {
|
||||
el.$stepInstallNum.attr( 'src', el.$stepInstallNum.attr( 'src' ).replace( 'step-1.', 'step-complete.' ) );
|
||||
$btn.addClass( 'grey' ).removeClass( 'button-primary' ).text( wpforms_pluginlanding.activated );
|
||||
app.stepInstallPluginStatus();
|
||||
} else {
|
||||
var activationFail = ( 'install' === action && res.success && ! res.data.is_activated ) || 'activate' === action,
|
||||
url = ! activationFail ? wpforms_pluginlanding.mi_manual_install_url : wpforms_pluginlanding.mi_manual_activate_url,
|
||||
msg = ! activationFail ? wpforms_pluginlanding.error_could_not_install : wpforms_pluginlanding.error_could_not_activate,
|
||||
btn = ! activationFail ? wpforms_pluginlanding.download_now : wpforms_pluginlanding.plugins_page;
|
||||
|
||||
$btn.removeClass( 'grey disabled' ).text( btn ).attr( 'data-action', 'goto-url' ).attr( 'data-url', url );
|
||||
$btn.after( '<p class="error">' + msg + '</p>' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback for step 'Install' completion.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
stepInstallPluginStatus: function() {
|
||||
|
||||
var data = {
|
||||
action: 'wpforms_analytics_page_check_plugin_status',
|
||||
nonce : wpforms_admin.nonce,
|
||||
};
|
||||
$.post( wpforms_admin.ajax_url, data ).done( app.stepInstallPluginStatusDone );
|
||||
},
|
||||
|
||||
/**
|
||||
* Done part of the callback for step 'Install' completion.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {object} res Result of $.post() query.
|
||||
*/
|
||||
stepInstallPluginStatusDone: function( res ) {
|
||||
|
||||
if ( ! res.success ) {
|
||||
return;
|
||||
}
|
||||
|
||||
el.$stepSetup.removeClass( 'grey' );
|
||||
el.$stepSetupBtn = el.$stepSetup.find( 'button' );
|
||||
|
||||
if ( res.data.setup_status > 0 ) {
|
||||
el.$stepSetupNum.attr( 'src', el.$stepSetupNum.attr( 'src' ).replace( 'step-2.svg', 'step-complete.svg' ) );
|
||||
el.$stepAddon.removeClass( 'grey' );
|
||||
el.$stepAddon.find( 'button' ).attr( 'data-url', res.data.step3_button_url ).removeClass( 'grey disabled' ).addClass( 'button-primary' );
|
||||
|
||||
if ( res.data.license_level === 'pro' ) {
|
||||
var buttonText = res.data.addon_installed > 0 ? wpforms_pluginlanding.activate_now : wpforms_pluginlanding.install_now;
|
||||
el.$stepAddon.find( 'button' ).text( buttonText );
|
||||
}
|
||||
} else {
|
||||
el.$stepSetupBtn.removeClass( 'grey disabled' ).addClass( 'button-primary' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Go to URL by click on the button.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
gotoURL: function() {
|
||||
|
||||
var $btn = $( this );
|
||||
|
||||
if ( $btn.hasClass( 'disabled' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.location.href = $btn.attr( 'data-url' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Display spinner.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {jQuery} $el Section number image jQuery object.
|
||||
*/
|
||||
showSpinner: function( $el ) {
|
||||
|
||||
$el.siblings( '.loader' ).removeClass( 'hidden' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide spinner.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {jQuery} $el Section number image jQuery object.
|
||||
*/
|
||||
hideSpinner: function( $el ) {
|
||||
|
||||
$el.siblings( '.loader' ).addClass( 'hidden' );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsPagesAnalytics.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/pages/mi-analytics.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/pages/mi-analytics.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPFormsPagesAnalytics=window.WPFormsPagesAnalytics||function(e,l){var i={},o={init:function(){l(o.ready)},ready:function(){o.initVars(),o.events()},initVars:function(){i={$stepInstall:l("section.step-install"),$stepInstallNum:l("section.step-install .num img"),$stepSetup:l("section.step-setup"),$stepSetupNum:l("section.step-setup .num img"),$stepAddon:l("section.step-addon"),$stepAddonNum:l("section.step-addon .num img")}},events:function(){i.$stepInstall.on("click","button",o.stepInstallClick),i.$stepSetup.on("click","button",o.gotoURL),i.$stepAddon.on("click","button",o.gotoURL)},stepInstallClick:function(){var n=l(this),s=n.attr("data-action"),t=n.attr("data-plugin"),a="";if(!n.hasClass("disabled")){switch(s){case"activate":a="wpforms_activate_addon",n.text(wpforms_pluginlanding.activating);break;case"install":a="wpforms_install_addon",n.text(wpforms_pluginlanding.installing);break;case"goto-url":return void(e.location.href=n.attr("data-url"));default:return}n.addClass("disabled"),o.showSpinner(i.$stepInstallNum);t={action:a,nonce:wpforms_admin.nonce,plugin:t,type:"plugin"};l.post(wpforms_admin.ajax_url,t).done(function(t){o.stepInstallDone(t,n,s)}).always(function(){o.hideSpinner(i.$stepInstallNum)})}},stepInstallDone:function(t,n,s){var a;("install"===s?t.success&&t.data.is_activated:t.success)?(i.$stepInstallNum.attr("src",i.$stepInstallNum.attr("src").replace("step-1.","step-complete.")),n.addClass("grey").removeClass("button-primary").text(wpforms_pluginlanding.activated),o.stepInstallPluginStatus()):(s=(t="install"===s&&t.success&&!t.data.is_activated||"activate"===s)?wpforms_pluginlanding.mi_manual_activate_url:wpforms_pluginlanding.mi_manual_install_url,a=t?wpforms_pluginlanding.error_could_not_activate:wpforms_pluginlanding.error_could_not_install,t=t?wpforms_pluginlanding.plugins_page:wpforms_pluginlanding.download_now,n.removeClass("grey disabled").text(t).attr("data-action","goto-url").attr("data-url",s),n.after('<p class="error">'+a+"</p>"))},stepInstallPluginStatus:function(){var t={action:"wpforms_analytics_page_check_plugin_status",nonce:wpforms_admin.nonce};l.post(wpforms_admin.ajax_url,t).done(o.stepInstallPluginStatusDone)},stepInstallPluginStatusDone:function(t){t.success&&(i.$stepSetup.removeClass("grey"),i.$stepSetupBtn=i.$stepSetup.find("button"),0<t.data.setup_status?(i.$stepSetupNum.attr("src",i.$stepSetupNum.attr("src").replace("step-2.svg","step-complete.svg")),i.$stepAddon.removeClass("grey"),i.$stepAddon.find("button").attr("data-url",t.data.step3_button_url).removeClass("grey disabled").addClass("button-primary"),"pro"===t.data.license_level&&(t=0<t.data.addon_installed?wpforms_pluginlanding.activate_now:wpforms_pluginlanding.install_now,i.$stepAddon.find("button").text(t))):i.$stepSetupBtn.removeClass("grey disabled").addClass("button-primary"))},gotoURL:function(){var t=l(this);t.hasClass("disabled")||(e.location.href=t.attr("data-url"))},showSpinner:function(t){t.siblings(".loader").removeClass("hidden")},hideSpinner:function(t){t.siblings(".loader").addClass("hidden")}};return o}((document,window),jQuery);WPFormsPagesAnalytics.init();
|
@@ -0,0 +1,254 @@
|
||||
/* global wpforms_pluginlanding, wpforms_admin */
|
||||
|
||||
/**
|
||||
* SMTP Sub-page.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var WPFormsPagesSMTP = window.WPFormsPagesSMTP || ( function( document, window, $ ) {
|
||||
|
||||
/**
|
||||
* Elements.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var el = {};
|
||||
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
var app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
ready: function() {
|
||||
|
||||
app.initVars();
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Init variables.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
initVars: function() {
|
||||
|
||||
el = {
|
||||
$stepInstall: $( 'section.step-install' ),
|
||||
$stepInstallNum: $( 'section.step-install .num img' ),
|
||||
$stepSetup: $( 'section.step-setup' ),
|
||||
$stepSetupNum: $( 'section.step-setup .num img' ),
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Register JS events.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
events: function() {
|
||||
|
||||
// Step 'Install' button click.
|
||||
el.$stepInstall.on( 'click', 'button', app.stepInstallClick );
|
||||
|
||||
// Step 'Setup' button click.
|
||||
el.$stepSetup.on( 'click', 'button', app.gotoURL );
|
||||
},
|
||||
|
||||
/**
|
||||
* Step 'Install' button click.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
stepInstallClick: function() {
|
||||
|
||||
var $btn = $( this ),
|
||||
action = $btn.attr( 'data-action' ),
|
||||
plugin = $btn.attr( 'data-plugin' ),
|
||||
ajaxAction = '';
|
||||
|
||||
if ( $btn.hasClass( 'disabled' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( action ) {
|
||||
case 'activate':
|
||||
ajaxAction = 'wpforms_activate_addon';
|
||||
$btn.text( wpforms_pluginlanding.activating );
|
||||
break;
|
||||
|
||||
case 'install':
|
||||
ajaxAction = 'wpforms_install_addon';
|
||||
$btn.text( wpforms_pluginlanding.installing );
|
||||
break;
|
||||
|
||||
case 'goto-url':
|
||||
window.location.href = $btn.attr( 'data-url' );
|
||||
return;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
$btn.addClass( 'disabled' );
|
||||
app.showSpinner( el.$stepInstallNum );
|
||||
|
||||
var data = {
|
||||
action: ajaxAction,
|
||||
nonce : wpforms_admin.nonce,
|
||||
plugin: plugin,
|
||||
type : 'plugin',
|
||||
};
|
||||
$.post( wpforms_admin.ajax_url, data )
|
||||
.done( function( res ) {
|
||||
app.stepInstallDone( res, $btn, action );
|
||||
} )
|
||||
.always( function() {
|
||||
app.hideSpinner( el.$stepInstallNum );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Done part of the 'Install' step.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {object} res Result of $.post() query.
|
||||
* @param {jQuery} $btn Button.
|
||||
* @param {string} action Action (for more info look at the app.stepInstallClick() function).
|
||||
*/
|
||||
stepInstallDone: function( res, $btn, action ) {
|
||||
|
||||
var success = 'install' === action ? res.success && res.data.is_activated : res.success;
|
||||
|
||||
if ( success ) {
|
||||
el.$stepInstallNum.attr( 'src', el.$stepInstallNum.attr( 'src' ).replace( 'step-1.', 'step-complete.' ) );
|
||||
$btn.addClass( 'grey' ).removeClass( 'button-primary' ).text( wpforms_pluginlanding.activated );
|
||||
app.stepInstallPluginStatus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var activationFail = ( 'install' === action && res.success && ! res.data.is_activated ) || 'activate' === action,
|
||||
url = ! activationFail ? wpforms_pluginlanding.manual_install_url : wpforms_pluginlanding.manual_activate_url,
|
||||
msg = ! activationFail ? wpforms_pluginlanding.error_could_not_install : wpforms_pluginlanding.error_could_not_activate,
|
||||
btn = ! activationFail ? wpforms_pluginlanding.download_now : wpforms_pluginlanding.plugins_page;
|
||||
|
||||
$btn.removeClass( 'grey disabled' ).text( btn ).attr( 'data-action', 'goto-url' ).attr( 'data-url', url );
|
||||
$btn.after( '<p class="error">' + msg + '</p>' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback for step 'Install' completion.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
stepInstallPluginStatus: function() {
|
||||
|
||||
var data = {
|
||||
action: 'wpforms_smtp_page_check_plugin_status',
|
||||
nonce : wpforms_admin.nonce,
|
||||
};
|
||||
|
||||
$.post( wpforms_admin.ajax_url, data )
|
||||
.done( app.stepInstallPluginStatusDone );
|
||||
},
|
||||
|
||||
/**
|
||||
* Done part of the callback for step 'Install' completion.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {object} res Result of $.post() query.
|
||||
*/
|
||||
stepInstallPluginStatusDone: function( res ) {
|
||||
|
||||
if ( ! res.success ) {
|
||||
return;
|
||||
}
|
||||
|
||||
el.$stepSetup.removeClass( 'grey' );
|
||||
el.$stepSetupBtn = el.$stepSetup.find( 'button' );
|
||||
el.$stepSetupBtn.removeClass( 'grey disabled' ).addClass( 'button-primary' );
|
||||
|
||||
if ( res.data.setup_status > 0 ) {
|
||||
el.$stepSetupNum.attr( 'src', el.$stepSetupNum.attr( 'src' ).replace( 'step-2.svg', 'step-complete.svg' ) );
|
||||
el.$stepSetupBtn.attr( 'data-url', wpforms_pluginlanding.smtp_settings_url ).text( wpforms_pluginlanding.smtp_settings );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
el.$stepSetupBtn.attr( 'data-url', wpforms_pluginlanding.smtp_wizard_url ).text( wpforms_pluginlanding.smtp_wizard );
|
||||
},
|
||||
|
||||
/**
|
||||
* Go to URL by click on the button.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*/
|
||||
gotoURL: function() {
|
||||
|
||||
var $btn = $( this );
|
||||
|
||||
if ( $btn.hasClass( 'disabled' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.location.href = $btn.attr( 'data-url' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Display spinner.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {jQuery} $el Section number image jQuery object.
|
||||
*/
|
||||
showSpinner: function( $el ) {
|
||||
|
||||
$el.siblings( '.loader' ).removeClass( 'hidden' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide spinner.
|
||||
*
|
||||
* @since 1.5.7
|
||||
*
|
||||
* @param {jQuery} $el Section number image jQuery object.
|
||||
*/
|
||||
hideSpinner: function( $el ) {
|
||||
|
||||
$el.siblings( '.loader' ).addClass( 'hidden' );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsPagesSMTP.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/pages/smtp.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/pages/smtp.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";var WPFormsPagesSMTP=window.WPFormsPagesSMTP||function(e,l){var i={},p={init:function(){l(p.ready)},ready:function(){p.initVars(),p.events()},initVars:function(){i={$stepInstall:l("section.step-install"),$stepInstallNum:l("section.step-install .num img"),$stepSetup:l("section.step-setup"),$stepSetupNum:l("section.step-setup .num img")}},events:function(){i.$stepInstall.on("click","button",p.stepInstallClick),i.$stepSetup.on("click","button",p.gotoURL)},stepInstallClick:function(){var s=l(this),n=s.attr("data-action"),t=s.attr("data-plugin"),a="";if(!s.hasClass("disabled")){switch(n){case"activate":a="wpforms_activate_addon",s.text(wpforms_pluginlanding.activating);break;case"install":a="wpforms_install_addon",s.text(wpforms_pluginlanding.installing);break;case"goto-url":return void(e.location.href=s.attr("data-url"));default:return}s.addClass("disabled"),p.showSpinner(i.$stepInstallNum);t={action:a,nonce:wpforms_admin.nonce,plugin:t,type:"plugin"};l.post(wpforms_admin.ajax_url,t).done(function(t){p.stepInstallDone(t,s,n)}).always(function(){p.hideSpinner(i.$stepInstallNum)})}},stepInstallDone:function(t,s,n){var a;("install"===n?t.success&&t.data.is_activated:t.success)?(i.$stepInstallNum.attr("src",i.$stepInstallNum.attr("src").replace("step-1.","step-complete.")),s.addClass("grey").removeClass("button-primary").text(wpforms_pluginlanding.activated),p.stepInstallPluginStatus()):(n=(t="install"===n&&t.success&&!t.data.is_activated||"activate"===n)?wpforms_pluginlanding.manual_activate_url:wpforms_pluginlanding.manual_install_url,a=t?wpforms_pluginlanding.error_could_not_activate:wpforms_pluginlanding.error_could_not_install,t=t?wpforms_pluginlanding.plugins_page:wpforms_pluginlanding.download_now,s.removeClass("grey disabled").text(t).attr("data-action","goto-url").attr("data-url",n),s.after('<p class="error">'+a+"</p>"))},stepInstallPluginStatus:function(){var t={action:"wpforms_smtp_page_check_plugin_status",nonce:wpforms_admin.nonce};l.post(wpforms_admin.ajax_url,t).done(p.stepInstallPluginStatusDone)},stepInstallPluginStatusDone:function(t){t.success&&(i.$stepSetup.removeClass("grey"),i.$stepSetupBtn=i.$stepSetup.find("button"),i.$stepSetupBtn.removeClass("grey disabled").addClass("button-primary"),0<t.data.setup_status?(i.$stepSetupNum.attr("src",i.$stepSetupNum.attr("src").replace("step-2.svg","step-complete.svg")),i.$stepSetupBtn.attr("data-url",wpforms_pluginlanding.smtp_settings_url).text(wpforms_pluginlanding.smtp_settings)):i.$stepSetupBtn.attr("data-url",wpforms_pluginlanding.smtp_wizard_url).text(wpforms_pluginlanding.smtp_wizard))},gotoURL:function(){var t=l(this);t.hasClass("disabled")||(e.location.href=t.attr("data-url"))},showSpinner:function(t){t.siblings(".loader").removeClass("hidden")},hideSpinner:function(t){t.siblings(".loader").addClass("hidden")}};return p}((document,window),jQuery);WPFormsPagesSMTP.init();
|
File diff suppressed because it is too large
Load Diff
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/payments/overview.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/payments/overview.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,229 @@
|
||||
/* global wpforms_admin, wpforms_admin_payments_single */
|
||||
|
||||
/**
|
||||
* WPForms Single Payment View page.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*/
|
||||
|
||||
const WPFormsPaymentsSingle = window.WPFormsPaymentsSingle || ( function( document, window, $ ) {
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
const app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*/
|
||||
init() {
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*/
|
||||
ready() {
|
||||
app.initTooltips();
|
||||
app.paymentDeletionAlert();
|
||||
app.actionButtons();
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize WPForms admin area tooltips.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*/
|
||||
initTooltips() {
|
||||
if ( typeof jQuery.fn.tooltipster === 'undefined' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
jQuery( '.wpforms-single-payment-tooltip' ).tooltipster( {
|
||||
contentCloning: true,
|
||||
theme: 'borderless',
|
||||
contentAsHTML: true,
|
||||
position: 'top',
|
||||
maxWidth: 500,
|
||||
multiple: true,
|
||||
interactive: true,
|
||||
debug: false,
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Alert user before deleting payment.
|
||||
*
|
||||
* @since 1.8.2
|
||||
*/
|
||||
paymentDeletionAlert() {
|
||||
$( document ).on( 'click', '.wpforms-payment-actions .button-delete', function( event ) {
|
||||
event.preventDefault();
|
||||
|
||||
const url = $( this ).attr( 'href' );
|
||||
|
||||
// Trigger alert modal to confirm.
|
||||
$.confirm( {
|
||||
title: wpforms_admin.heads_up,
|
||||
content: wpforms_admin_payments_single.payment_delete_confirm,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_admin.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action() {
|
||||
window.location = url;
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_admin.cancel,
|
||||
keys: [ 'esc' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle payment actions.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
actionButtons() {
|
||||
$( document ).on( 'click', '.wpforms-payments-single-action', ( event ) => {
|
||||
const gateway = $( event.currentTarget ).data( 'gateway' ),
|
||||
registeredHandlers = wpforms_admin.single_payment_button_handlers;
|
||||
|
||||
if ( ! registeredHandlers || ! registeredHandlers.includes( gateway ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
const paymentId = $( event.currentTarget ).data( 'action-id' ),
|
||||
actionType = $( event.currentTarget ).data( 'action-type' );
|
||||
|
||||
$.confirm( {
|
||||
title: wpforms_admin.heads_up,
|
||||
content: app.strings[ actionType ].confirm,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'orange',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_admin.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: () => {
|
||||
app.sendActionRequest( paymentId, gateway, actionType );
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_admin.cancel,
|
||||
keys: [ 'esc' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Send action request to server.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @param {number} paymentId Payment ID.
|
||||
* @param {string} gateway Payment gateway.
|
||||
* @param {string} actionType Action type.
|
||||
*/
|
||||
sendActionRequest( paymentId, gateway, actionType ) {
|
||||
$.ajax( {
|
||||
url: wpforms_admin.ajax_url,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'wpforms_' + gateway + '_payments_' + actionType,
|
||||
payment_id: paymentId, // eslint-disable-line camelcase
|
||||
nonce: wpforms_admin.nonce,
|
||||
},
|
||||
dataType: 'json',
|
||||
success: ( response ) => {
|
||||
if ( response.success ) {
|
||||
$.alert( {
|
||||
title: wpforms_admin.success,
|
||||
content: app.strings[ actionType ].success,
|
||||
icon: 'fa fa-check-circle',
|
||||
type: 'green',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_admin.close_refresh,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: () => {
|
||||
window.location.reload();
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
} else {
|
||||
app.failedResponseAlert( response?.data?.modal_msg || '' );
|
||||
}
|
||||
},
|
||||
error: () => {
|
||||
app.failedResponseAlert();
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Strings.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*/
|
||||
strings : {
|
||||
refund: {
|
||||
confirm: wpforms_admin_payments_single.payment_refund_confirm,
|
||||
success: wpforms_admin_payments_single.payment_refund_success,
|
||||
},
|
||||
cancel: {
|
||||
confirm: wpforms_admin_payments_single.payment_cancel_confirm,
|
||||
success: wpforms_admin_payments_single.payment_cancel_success,
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Alert user when refunding payment failed.
|
||||
*
|
||||
* @since 1.8.4
|
||||
*
|
||||
* @param {string} message Modal message.
|
||||
*/
|
||||
failedResponseAlert( message = '' ) {
|
||||
$.alert( {
|
||||
title: wpforms_admin.heads_up,
|
||||
content: message === '' ? wpforms_admin.try_again : message,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'red',
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_admin.ok,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
};
|
||||
|
||||
return app;
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsPaymentsSingle.init();
|
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/payments/single.min.js
vendored
Normal file
1
wp-content/plugins/wpforms-lite/assets/js/components/admin/payments/single.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const WPFormsPaymentsSingle=window.WPFormsPaymentsSingle||function(n,s,a){const i={init(){a(i.ready)},ready(){i.initTooltips(),i.paymentDeletionAlert(),i.actionButtons()},initTooltips(){void 0!==jQuery.fn.tooltipster&&jQuery(".wpforms-single-payment-tooltip").tooltipster({contentCloning:!0,theme:"borderless",contentAsHTML:!0,position:"top",maxWidth:500,multiple:!0,interactive:!0,debug:!1})},paymentDeletionAlert(){a(n).on("click",".wpforms-payment-actions .button-delete",function(n){n.preventDefault();const e=a(this).attr("href");a.confirm({title:wpforms_admin.heads_up,content:wpforms_admin_payments_single.payment_delete_confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action(){s.location=e}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})})},actionButtons(){a(n).on("click",".wpforms-payments-single-action",n=>{const e=a(n.currentTarget).data("gateway"),t=wpforms_admin.single_payment_button_handlers;if(t&&t.includes(e)){n.preventDefault();const s=a(n.currentTarget).data("action-id"),o=a(n.currentTarget).data("action-type");a.confirm({title:wpforms_admin.heads_up,content:i.strings[o].confirm,icon:"fa fa-exclamation-circle",type:"orange",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"],action:()=>{i.sendActionRequest(s,e,o)}},cancel:{text:wpforms_admin.cancel,keys:["esc"]}}})}})},sendActionRequest(n,e,t){a.ajax({url:wpforms_admin.ajax_url,type:"POST",data:{action:"wpforms_"+e+"_payments_"+t,payment_id:n,nonce:wpforms_admin.nonce},dataType:"json",success:n=>{n.success?a.alert({title:wpforms_admin.success,content:i.strings[t].success,icon:"fa fa-check-circle",type:"green",buttons:{confirm:{text:wpforms_admin.close_refresh,btnClass:"btn-confirm",keys:["enter"],action:()=>{s.location.reload()}}}}):i.failedResponseAlert(n?.data?.modal_msg||"")},error:()=>{i.failedResponseAlert()}})},strings:{refund:{confirm:wpforms_admin_payments_single.payment_refund_confirm,success:wpforms_admin_payments_single.payment_refund_success},cancel:{confirm:wpforms_admin_payments_single.payment_cancel_confirm,success:wpforms_admin_payments_single.payment_cancel_success}},failedResponseAlert(n=""){a.alert({title:wpforms_admin.heads_up,content:""===n?wpforms_admin.try_again:n,icon:"fa fa-exclamation-circle",type:"red",buttons:{confirm:{text:wpforms_admin.ok,btnClass:"btn-confirm",keys:["enter"]}}})}};return i}(document,window,jQuery);WPFormsPaymentsSingle.init();
|
Reference in New Issue
Block a user