Skip to content

Commit 508f788

Browse files
committed
Theme ajax page loading support
1 parent 9559ba0 commit 508f788

File tree

4 files changed

+87
-56
lines changed

4 files changed

+87
-56
lines changed

public/js/app.js

+83-53
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,25 @@ VvvebTheme.Ajax = {
6464
.then(data => {
6565
if (selector) {
6666
let response = new DOMParser().parseFromString(data, "text/html");
67-
if (Array.isArray (selector) ) {
68-
for (k in selector) {
69-
let elementSelector = selector[k];
70-
let currentElement = document.querySelector(elementSelector);
71-
let newElement = response.querySelector(elementSelector);
72-
if (currentElement && newElement) {
73-
currentElement.replaceWith(newElement);
74-
}
75-
}
76-
} else {
77-
let currentElement = document.querySelector(selector);
78-
let newElement = response.querySelector(selector);
79-
if (currentElement && newElement) {
80-
currentElement.replaceWith(newElement);
81-
}
67+
if (!Array.isArray (selector) ) {
68+
selector = [selector];
69+
}
70+
71+
for (k in selector) {
72+
let elementSelector = selector[k];
73+
let currentElements = document.querySelectorAll(elementSelector);
74+
let newElements = response.querySelectorAll(elementSelector);
75+
76+
if (currentElements && newElements) {
77+
currentElements.forEach( (e, i) => {e.replaceWith(newElements[i])});
78+
} /*if (currentElements) {
79+
currentElements.forEach(e => e.remove());
80+
} else if (newElements) {
81+
//new elements don't have corresponding elements on the page, reload hole page
82+
response = new DOMParser().parseFromString(data, "text/html")
83+
document.querySelector("body").replaceWith(response.querySelector("body"));
84+
break;
85+
}*/
8286
}
8387
}
8488

@@ -410,7 +414,7 @@ VvvebTheme.Gui = {
410414
}
411415
}
412416

413-
VvvebTheme.Cart.add(id, options, this, '.mini-cart', function() {
417+
VvvebTheme.Cart.add(id, options, this, ['.mini-cart', '[data-v-notifications]'], function() {
414418
let src = img.getAttribute("src");
415419
VvvebTheme.Alert.show(`
416420
<div class="clearfix">
@@ -458,7 +462,7 @@ VvvebTheme.Gui = {
458462
}
459463
}
460464

461-
VvvebTheme.Cart.remove(id, this, '.mini-cart', function() {
465+
VvvebTheme.Cart.remove(id, this, ['.mini-cart', '[data-v-notifications]'], function() {
462466
VvvebTheme.Alert.show('<img height=50 src="' + img + '"> &ensp; <strong>' + name +'</strong> was removed from cart');
463467
product.remove();
464468
});
@@ -649,13 +653,15 @@ let delay = (function(){
649653
};
650654
})();
651655

656+
function isEditor () {
657+
return document.getElementById("vvvebjs-styles") || window.location.href.includes('r=');
658+
}
652659

653660
let urlCache = {};
654661

655662
function preloadUrl(e) {
656663
delay(() => loadUrl(e, true), 200);
657664
}
658-
659665

660666
//ajax url
661667
function loadAjax(url, selector, callback = null, params = {}, method = "get") {
@@ -668,27 +674,38 @@ function loadAjax(url, selector, callback = null, params = {}, method = "get") {
668674

669675
fetch(url, options).
670676
then((response) => {
671-
if (!response.ok) { throw new Error(response) }
677+
//if (!response.ok) { throw new Error(response) }
672678
return response.text()
673-
}).then(function (data) {
679+
}).
680+
then(function (data) {
674681
if (selector) {
675682
let response = new DOMParser().parseFromString(data, "text/html");
676683

677-
if (Array.isArray (selector) ) {
678-
for (k in selector) {
679-
let elementSelector = selector[k];
680-
let currentElement = document.querySelector(elementSelector);
681-
let newElement = response.querySelector(elementSelector);
682-
if (currentElement && newElement) {
683-
currentElement.replaceWith(newElement);
684+
if (!Array.isArray (selector) ) {
685+
selector = [selector];
686+
}
687+
688+
for (k in selector) {
689+
let elementSelector = selector[k];
690+
let currentElements = document.querySelectorAll(elementSelector);
691+
let newElements = response.querySelectorAll(elementSelector);
692+
693+
if (currentElements && newElements) {
694+
if (currentElements.length != newElements.length) {
695+
//new elements does not match corresponding elements on the page, reload hole page
696+
response = new DOMParser().parseFromString(data, "text/html")
697+
document.querySelector("body").replaceWith(response.querySelector("body"));
698+
break;
684699
}
685-
}
686-
} else {
687-
let currentElement = document.querySelector(selector);
688-
let newElement = response.querySelector(selector);
689-
690-
if (currentElement && newElement) {
691-
currentElement.replaceWith(newElement);
700+
701+
currentElements.forEach( (e, i) => {e.replaceWith(newElements[i])});
702+
} if (currentElements) {
703+
currentElements.forEach(e => e.remove());
704+
} else if (newElements) {
705+
//new elements don't have corresponding elements on the page, reload hole page
706+
response = new DOMParser().parseFromString(data, "text/html")
707+
document.querySelector("body").replaceWith(response.querySelector("body"));
708+
break;
692709
}
693710
}
694711

@@ -701,25 +718,38 @@ function loadAjax(url, selector, callback = null, params = {}, method = "get") {
701718
});
702719
}
703720

704-
document.addEventListener("click", function (e) {
705-
let element = e.target.closest("a[data-url]");
706-
if (element) {
707-
let selector = element.dataset.selector ?? "";
708-
let url = element.getAttribute("href") ?? "";
709-
710-
if (!url) return;
711-
712-
loadAjax(url, selector, () => {
713-
if (element.dataset.scroll) {
714-
let target = document.querySelector(selector);
715-
target.scrollIntoView({behavior: "smooth", block: element.dataset.scroll ?? "center", inline: "center"});
716-
}
717-
window.history.pushState({url, selector}, null, url);
718-
});
719-
720-
e.preventDefault();
721-
}
722-
});
721+
722+
VvvebTheme.ajax = {
723+
selector:"a[data-url], a[data-page-url], a[data-v-menu-item-url], a[data-v-post-url], a[data-v-product-url], a[data-v-cat-url], a[data-v-archive-url], a[data-v-admin-url], a[data-v-post-author-url], a[data-v-breadcrumb-item-url], a[data-v-categories-cat-url]",
724+
siteContainer:["#site-content", "body > section"],
725+
scrollContainer:"body",
726+
skipUrl:[]
727+
}
728+
729+
if (!isEditor()) {
730+
document.addEventListener("click", function (e) {
731+
let element = e.target.closest(VvvebTheme.ajax.selector);
732+
if (element) {
733+
let url = element.getAttribute("href") ?? "";
734+
if (!url || (url.indexOf("//") != -1) //external url
735+
|| (VvvebTheme.ajax.skipUrl.length && (VvvebTheme.ajax.skipUrl.includes(url) || VvvebTheme.ajax.skipUrl.includes(window.location.pathname)))
736+
) return;
737+
738+
let selector = element.dataset.selector ?? VvvebTheme.ajax.siteContainer;
739+
740+
loadAjax(url, selector, () => {
741+
//if (element.dataset.scroll) {
742+
let target = document.querySelector(VvvebTheme.ajax.scrollContainer);
743+
let scrollTo = element.dataset.scroll ?? (selector == VvvebTheme.ajax.siteContainer ? "start" : "center");
744+
target.scrollIntoView({behavior: "smooth", block: scrollTo, inline: scrollTo});
745+
//}
746+
window.history.pushState({url, selector}, null, url);
747+
});
748+
749+
e.preventDefault();
750+
}
751+
});
752+
}
723753

724754
addEventListener("popstate", checkState);
725755

public/js/filter.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ document.addEventListener("click", (event) => {
6767
}, 1000);
6868
}
6969
});
70-
70+
/*
7171
document.addEventListener("click", (event) => {
7272
let target = event.target.closest('.page-link');
7373
if (target) {
@@ -82,3 +82,4 @@ document.addEventListener("click", (event) => {
8282
event.preventDefault();
8383
}
8484
});
85+
*/

public/themes/blog-default

Submodule blog-default updated 89 files

public/themes/landing

Submodule landing updated 130 files

0 commit comments

Comments
 (0)