Add massive collection of CSS, JavaScript and theme assets that were previously excluded: **CSS Files (681 total):** - HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup - Theme framework files (Astra, builder systems, layouts): 200+ files - Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files - WordPress core and editor styles: 50+ files - Responsive and RTL language support: 200+ files **JavaScript Files (400+ total):** - HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations - Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope - Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS - WordPress core functionality: customizer, admin, block editor compatibility - Third-party integrations: Stripe, SMTP, analytics, search functionality **Assets:** - Certificate background images and logos - Comprehensive theme styling infrastructure - Mobile-responsive design systems - Cross-browser compatibility assets - Performance-optimized minified versions **Updated .gitignore:** - Fixed asset directory whitelisting patterns to properly include CSS/JS/images - Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.) - Maintains security by excluding sensitive files while including essential assets This commit provides the complete frontend infrastructure needed for: - Full theme functionality and styling - Plugin feature implementations - Mobile responsiveness and accessibility - Cross-browser compatibility - Performance optimization - Developer workflow support
385 lines
12 KiB
JavaScript
385 lines
12 KiB
JavaScript
/* global wpforms_gutenberg_form_selector, JSX */
|
||
/* jshint es3: false, esversion: 6 */
|
||
|
||
/**
|
||
* @param strings.update_wp_notice_head
|
||
* @param strings.update_wp_notice_text
|
||
* @param strings.update_wp_notice_link
|
||
* @param strings.wpforms_empty_help
|
||
* @param strings.wpforms_empty_info
|
||
*/
|
||
|
||
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 );
|
||
} );
|
||
};
|
||
|
||
/**
|
||
* Init Modern style Dropdown fields (<select>) with choiceJS.
|
||
*
|
||
* @since 1.9.0
|
||
*
|
||
* @param {Object} e Block Details.
|
||
*/
|
||
const loadChoiceJS = function( e ) {
|
||
if ( typeof window.Choices !== 'function' ) {
|
||
return;
|
||
}
|
||
|
||
const $form = jQuery( e.detail.block.querySelector( `#wpforms-${ e.detail.formId }` ) );
|
||
const config = window.wpforms_choicesjs_config || {};
|
||
|
||
$form.find( '.choicesjs-select' ).each( function( index, element ) {
|
||
if ( ! ( element instanceof HTMLSelectElement ) ) {
|
||
return;
|
||
}
|
||
|
||
const $el = jQuery( element );
|
||
|
||
if ( $el.data( 'choicesjs' ) ) {
|
||
return;
|
||
}
|
||
|
||
const $field = $el.closest( '.wpforms-field' );
|
||
|
||
config.callbackOnInit = function() {
|
||
const self = this,
|
||
$element = jQuery( self.passedElement.element ),
|
||
$input = jQuery( self.input.element ),
|
||
sizeClass = $element.data( 'size-class' );
|
||
|
||
// Add CSS-class for size.
|
||
if ( sizeClass ) {
|
||
jQuery( self.containerOuter.element ).addClass( sizeClass );
|
||
}
|
||
|
||
/**
|
||
* If a multiple select has selected choices - hide a placeholder text.
|
||
* In case if select is empty - we return placeholder text.
|
||
*/
|
||
if ( $element.prop( 'multiple' ) ) {
|
||
// On init event.
|
||
$input.data( 'placeholder', $input.attr( 'placeholder' ) );
|
||
|
||
if ( self.getValue( true ).length ) {
|
||
$input.removeAttr( 'placeholder' );
|
||
}
|
||
}
|
||
|
||
this.disable();
|
||
$field.find( '.is-disabled' ).removeClass( 'is-disabled' );
|
||
};
|
||
|
||
$el.data( 'choicesjs', new window.Choices( element, config ) );
|
||
|
||
// Placeholder fix on iframes.
|
||
if ( $el.val() ) {
|
||
$el.parent().find( '.choices__input' ).attr( 'style', 'display: none !important' );
|
||
}
|
||
} );
|
||
};
|
||
|
||
// on document ready
|
||
jQuery( function() {
|
||
jQuery( window ).on( 'wpformsFormSelectorFormLoaded', loadChoiceJS );
|
||
} );
|
||
/**
|
||
* Open builder popup.
|
||
*
|
||
* @since 1.6.2
|
||
*
|
||
* @param {string} clientID Block Client ID.
|
||
*/
|
||
const openBuilderPopup = function( clientID ) {
|
||
if ( jQuery.isEmptyObject( $popup ) ) {
|
||
const tmpl = jQuery( '#wpforms-gutenberg-popup' );
|
||
const 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} blockProps Block properties.
|
||
*
|
||
* @return {JSX.Element} Block empty JSX code.
|
||
*/
|
||
function getEmptyFormsPreview( blockProps ) {
|
||
const clientId = blockProps.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 } alt="" />
|
||
<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" title="wpforms-gutenberg-popup"></iframe>
|
||
</div>
|
||
</div>
|
||
</Fragment>
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Print empty forms notice.
|
||
*
|
||
* @since 1.8.3
|
||
*
|
||
* @param {string} clientId Block client ID.
|
||
*
|
||
* @return {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>
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Get styling panels preview.
|
||
*
|
||
* @since 1.8.8
|
||
*
|
||
* @return {JSX.Element} JSX code.
|
||
*/
|
||
function getStylingPanelsPreview() {
|
||
return (
|
||
<Fragment>
|
||
<PanelBody className="wpforms-gutenberg-panel disabled_panel" title={ strings.themes }>
|
||
<div className="wpforms-panel-preview wpforms-panel-preview-themes"></div>
|
||
</PanelBody>
|
||
<PanelBody className="wpforms-gutenberg-panel disabled_panel" title={ strings.field_styles }>
|
||
<div className="wpforms-panel-preview wpforms-panel-preview-field"></div>
|
||
</PanelBody>
|
||
<PanelBody className="wpforms-gutenberg-panel disabled_panel" title={ strings.label_styles }>
|
||
<div className="wpforms-panel-preview wpforms-panel-preview-label"></div>
|
||
</PanelBody>
|
||
<PanelBody className="wpforms-gutenberg-panel disabled_panel" title={ strings.button_styles }>
|
||
<div className="wpforms-panel-preview wpforms-panel-preview-button"></div>
|
||
</PanelBody>
|
||
<PanelBody className="wpforms-gutenberg-panel disabled_panel" title={ strings.container_styles }>
|
||
<div className="wpforms-panel-preview wpforms-panel-preview-container"></div>
|
||
</PanelBody>
|
||
<PanelBody className="wpforms-gutenberg-panel disabled_panel" title={ strings.background_styles }>
|
||
<div className="wpforms-panel-preview wpforms-panel-preview-background"></div>
|
||
</PanelBody>
|
||
</Fragment>
|
||
);
|
||
}
|
||
|
||
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 wpforms-warning">
|
||
<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>
|
||
{ getStylingPanelsPreview() }
|
||
</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%' } } alt="" />
|
||
</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 } alt="" />
|
||
<SelectControl
|
||
key="wpforms-gutenberg-form-selector-select-control"
|
||
value={ formId }
|
||
options={ formOptions }
|
||
onChange={ selectForm }
|
||
/>
|
||
</Placeholder>
|
||
);
|
||
}
|
||
|
||
return jsx;
|
||
},
|
||
save() {
|
||
return null;
|
||
},
|
||
} );
|