184 lines
5.8 KiB
JavaScript
184 lines
5.8 KiB
JavaScript
document.querySelectorAll('input.autocomplete').forEach(el => new _AutocompleteInput(el, el.dataset));
|
|
document.querySelectorAll('input.autocomplete-list').forEach(el => new _AutocompleteList(el, el.dataset));
|
|
|
|
document.querySelectorAll('.taxonomies input.tags-input').forEach(el => {
|
|
/*
|
|
let params = "";
|
|
|
|
for (name in element.dataset) {
|
|
if (name) {
|
|
params += name + "=" + element.dataset[name];
|
|
}
|
|
}*/
|
|
new _TagsInput(el,{
|
|
url: window.location.pathname + "?module=product/product&action=categoriesAutocomplete&type=tags&post_type=" + postType,
|
|
parameters:el.dataset,
|
|
listName:"tag",
|
|
//listName:"tag[]",
|
|
listId:el.dataset.taxonomy_id, //element.dataset.taxonomy_id,
|
|
allowFreeText:true
|
|
});
|
|
});
|
|
|
|
//intialize tinyMce if loaded, some plugins may remove tinymce to load a different editor
|
|
if (typeof tinyMceOptions !== 'undefined') {
|
|
window.dispatchEvent(new CustomEvent("tinymce.options", {detail: tinyMceOptions}));
|
|
tinymce.init(tinyMceOptions);
|
|
}
|
|
|
|
var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'))
|
|
var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
|
|
return new bootstrap.Popover(popoverTriggerEl)
|
|
});
|
|
|
|
|
|
document.querySelectorAll('#tab-general .tab-pane[data-v-language]').forEach(el => {
|
|
let titleInput = el.querySelector('[data-v-' + contentType + '-content-name]');
|
|
let slugInput = el.querySelector('[data-v-' + contentType + '-content-slug]');
|
|
let urlInput = el.querySelector('[data-v-' + contentType + '-content-url]');
|
|
let orig = slugify(titleInput.value);
|
|
|
|
//change slug only if current value is the same as the text
|
|
titleInput.addEventListener('keyup', function (e) {
|
|
let text = this.value;
|
|
delay(() => {
|
|
let slug = slugInput.value;
|
|
|
|
if ((orig == slug) || !slug) {
|
|
slug = orig = slugify(text);
|
|
const detail = {text, slug};
|
|
const event = new CustomEvent("content.slug", {detail});
|
|
document.dispatchEvent(event);
|
|
({text, slug} = detail);
|
|
slugInput.value = orig = slug;
|
|
}
|
|
|
|
let url = urlInput.textContent.replace(/[^\/]+$/,'');
|
|
if (!url) {
|
|
url = "/";
|
|
}
|
|
|
|
url += slug;
|
|
urlInput.textContent = url;
|
|
urlInput.setAttribute("href", url);
|
|
|
|
if (titleElement) titleElement.innerHTML = text;
|
|
}, 500);
|
|
});
|
|
|
|
slugInput.addEventListener('keyup', function (e) {
|
|
let slug = this.value;
|
|
let url = urlInput.textContent.replace(/[^\/]+$/,'');
|
|
if (!url) {
|
|
url = "/";
|
|
}
|
|
|
|
url += slug;
|
|
urlInput.textContent = url;
|
|
urlInput.setAttribute("href", url);
|
|
});
|
|
|
|
});
|
|
|
|
|
|
document.querySelector("[data-v-images]")?.addEventListener("click", function (e) {
|
|
let element = e.target.closest(".btn-outline-danger");
|
|
if (element) {
|
|
let card = element.closest("[data-v-image]");
|
|
card.remove();
|
|
}
|
|
});
|
|
|
|
document.getElementById("add-new-image")?.addEventListener("click", function (e) {
|
|
let id = "gallery-image-" + document.querySelectorAll("[data-v-images] [data-v-image]").length + "-input";
|
|
let newImage = generateElements(document.getElementById("add-new-image-template").innerHTML.replaceAll("gallery-image-0", "gallery-image-" + id).replace('disabled',''))[0];
|
|
let newImageCard = document.querySelector(".add-new-image-card");
|
|
console.log(newImage);
|
|
|
|
newImageCard.parentNode.insertBefore(newImage, newImageCard);
|
|
newImage.querySelector("img").click();
|
|
|
|
e.preventDefault();
|
|
return false;
|
|
});
|
|
|
|
//on form validation show tab with invalid element
|
|
|
|
document.addEventListener('invalid', function(e){
|
|
//e.target.className += ' is-invalid';
|
|
focusInvalidElement(e);
|
|
}, true);
|
|
|
|
function focusInvalidElement(e) {
|
|
//if (Form.checkValidity() == false) {
|
|
let form = e.target.closest("form");
|
|
document.querySelectorAll(".is-invalid").forEach(e => e.classList.remove("is-invalid"));
|
|
//get first invalid input
|
|
let element = form.querySelector(':invalid');
|
|
let activeTab = element.closest(".tab-pane");
|
|
let activeCollapse = element.closest(".collapse:not(.show)");
|
|
|
|
element.className += ' is-invalid';
|
|
//activate tab panel
|
|
document.querySelectorAll(".tab-pane").forEach(e => e.classList.remove("show", "active"));
|
|
//activate tab
|
|
document.querySelectorAll(".nav-link").forEach(e => e.classList.remove("active"));
|
|
|
|
while (activeTab) {
|
|
activeTab.classList.add("show", "active");
|
|
document.querySelector("a[href='#" + activeTab.getAttribute("id") + "']")?.classList.add("active");
|
|
document.getElementById(activeTab.getAttribute("id"))?.classList.add("show","active");
|
|
activeTab = activeTab.parentNode.closest(".tab-pane");
|
|
}
|
|
|
|
while (activeCollapse) {
|
|
activeCollapse.classList.add("show");
|
|
activeCollapse = activeCollapse.parentNode.closest(".collapse:not(.show)");
|
|
}
|
|
|
|
element.focus();
|
|
}
|
|
|
|
document.getElementById('tab-general')?.addEventListener('click', function (e) {
|
|
let element = e.target.closest(".copy-btn");
|
|
|
|
if (element) {
|
|
let currentLangPane = e.target.closest("[data-v-language].tab-pane");
|
|
let firstLangPane = document.querySelector("[data-v-language].tab-pane");
|
|
|
|
let content = {};
|
|
firstLangPane.querySelectorAll("input, textarea").forEach(el => {
|
|
let name = el.name;
|
|
let index = name.lastIndexOf("[");
|
|
if (index) {
|
|
name = name.substr(index + 1, name.length - index - 2);
|
|
}
|
|
if (name == 'language_id') return;
|
|
if (el.tagName == "TEXTAREA" && el.id) {
|
|
let tiny = tinymce.get(el.id);
|
|
if (tiny) {
|
|
content[name + "_mce"] = tiny.getContent();
|
|
}
|
|
}
|
|
content[name] = el.value;
|
|
});
|
|
|
|
currentLangPane.querySelectorAll("input, textarea").forEach(el => {
|
|
let name = el.name;
|
|
let index = name.lastIndexOf("[");
|
|
if (index) {
|
|
name = name.substr(index + 1, name.length - index - 2);
|
|
}
|
|
if (name == 'language_id') return;
|
|
if (el.tagName == "TEXTAREA" && el.id) {
|
|
let tiny = tinymce.get(el.id);
|
|
if (tiny) {
|
|
tiny.setContent(content[name + "_mce"]);
|
|
}
|
|
}
|
|
el.value = content[name];
|
|
});
|
|
|
|
e.preventDefault();
|
|
}
|
|
}); |