mirror of
https://github.com/pronamic/woocommerce-subscriptions.git
synced 2025-10-07 10:04:03 +00:00
115 lines
2.9 KiB
JavaScript
Executable File
115 lines
2.9 KiB
JavaScript
Executable File
jQuery( document ).ready( function( $ ) {
|
|
const modals = $( '.wcs-modal' );
|
|
|
|
// Resize all open modals on window resize.
|
|
$( window ).on( 'resize', resizeModals );
|
|
|
|
// Initialize modals
|
|
$( modals ).each( function() {
|
|
trigger = $( this ).data( 'modal-trigger' );
|
|
$( trigger ).click( { modal: this }, show_modal );
|
|
});
|
|
|
|
/**
|
|
* Displays the modal linked to a click event.
|
|
*
|
|
* Attaches all close callbacks and resizes to fit.
|
|
*
|
|
* @param {JQuery event} event
|
|
*/
|
|
function show_modal( event ) {
|
|
const modal = $( event.data.modal );
|
|
|
|
if ( ! should_show_modal( modal ) ) {
|
|
return;
|
|
}
|
|
|
|
// Prevent the trigger element event being triggered.
|
|
event.preventDefault();
|
|
|
|
const contentWrapper = modal.find( '.content-wrapper' );
|
|
const close = modal.find( '.close' );
|
|
|
|
modal.focus();
|
|
modal.addClass( 'open' );
|
|
|
|
resizeModal( modal );
|
|
|
|
$( document.body ).toggleClass( 'wcs-modal-open', true );
|
|
|
|
// Attach callbacks to handle closing the modal.
|
|
close.on( 'click', () => close_modal( modal ) );
|
|
modal.on( 'click', () => close_modal( modal ) );
|
|
contentWrapper.on( 'click', ( e ) => e.stopPropagation() );
|
|
|
|
// Close the modal if the escape key is pressed.
|
|
modal.on( 'keyup', function( e ) {
|
|
if ( 27 === e.keyCode ) {
|
|
close_modal( modal )
|
|
}
|
|
} );
|
|
}
|
|
|
|
/**
|
|
* Closes a modal and resets any forced height styles.
|
|
*
|
|
* @param {JQuery Object} modal
|
|
*/
|
|
function close_modal( modal ) {
|
|
modal.removeClass( 'open' );
|
|
$( modal ).find( '.content-wrapper' ).css( 'height', '' );
|
|
|
|
if ( 0 === modals.filter( '.open' ).length ) {
|
|
$( document.body ).removeClass( 'wcs-modal-open' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determines if a modal should be displayed.
|
|
*
|
|
* A custom trigger is called to allow third-parties to filter whether the modal should be displayed or not.
|
|
*
|
|
* @param {JQuery Object} modal
|
|
*/
|
|
function should_show_modal( modal ) {
|
|
// Allow third-parties to filter whether the modal should be displayed.
|
|
var event = jQuery.Event( 'wcs_show_modal' );
|
|
event.modal = modal;
|
|
|
|
$( document ).trigger( event );
|
|
|
|
// Fallback to true (show modal) if the result is undefined.
|
|
return undefined === event.result ? true : event.result;
|
|
}
|
|
|
|
/**
|
|
* Resize all open modals to fit the display.
|
|
*/
|
|
function resizeModals() {
|
|
$( modals ).each( function() {
|
|
if ( ! $( this ).hasClass( 'open' ) ) {
|
|
return;
|
|
}
|
|
|
|
resizeModal( this );
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Resize a modal to fit the display.
|
|
*
|
|
* @param {JQuery Object} modal
|
|
*/
|
|
function resizeModal( modal ) {
|
|
var modal_container = $( modal ).find( '.content-wrapper' );
|
|
|
|
// On smaller displays the height is already forced to be 100% in CSS. We just clear any height we might set previously.
|
|
if ( $( window ).width() <= 414 ) {
|
|
modal_container.css( 'height', '' );
|
|
} else if ( modal_container.height() > $( window ).height() ) {
|
|
// Force the container height to trigger scroll etc if it doesn't fit on the screen.
|
|
modal_container.css( 'height', '90%' );
|
|
}
|
|
}
|
|
});
|