fix(frontend): keep asset and homepage filters in DOM

This commit is contained in:
kate522 committed 2026-09-03 19:21:24 +08:00
1 parent a0adddce59
commit 7308f055c7
23 files changed
+362 -305

No files matched your search

+43 -89
View File
@@ -11,7 +11,6 @@
(function () {
'use strict';
var SORT_QUERY_KEY = 'home_sort';
var DEFAULT_SORT = 'modified';
var REST_PATH = '/wp-json/aksrt/v1/homepage/tab-posts';
@@ -19,10 +18,6 @@
* Utilities
* ============================================================ */
function getViewMode() {
return getDefaultView();
}
function getRenderedPostCount(scope) {
if (!scope) return 0;
return scope.querySelectorAll('.posts-item, .posts-mini').length;
@@ -42,7 +37,7 @@
function getDefaultSort() {
var configured = window.aksrtData && aksrtData.homepageDefaultSort;
var allowed = ['modified', 'date', 'downloads', 'views', 'likes', 'comments'];
var allowed = ['modified', 'date', 'views', 'like', 'comment_count', 'favorite', 'rand'];
return allowed.indexOf(configured) !== -1 ? configured : DEFAULT_SORT;
}
@@ -51,12 +46,6 @@
return panel && panel.getAttribute('data-view') === 'card' ? 'card' : 'list';
}
function isSortAjaxEnabled(sortbar) {
var attr = sortbar && sortbar.getAttribute('data-sort-ajax');
if (attr === 'false') return false;
return !(window.aksrtData && aksrtData.homepageSortAjax === false);
}
function isStickyTabsEnabled() {
return !(window.aksrtData && aksrtData.homepageStickyTabs === false);
}
@@ -66,14 +55,11 @@
return baseUrl.replace(/\/?$/, '');
}
function getSortFromUrl() {
return new URLSearchParams(window.location.search).get(SORT_QUERY_KEY) || getDefaultSort();
function getCurrentSort(stream) {
var activeLink = stream ? stream.querySelector('.aksrt-homepage__sortbar-link.is-active, .aksrt-homepage__sortbar-dropdown-item.is-active') : null;
return (activeLink && activeLink.getAttribute('data-sort')) || getDefaultSort();
}
function getCurrentSort(stream) {
var activeLink = stream ? stream.querySelector('.aksrt-homepage__sortbar-link.is-active') : null;
return (activeLink && activeLink.getAttribute('data-sort')) || getSortFromUrl();
}
function setActiveSortLink(sortbar, sort) {
var links = sortbar.querySelectorAll('.aksrt-homepage__sortbar-link, .aksrt-homepage__sortbar-dropdown-item');
@@ -88,20 +74,6 @@
}
}
function normalizeHomepageUrl(url) {
url.searchParams.delete('paged');
url.searchParams.delete('page');
url.pathname = url.pathname.replace(/\/page\/\d+\/?$/, '/');
return url;
}
function replaceUrlSort(sort) {
if (!window.history || !window.history.replaceState) return;
var url = normalizeHomepageUrl(new URL(window.location.href));
url.searchParams.set(SORT_QUERY_KEY, sort);
window.history.replaceState({}, '', url.toString());
}
function getStreamViewMode(stream) {
var panel = getActivePanel(stream);
return panel && panel.getAttribute('data-view') === 'card' ? 'card' : 'list';
@@ -124,12 +96,6 @@
return panel.getAttribute('data-tab-orderby') || '';
}
function getPanelSource(panel) {
var target = panel ? panel.getAttribute('data-home-tab-panel') : '';
if (target === 'latest') return 'home';
return target ? 'home' : 'widget';
}
function buildRestUrl(options) {
options = options || {};
return getRestBaseUrl() + REST_PATH +
@@ -137,9 +103,7 @@
'&page=' + encodeURIComponent(options.page || 1) +
'&per_page=' + encodeURIComponent(options.perPage || 10) +
'&sort=' + encodeURIComponent(options.sort || getDefaultSort()) +
'&page_url=' + encodeURIComponent(options.pageUrl || window.location.href) +
'&panel=' + encodeURIComponent(options.panel || 'latest') +
'&source=' + encodeURIComponent(options.source || 'home') +
'&tab_orderby=' + encodeURIComponent(options.tabOrderby || '');
}
@@ -149,7 +113,7 @@
/**
* Dispatch post_ajax.before — fired before AJAX request is sent.
* Detail: { termId, page, sort, viewMode, panel, source, url }
* Detail: { termId, page, sort, viewMode, panel, url }
*/
function dispatchBeforeEvent(container, detail) {
try {
@@ -162,7 +126,7 @@
/**
* Dispatch post_ajax.ed — fired after AJAX response is injected.
* Detail: { termId, page, sort, viewMode, panel, source, total, hasMore }
* Detail: { termId, page, sort, viewMode, panel, total, hasMore }
*/
function dispatchAfterEvent(container, detail) {
try {
@@ -245,18 +209,16 @@
button.addEventListener('click', function () {
button.disabled = true;
button.textContent = (window.aksrtData && aksrtData.ajaxLoading) || '正在加载...';
requestHomepagePanel(panel, {
termId: options.termId,
page: options.page + 1,
perPage: options.perPage,
sort: options.sort,
viewMode: options.viewMode,
pageUrl: options.pageUrl,
panel: options.panel,
source: options.source,
tabOrderby: options.tabOrderby,
append: true
});
requestHomepagePanel(panel, {
termId: options.termId,
page: options.page + 1,
perPage: options.perPage,
sort: options.sort,
viewMode: options.viewMode,
panel: options.panel,
tabOrderby: options.tabOrderby,
append: true
});
});
footer.appendChild(button);
panel.appendChild(footer);
@@ -293,33 +255,30 @@
* 4. aksrt:posts:rendered (after lazyload rebind)
*/
function requestHomepagePanel(panel, requestOptions) {
var options = {
termId: requestOptions.termId || 0,
page: requestOptions.page || 1,
perPage: requestOptions.perPage || getHomepagePerPage(panel),
sort: requestOptions.sort || getDefaultSort(),
viewMode: requestOptions.viewMode || getDefaultView(),
pageUrl: requestOptions.pageUrl || window.location.href,
panel: requestOptions.panel || panel.getAttribute('data-home-tab-panel') || 'latest',
source: requestOptions.source || getPanelSource(panel),
tabOrderby: requestOptions.tabOrderby || getPanelTabOrderby(panel) || '',
append: requestOptions.append === true
};
var options = {
termId: requestOptions.termId || 0,
page: requestOptions.page || 1,
perPage: requestOptions.perPage || getHomepagePerPage(panel),
sort: requestOptions.sort || getDefaultSort(),
viewMode: requestOptions.viewMode || getDefaultView(),
panel: requestOptions.panel || panel.getAttribute('data-home-tab-panel') || 'latest',
tabOrderby: requestOptions.tabOrderby || getPanelTabOrderby(panel) || '',
append: requestOptions.append === true
};
var restUrl = buildRestUrl(options);
var retryCount = 0;
var maxRetries = 1;
// 1. Pre-request event
dispatchBeforeEvent(panel, {
termId: options.termId,
page: options.page,
sort: options.sort,
viewMode: options.viewMode,
panel: options.panel,
source: options.source,
url: restUrl
});
dispatchBeforeEvent(panel, {
termId: options.termId,
page: options.page,
sort: options.sort,
viewMode: options.viewMode,
panel: options.panel,
url: restUrl
});
// Full refreshes replace the panel; append requests keep existing cards.
if (!options.append) {
@@ -365,11 +324,10 @@
dispatchAfterEvent(panel, {
termId: options.termId,
page: options.page,
sort: options.sort,
viewMode: options.viewMode,
panel: options.panel,
source: options.source,
total: data.total || 0,
sort: options.sort,
viewMode: options.viewMode,
panel: options.panel,
total: data.total || 0,
hasMore: !!data.has_more
});
@@ -393,7 +351,6 @@
sort: options.sort,
viewMode: options.viewMode,
panel: options.panel,
source: options.source,
total: 0,
hasMore: false
});
@@ -477,9 +434,8 @@
perPage: getHomepagePerPage(panel),
sort: currentSort,
viewMode: viewMode,
panel: target,
source: 'home',
tabOrderby: tabOrderby
panel: target,
tabOrderby: tabOrderby
});
}
}
@@ -600,7 +556,7 @@
function initSortbar() {
document.querySelectorAll('.aksrt-homepage__stream').forEach(function (stream) {
var sortbar = stream.querySelector('.aksrt-homepage__sortbar');
if (!sortbar || !isSortAjaxEnabled(sortbar)) return;
if (!sortbar) return;
sortbar.addEventListener('click', function (event) {
var link = event.target.closest('.aksrt-homepage__sortbar-link, .aksrt-homepage__sortbar-dropdown-item');
@@ -612,17 +568,15 @@
event.preventDefault();
setActiveSortLink(sortbar, sort);
replaceUrlSort(sort);
setActiveSortLink(sortbar, sort);
requestHomepagePanel(activePanel, {
requestHomepagePanel(activePanel, {
termId: termId,
page: 1,
perPage: getHomepagePerPage(activePanel),
sort: sort,
viewMode: getStreamViewMode(stream),
panel: activePanel.getAttribute('data-home-tab-panel') || 'latest',
source: 'home'
});
});
});