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
589 lines
No EOL
20 KiB
JavaScript
589 lines
No EOL
20 KiB
JavaScript
let spectraImageGalleryLoadStatus = true;
|
|
let clickedImageId = null;
|
|
|
|
const UAGBImageGalleryMasonry = {
|
|
initByOffset( $selector, instance ){
|
|
// Verify $selector and instance.
|
|
if ( ! $selector || ! instance ) {
|
|
return;
|
|
}
|
|
|
|
// Add class for scroll not init.
|
|
$selector.classList.add( 'scroll-not-init' );
|
|
|
|
// Add class for last image not loaded.
|
|
$selector.classList.add( 'last-image-not-loaded' );
|
|
|
|
const getAllImages = $selector.querySelectorAll( 'img' );
|
|
if( getAllImages.length ){
|
|
// Get last image.
|
|
const getLastImage = getAllImages[ getAllImages.length - 1 ];
|
|
// Add event listener for last image.
|
|
getLastImage.addEventListener( 'load', () => {
|
|
// You can perform additional actions here once the image has loaded.
|
|
// Remove class for last image not loaded.
|
|
$selector.classList.remove( 'last-image-not-loaded' );
|
|
setTimeout( function() {
|
|
instance.layout();
|
|
}, 100 );
|
|
}
|
|
);
|
|
}
|
|
|
|
let timeOutInstance = null;
|
|
// Get scroll position dynamically.
|
|
window.addEventListener( 'scroll', function() {
|
|
if ( ! $selector.classList.contains( 'scroll-not-init' ) ) {
|
|
return;
|
|
}
|
|
// Clear timeout instance.
|
|
clearTimeout( timeOutInstance );
|
|
|
|
if ( UAGBImageGalleryMasonry.presentInViewport( $selector ) ) {
|
|
// If $selector comes in view port then init masonry.
|
|
$selector.classList.remove( 'scroll-not-init' );
|
|
// Init masonry.
|
|
timeOutInstance = setTimeout( function() {
|
|
instance.layout();
|
|
}, 100 );
|
|
}
|
|
} );
|
|
},
|
|
init( $attr, $selector, lightboxSettings, thumbnailSettings ) {
|
|
let count = 2;
|
|
const windowHeight50 = window.innerHeight / 1.25;
|
|
const $scope = document.querySelector( $selector );
|
|
let thumbnailSwiper = null;
|
|
if ( $attr.lightboxThumbnails ) {
|
|
thumbnailSwiper = new Swiper( `${$selector}+.spectra-image-gallery__control-lightbox .spectra-image-gallery__control-lightbox--thumbnails`,
|
|
thumbnailSettings
|
|
);
|
|
lightboxSettings = {
|
|
...lightboxSettings,
|
|
thumbs: {
|
|
swiper: thumbnailSwiper,
|
|
},
|
|
}
|
|
}
|
|
const lightboxSwiper = new Swiper( `${$selector}+.spectra-image-gallery__control-lightbox .spectra-image-gallery__control-lightbox--main`,
|
|
lightboxSettings
|
|
)
|
|
lightboxSwiper.lazy.load();
|
|
loadLightBoxImages( $scope, lightboxSwiper, null, $attr, thumbnailSwiper );
|
|
const loader = $scope?.querySelector( '.spectra-image-gallery__control-loader' );
|
|
const loadButton = $scope?.querySelector( '.spectra-image-gallery__control-button' );
|
|
if ( $attr.feedPagination && $attr.paginateUseLoader ) {
|
|
window.addEventListener( 'scroll', function () {
|
|
let mediaItem = $scope?.querySelector( '.spectra-image-gallery__media-wrapper' );
|
|
if ( ! mediaItem ) {
|
|
mediaItem = $scope;
|
|
}
|
|
const boundingClientRect = mediaItem.lastElementChild.getBoundingClientRect();
|
|
const offsetTop = boundingClientRect.top + window.scrollY;
|
|
if ( window.pageYOffset + windowHeight50 >= offsetTop ) {
|
|
const $args = {
|
|
page_number: count,
|
|
};
|
|
const total = $attr.gridPages;
|
|
if ( spectraImageGalleryLoadStatus ) {
|
|
if ( count > total ) {
|
|
loader.style.display = 'none';
|
|
}
|
|
if ( count <= total ) {
|
|
UAGBImageGalleryMasonry.callAjax( $scope, $args, $attr, false, count, $selector, lightboxSwiper, thumbnailSwiper );
|
|
count++;
|
|
spectraImageGalleryLoadStatus = false;
|
|
}
|
|
}
|
|
}
|
|
} );
|
|
} else if ( $attr.feedPagination && ! $attr.paginateUseLoader ) {
|
|
loadButton.onclick = function () {
|
|
const total = $attr.gridPages;
|
|
const $args = {
|
|
total,
|
|
page_number: count,
|
|
};
|
|
loadButton.classList.add( 'disabled' );
|
|
if ( spectraImageGalleryLoadStatus ) {
|
|
if ( count <= total ) {
|
|
UAGBImageGalleryMasonry.callAjax( $scope, $args, $attr, false, count, $selector, lightboxSwiper, thumbnailSwiper );
|
|
count++;
|
|
spectraImageGalleryLoadStatus = false;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
},
|
|
|
|
createElementFromHTML( htmlString ) {
|
|
const htmlElement = document.createElement( 'div' );
|
|
const htmlCleanString = htmlString.replace( /\s+/gm, ' ' ).replace( /( )+/gm, ' ' ).trim();
|
|
htmlElement.innerHTML = htmlCleanString;
|
|
return htmlElement;
|
|
},
|
|
|
|
getCustomURL( image, $attr ) {
|
|
const urlValidRegex = new RegExp(
|
|
'^((http|https)://)(www.)?[a-zA-Z0-9@:%._\\+~#?&//=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%._\\+~#?&//=]*)$'
|
|
);
|
|
const imageID = parseInt( image.getAttribute( 'data-spectra-gallery-image-id' ) );
|
|
return urlValidRegex.test( $attr?.customLinks[ imageID ] ) ? $attr.customLinks[ imageID ] : undefined;
|
|
},
|
|
|
|
openCustomURL( customURL ) {
|
|
window.open( customURL, '_blank' );
|
|
},
|
|
|
|
addClickEvents( element, $attr ) {
|
|
const imageElements = element?.querySelectorAll( '.spectra-image-gallery__media-wrapper' );
|
|
imageElements.forEach( ( image ) => {
|
|
const imageURL = UAGBImageGalleryMasonry.getCustomURL( image, $attr );
|
|
if ( imageURL ) {
|
|
image.style.cursor = 'pointer';
|
|
image.addEventListener( 'click', () => UAGBImageGalleryMasonry.openCustomURL( imageURL ) );
|
|
image.addEventListener( 'keydown', ( event ) => {
|
|
if ( 13 === event.keyCode || 32 === event.keyCode ) {
|
|
event.preventDefault();
|
|
UAGBImageGalleryMasonry.openCustomURL( imageURL );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
},
|
|
|
|
callAjax( $scope, $obj, $attr, append = false, count, $selector, lightboxSwiper, thumbnailSwiper ) {
|
|
const mediaData = new FormData();
|
|
mediaData.append( 'action', 'uag_load_image_gallery_masonry' );
|
|
mediaData.append( 'nonce', uagb_image_gallery.uagb_image_gallery_masonry_ajax_nonce );
|
|
mediaData.append( 'page_number', $obj.page_number );
|
|
mediaData.append( 'attr', JSON.stringify( $attr ) );
|
|
fetch( uagb_image_gallery.ajax_url, {
|
|
method: 'POST',
|
|
credentials: 'same-origin',
|
|
body: mediaData,
|
|
} )
|
|
.then( ( resp ) => resp.json() )
|
|
.then( function ( data ) {
|
|
let element = $scope?.querySelector( '.spectra-image-gallery__layout--masonry' );
|
|
if ( ! element ) {
|
|
element = $scope;
|
|
}
|
|
|
|
setTimeout( function () {
|
|
const isotope = new Isotope( element, {
|
|
itemSelector: '.spectra-image-gallery__media-wrapper--isotope',
|
|
stagger: 10,
|
|
} );
|
|
isotope.insert( UAGBImageGalleryMasonry.createElementFromHTML( data.data ) );
|
|
imagesLoaded( element ).on( 'progress', function () {
|
|
isotope.layout();
|
|
} );
|
|
imagesLoaded( element ).on( 'always', function () {
|
|
const currentScope = document.querySelector( $selector );
|
|
const loadButton = currentScope?.querySelector( '.spectra-image-gallery__control-button' )
|
|
loadButton?.classList?.remove( 'disabled' );
|
|
loadLightBoxImages( currentScope, lightboxSwiper, null, $attr, thumbnailSwiper );
|
|
} );
|
|
if ( 'url' === $attr.imageClickEvent && $attr.customLinks ) {
|
|
UAGBImageGalleryMasonry.addClickEvents( element, $attr );
|
|
}
|
|
spectraImageGalleryLoadStatus = true;
|
|
if ( true === append ) {
|
|
$scope?.querySelector( '.spectra-image-gallery__control-button' ).classList.toggle( 'disabled' );
|
|
}
|
|
if ( count === parseInt( $obj.total ) ) {
|
|
$scope.querySelector( '.spectra-image-gallery__control-button' ).style.opacity = 0;
|
|
setTimeout( () => {
|
|
$scope.querySelector( '.spectra-image-gallery__control-button' ).parentElement.style.display =
|
|
'none';
|
|
}, 2000 );
|
|
}
|
|
}, 500 );
|
|
} );
|
|
},
|
|
presentInViewport( element ) {
|
|
const rect = element.getBoundingClientRect();
|
|
return (
|
|
rect.top >= 0 &&
|
|
rect.left >= 0 &&
|
|
rect.bottom <= ( window.innerHeight || document.documentElement.clientHeight ) &&
|
|
rect.right <= ( window.innerWidth || document.documentElement.clientWidth )
|
|
);
|
|
},
|
|
};
|
|
|
|
const UAGBImageGalleryPagedGrid = {
|
|
init( $attr, $selector, lightboxSettings, thumbnailSettings ) {
|
|
let count = 1;
|
|
const $scope = document.querySelector( $selector );
|
|
let thumbnailSwiper = null;
|
|
if ( $attr.lightboxThumbnails ){
|
|
thumbnailSwiper = new Swiper( `${$selector}+.spectra-image-gallery__control-lightbox .spectra-image-gallery__control-lightbox--thumbnails`,
|
|
thumbnailSettings
|
|
);
|
|
lightboxSettings = {
|
|
...lightboxSettings,
|
|
thumbs: {
|
|
swiper: thumbnailSwiper,
|
|
},
|
|
}
|
|
}
|
|
const lightboxSwiper = new Swiper( `${$selector}+.spectra-image-gallery__control-lightbox .spectra-image-gallery__control-lightbox--main`,
|
|
lightboxSettings
|
|
)
|
|
lightboxSwiper.lazy.load();
|
|
loadLightBoxImages( $scope, lightboxSwiper, count, $attr, thumbnailSwiper );
|
|
const arrows = $scope?.querySelectorAll( '.spectra-image-gallery__control-arrows--grid' );
|
|
const dots = $scope?.querySelectorAll( '.spectra-image-gallery__control-dot' );
|
|
for ( let i = 0; i < arrows.length; i++ ) {
|
|
arrows[ i ].addEventListener( 'click', ( event ) => {
|
|
const thisArrow = event.currentTarget;
|
|
let page = count;
|
|
switch ( thisArrow.getAttribute( 'data-direction' ) ) {
|
|
case 'Prev':
|
|
--page;
|
|
break;
|
|
case 'Next':
|
|
++page;
|
|
break;
|
|
}
|
|
let mediaItem = $scope?.querySelector( '.spectra-image-gallery__media-wrapper' );
|
|
if ( ! mediaItem ) {
|
|
mediaItem = $scope;
|
|
}
|
|
const total = $attr.gridPages;
|
|
const $args = {
|
|
page_number: page,
|
|
total,
|
|
};
|
|
if ( page === total || page === 1 ) {
|
|
thisArrow.disabled = true;
|
|
} else {
|
|
arrows.forEach( ( ele ) => {
|
|
ele.disabled = false;
|
|
} );
|
|
}
|
|
if ( page <= total && page >= 1 ) {
|
|
UAGBImageGalleryPagedGrid.callAjax( $scope, $args, $attr, arrows, $selector, lightboxSwiper, thumbnailSwiper );
|
|
count = page;
|
|
}
|
|
} );
|
|
}
|
|
for ( let i = 0; i < dots.length; i++ ) {
|
|
dots[ i ].addEventListener( 'click', ( event ) => {
|
|
const thisDot = event.currentTarget;
|
|
const page = thisDot.getAttribute( 'data-go-to' );
|
|
let mediaItem = $scope?.querySelector( '.spectra-image-gallery__media-wrapper' );
|
|
if ( ! mediaItem ) {
|
|
mediaItem = $scope;
|
|
}
|
|
const $args = {
|
|
page_number: page,
|
|
total: $attr.gridPages,
|
|
};
|
|
UAGBImageGalleryPagedGrid.callAjax( $scope, $args, $attr, arrows, $selector, lightboxSwiper, thumbnailSwiper );
|
|
count = page;
|
|
} );
|
|
}
|
|
},
|
|
|
|
createElementFromHTML( htmlString ) {
|
|
const htmlElement = document.createElement( 'div' );
|
|
const htmlCleanString = htmlString.replace( /\s+/gm, ' ' ).replace( /( )+/gm, ' ' ).trim();
|
|
htmlElement.innerHTML = htmlCleanString;
|
|
return htmlElement;
|
|
},
|
|
|
|
getCustomURL( image, $attr ) {
|
|
const urlValidRegex = new RegExp(
|
|
'^((http|https)://)(www.)?[a-zA-Z0-9@:%._\\+~#?&//=\\-]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%._\\+~#?&//=]*)$'
|
|
);
|
|
const imageID = parseInt( image.getAttribute( 'data-spectra-gallery-image-id' ) );
|
|
return urlValidRegex.test( $attr?.customLinks[ imageID ] ) ? $attr.customLinks[ imageID ] : undefined;
|
|
},
|
|
|
|
openCustomURL( customURL ) {
|
|
window.open( customURL, '_blank' );
|
|
},
|
|
|
|
addClickEvents( element, $attr ) {
|
|
const imageElements = element?.querySelectorAll( '.spectra-image-gallery__media-wrapper' );
|
|
imageElements.forEach( ( image ) => {
|
|
const imageURL = UAGBImageGalleryPagedGrid.getCustomURL( image, $attr );
|
|
if ( imageURL ) {
|
|
image.style.cursor = 'pointer';
|
|
image.setAttribute( 'tabindex', '0' );
|
|
image.addEventListener( 'click', () => UAGBImageGalleryPagedGrid.openCustomURL( imageURL ) );
|
|
image.addEventListener( 'keydown', ( event ) => {
|
|
if ( 13 === event.keyCode || 32 === event.keyCode ) {
|
|
UAGBImageGalleryPagedGrid.openCustomURL( imageURL );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
},
|
|
|
|
callAjax( $scope, $obj, $attr, arrows, $selector, lightboxSwiper, thumbnailSwiper ) {
|
|
const mediaData = new FormData();
|
|
mediaData.append( 'action', 'uag_load_image_gallery_grid_pagination' );
|
|
mediaData.append( 'nonce', uagb_image_gallery.uagb_image_gallery_grid_pagination_ajax_nonce );
|
|
mediaData.append( 'page_number', $obj.page_number );
|
|
mediaData.append( 'attr', JSON.stringify( $attr ) );
|
|
fetch( uagb_image_gallery.ajax_url, {
|
|
method: 'POST',
|
|
credentials: 'same-origin',
|
|
body: mediaData,
|
|
} )
|
|
.then( ( resp ) => resp.json() )
|
|
.then( function ( data ) {
|
|
if ( data.success === false ) {
|
|
return;
|
|
}
|
|
setTimeout( function () {
|
|
let element = $scope?.querySelector( '.spectra-image-gallery__layout--isogrid' );
|
|
if ( ! element ) {
|
|
element = $scope;
|
|
}
|
|
const mediaElements = element.querySelectorAll( '.spectra-image-gallery__media-wrapper--isotope' );
|
|
const isotope = new Isotope( element, {
|
|
itemSelector: '.spectra-image-gallery__media-wrapper--isotope',
|
|
layoutMode: 'fitRows',
|
|
} );
|
|
mediaElements.forEach( ( mediaEle ) => {
|
|
isotope.remove( mediaEle );
|
|
isotope.layout();
|
|
} );
|
|
isotope.insert( UAGBImageGalleryPagedGrid.createElementFromHTML( data.data ) );
|
|
imagesLoaded( element ).on( 'progress', function () {
|
|
isotope.layout();
|
|
} );
|
|
imagesLoaded( element ).on( 'always', function () {
|
|
const currentScope = document.querySelector( $selector );
|
|
loadLightBoxImages( currentScope, lightboxSwiper, parseInt( $obj.page_number ), $attr, thumbnailSwiper );
|
|
} );
|
|
if ( $attr.customLinks ) {
|
|
UAGBImageGalleryPagedGrid.addClickEvents( element, $attr );
|
|
}
|
|
if ( parseInt( $obj.page_number ) === 1 ) {
|
|
arrows.forEach( ( arrow ) => {
|
|
arrow.disabled = arrow.getAttribute( 'data-direction' ) === 'Prev';
|
|
} );
|
|
} else if ( parseInt( $obj.page_number ) === parseInt( $obj.total ) ) {
|
|
arrows.forEach( ( arrow ) => {
|
|
arrow.disabled = arrow.getAttribute( 'data-direction' ) === 'Next';
|
|
} );
|
|
} else {
|
|
arrows.forEach( ( arrow ) => {
|
|
arrow.disabled = false;
|
|
} );
|
|
}
|
|
$scope
|
|
?.querySelector( '.spectra-image-gallery__control-dot--active' )
|
|
.classList.toggle( 'spectra-image-gallery__control-dot--active' );
|
|
const $activeDot = $scope?.querySelectorAll( '.spectra-image-gallery__control-dot' );
|
|
$activeDot[ parseInt( $obj.page_number ) - 1 ].classList.toggle(
|
|
'spectra-image-gallery__control-dot--active'
|
|
);
|
|
}, 500 );
|
|
} );
|
|
},
|
|
};
|
|
|
|
const cycleInLightbox = ( selector, e ) => {
|
|
// Check if Tab key was pressed
|
|
if ( e.key === 'Tab' ) {
|
|
const focusableElements = selector.querySelectorAll( 'button, div[data-role="button"], [href], [tabindex]:not([tabindex="-1"])' );
|
|
const firstFocusableElement = focusableElements[0];
|
|
const lastFocusableElement = focusableElements[focusableElements.length - 1];
|
|
|
|
// Get the active element using ownerDocument
|
|
const activeElement = e.target.ownerDocument.activeElement;
|
|
|
|
// Check if Shift + Tab was pressed and if the current active element is the first one
|
|
if ( e.shiftKey && activeElement === firstFocusableElement ) {
|
|
e.preventDefault();
|
|
lastFocusableElement.focus();
|
|
}
|
|
// Check if Tab was pressed and if the current active element is the last one
|
|
else if ( !e.shiftKey && activeElement === lastFocusableElement ) {
|
|
e.preventDefault();
|
|
firstFocusableElement.focus();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
const loadLightBoxImages = ( blockScope, lightboxSwiper, pageNum, attr, thumbnailSwiper ) => {
|
|
if ( ! blockScope ) {
|
|
return;
|
|
}
|
|
const pageLimit = attr.paginateLimit;
|
|
|
|
const theBody = document.querySelector( 'body' );
|
|
const updateCounter = ( curPage ) => {
|
|
const lightbox = blockScope?.nextElementSibling;
|
|
const counter = lightbox.querySelector( '.spectra-image-gallery__control-lightbox--count-page' );
|
|
if ( counter ) {
|
|
counter.innerHTML = parseInt( curPage ) + 1;
|
|
}
|
|
};
|
|
lightboxSwiper.on( 'activeIndexChange', ( swiperInstance ) => {
|
|
if ( attr.lightboxThumbnails ) {
|
|
thumbnailSwiper.slideTo( swiperInstance.activeIndex );
|
|
}
|
|
if ( attr.lightboxDisplayCount ) {
|
|
updateCounter( swiperInstance.activeIndex );
|
|
}
|
|
lightboxSwiper.lazy.load();
|
|
} )
|
|
if ( attr.lightboxThumbnails ) {
|
|
thumbnailSwiper.on( 'activeIndexChange', ( swiperInstance ) => {
|
|
lightboxSwiper.slideTo( swiperInstance.activeIndex );
|
|
} );
|
|
|
|
}
|
|
const lightbox = blockScope?.nextElementSibling;
|
|
let lightboxHandlers = {};
|
|
if ( lightbox && lightbox?.classList.contains( 'spectra-image-gallery__control-lightbox' ) ) {
|
|
// create a lightbox cycle listeners.
|
|
const createListeners = () => {
|
|
const cycleInLightboxWithID = cycleInLightbox.bind( null, lightbox );
|
|
|
|
// Function to add the event listener
|
|
function addEventListener() {
|
|
lightbox.addEventListener( 'keydown', cycleInLightboxWithID );
|
|
}
|
|
|
|
// Function to remove the event listener
|
|
function removeEventListener() {
|
|
lightbox.removeEventListener( 'keydown', cycleInLightboxWithID );
|
|
}
|
|
|
|
return { addEventListener, removeEventListener };
|
|
};
|
|
|
|
lightboxHandlers = createListeners();
|
|
|
|
lightbox.addEventListener( 'keydown', ( event ) => {
|
|
if ( 27 === event.keyCode ) {
|
|
theBody.style.overflow = '';
|
|
lightbox.style.opacity = 0;
|
|
setTimeout( () => {
|
|
lightbox.style.display = 'none';
|
|
lightboxHandlers.removeEventListener();
|
|
if ( clickedImageId ) {
|
|
const clickedImage = document.querySelector( `[data-spectra-gallery-image-id="${clickedImageId}"]` );
|
|
clickedImage?.focus();
|
|
clickedImageId = null;
|
|
}
|
|
}, 250 );
|
|
}
|
|
} );
|
|
lightbox.style.display = 'none';
|
|
if ( attr.lightboxCloseIcon ) {
|
|
const closeButton = lightbox.querySelector( '.spectra-image-gallery__control-lightbox--close' );
|
|
if ( closeButton ) {
|
|
closeButton.addEventListener( 'click', () => {
|
|
theBody.style.overflow = '';
|
|
lightbox.style.opacity = 0;
|
|
setTimeout( () => {
|
|
lightbox.style.display = 'none';
|
|
if ( clickedImageId ) {
|
|
const clickedImage = document.querySelector( `[data-spectra-gallery-image-id="${clickedImageId}"]` );
|
|
clickedImage?.focus();
|
|
clickedImageId = null;
|
|
}
|
|
lightboxHandlers.removeEventListener();
|
|
}, 250 );
|
|
} );
|
|
}
|
|
}
|
|
if ( attr.lightboxDisplayCount ) {
|
|
const lightboxTotal = lightbox.querySelector( '.spectra-image-gallery__control-lightbox--count-total' );
|
|
lightboxTotal.innerHTML = attr.mediaGallery.length;
|
|
}
|
|
}
|
|
const enableLightbox = ( goTo, clickedImage ) => {
|
|
if ( ! lightboxSwiper || !lightbox ) {
|
|
return;
|
|
}
|
|
clickedImageId = clickedImage.getAttribute( 'data-spectra-gallery-image-id' );
|
|
lightbox.style.display = '';
|
|
lightbox.focus();
|
|
setTimeout( () => {
|
|
lightboxSwiper.slideTo( goTo );
|
|
}, 100 );
|
|
setTimeout( () => {
|
|
lightbox.style.opacity = 1;
|
|
if ( lightbox?.classList.contains( 'spectra-image-gallery__control-lightbox' ) ) {
|
|
theBody.style.overflow = 'hidden';
|
|
}
|
|
|
|
lightboxHandlers.addEventListener();
|
|
|
|
}, 250 );
|
|
}
|
|
|
|
if ( pageNum !== null ) {
|
|
setTimeout( () => {
|
|
addClickListeners( blockScope, pageNum, enableLightbox, pageLimit, attr );
|
|
}, 1000 );
|
|
} else {
|
|
addClickListeners( blockScope, null, enableLightbox, null, attr );
|
|
}
|
|
};
|
|
|
|
const generateUniqueId = ( index ) => `image-${index}-${Date.now()}`;
|
|
|
|
const addClickListeners = ( $scope, pageNum, enableLightbox, pageLimit, attr ) => {
|
|
const images = $scope.querySelectorAll( '.spectra-image-gallery__media-wrapper' );
|
|
const imageUrls = {};
|
|
if ( 'image' === attr.imageClickEvent ) {
|
|
const mediaGallery = attr.mediaGallery;
|
|
mediaGallery.forEach( media => {
|
|
imageUrls[ media.id ] = media.url;
|
|
} );
|
|
}
|
|
|
|
images.forEach( ( image, index ) => {
|
|
image.style.cursor = 'pointer';
|
|
const uniqueId = generateUniqueId( index );
|
|
if( 'lightbox' === attr.imageClickEvent ) {
|
|
image.setAttribute( 'data-spectra-gallery-image-id', uniqueId );
|
|
};
|
|
if ( 'image' === attr.imageClickEvent ) {
|
|
const imgId = image.getAttribute( 'data-spectra-gallery-image-id' );
|
|
const imgURL = imageUrls[ imgId ];
|
|
image.addEventListener( 'click', () => {
|
|
openImageInWindow( imgURL ); // To avoid opening multiple tab at same when Popup and redirect is enabled.
|
|
} );
|
|
image.addEventListener( 'keydown', ( event ) => {
|
|
if ( 13 === event.keyCode || 32 === event.keyCode ) {
|
|
openImageInWindow( imgURL );
|
|
}
|
|
} );
|
|
} else {
|
|
const nextImg = pageNum !== null ? index + ( pageNum - 1 ) * pageLimit : index;
|
|
image.addEventListener( 'click', () => enableLightbox( nextImg, image ) );
|
|
image.addEventListener( 'keydown', ( event ) => {
|
|
if ( 13 === event.keyCode || 32 === event.keyCode ) {
|
|
event.preventDefault();
|
|
enableLightbox( nextImg, image );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
}
|
|
|
|
let imageWindow = null;
|
|
const openImageInWindow = ( imageUrl ) => {
|
|
// Check if the window is already open
|
|
if ( imageWindow && !imageWindow.closed ) {
|
|
// If open, focus on the existing window
|
|
imageWindow.focus();
|
|
} else {
|
|
// If not open or closed, open a new window
|
|
imageWindow = window.open( imageUrl, '_blank' );
|
|
}
|
|
} |