Files
woocommerce-subscriptions/assets/js/modal.js
Prospress Inc a60db3815d 2.6.1
2019-09-12 11:49:11 +02:00

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%' );
}
}
});