(function () {
'use strict';
const errorMarkup = (wrapper) => {
const text = wrapper.dataset.errorText || 'Could not load content.';
const node = document.createElement('div');
node.textContent = text;
return '
' + node.innerHTML + '
';
};
const loadTabContent = async (wrapper, key) => {
const ajax = wrapper.dataset.ajax === 'yes';
if (!ajax) {
return true;
}
const panel = wrapper.querySelector('.ka-woo-tabs__panel[data-tab="' + key + '"]');
if (!panel || !panel.querySelector('.ka-woo-tabs__placeholder')) {
return true;
}
// In accordion layout the placeholder sits inside the body, below the
// header button - replacing the panel's own innerHTML would delete the
// header the visitor just clicked.
const target = panel.querySelector('.ka-woo-tabs__accordion-body') || panel;
const ajaxUrl = wrapper.dataset.ajaxUrl;
const nonce = wrapper.dataset.nonce;
const productId = wrapper.dataset.productId;
if (!ajaxUrl || !nonce || !productId) {
return true;
}
panel.classList.add('is-loading');
const formData = new FormData();
formData.append('action', 'king_addons_render_product_tab');
formData.append('nonce', nonce);
formData.append('product_id', productId);
formData.append('tab_key', key);
try {
const response = await fetch(ajaxUrl, {
method: 'POST',
credentials: 'same-origin',
body: formData,
});
const result = await response.json();
if (result && result.success && result.data && typeof result.data.html === 'string') {
target.innerHTML = result.data.html;
panel.dataset.loaded = 'yes';
} else {
target.innerHTML = errorMarkup(wrapper);
}
} catch (e) {
target.innerHTML = errorMarkup(wrapper);
}
panel.classList.remove('is-loading');
return true;
};
const initTabs = (wrapper) => {
const tabs = wrapper.querySelectorAll('.ka-woo-tabs__tab');
const panels = wrapper.querySelectorAll('.ka-woo-tabs__panel');
const accordions = wrapper.querySelectorAll('.ka-woo-tabs__accordion-toggle');
const setActive = (key) => {
tabs.forEach((btn) => {
const active = btn.dataset.tab === key;
btn.classList.toggle('is-active', active);
btn.setAttribute('aria-selected', active ? 'true' : 'false');
});
panels.forEach((panel) => {
const active = panel.dataset.tab === key;
panel.classList.toggle('is-active', active);
const toggle = panel.querySelector('.ka-woo-tabs__accordion-toggle');
if (toggle) {
toggle.setAttribute('aria-expanded', active ? 'true' : 'false');
}
});
};
const handleSwitch = async (key) => {
const panel = wrapper.querySelector('.ka-woo-tabs__panel[data-tab="' + key + '"]');
const needsLoad = panel && panel.querySelector('.ka-woo-tabs__placeholder');
if (needsLoad) {
await loadTabContent(wrapper, key);
}
setActive(key);
};
tabs.forEach((btn) => {
btn.addEventListener('click', () => handleSwitch(btn.dataset.tab));
});
accordions.forEach((btn) => {
btn.addEventListener('click', () => handleSwitch(btn.dataset.tab));
});
};
const bootstrap = (scope) => {
const root = scope || document;
root.querySelectorAll('.ka-woo-tabs').forEach(initTabs);
};
document.addEventListener('DOMContentLoaded', () => bootstrap(document));
if (window.elementorFrontend && window.elementorFrontend.hooks) {
window.elementorFrontend.hooks.addAction('frontend/element_ready/woo_product_tabs.default', (scope) => {
bootstrap(scope[0] || scope);
});
}
})();