Browse Source

refactor(news): Simplify news category handling and improve tab activation logic

- Removed unused category constants and functions for cleaner code.
- Streamlined category retrieval and tab activation in the news section.
- Updated HTML to dynamically set active tab based on the current category.
master
peijunlei 2 weeks ago
parent
commit
0576e2a50a
  1. 51
      public/themes/dist_static/static/js/news2.js
  2. 11
      public/themes/website/1/zh/demo/news.html

51
public/themes/dist_static/static/js/news2.js

@ -1,11 +1,5 @@
//#region js/news.js
var NEWS_CATEGORY_PARAM = "cat";
var NEWS_CATEGORIES = [
"all",
"insight",
"company",
"event"
];
function setActiveNav() {
const pageNav = document.querySelector("[data-nav]")?.getAttribute("data-nav");
if (!pageNav) return;
@ -29,35 +23,17 @@ function newsDetailBackToggle() {
}
var featuredSwiper = null;
function getCategoryFromQuery() {
const cat = new URLSearchParams(window.location.search).get(NEWS_CATEGORY_PARAM);
if (!cat || cat === "all") return "all";
return NEWS_CATEGORIES.includes(cat) ? cat : "all";
}
function setCategoryInUrl(cat) {
const url = new URL(window.location.href);
if (!cat || cat === "all") url.searchParams.delete(NEWS_CATEGORY_PARAM);
else url.searchParams.set(NEWS_CATEGORY_PARAM, cat);
window.history.replaceState(null, "", url);
return new URLSearchParams(window.location.search).get(NEWS_CATEGORY_PARAM) || "";
}
function activateTab(cat) {
if (!cat) return;
const catStr = String(cat);
document.querySelectorAll(".n-tabs__item").forEach((btn) => {
const isActive = (btn.dataset.cat || "all") === cat;
const isActive = String(btn.dataset.cat || "") === catStr;
btn.classList.toggle("is-active", isActive);
btn.setAttribute("aria-selected", isActive ? "true" : "false");
});
}
function filterNews(cat) {
const isMatch = (itemCat) => cat === "all" || itemCat === cat;
document.querySelectorAll(".n-featured__slide[data-category]").forEach((slide) => {
slide.hidden = !isMatch(slide.dataset.category);
});
document.querySelectorAll(".n-card[data-category]").forEach((card) => {
card.hidden = !isMatch(card.dataset.category);
});
const featured = document.querySelector(".n-featured");
if (!featured) return;
featured.hidden = featured.querySelectorAll(".n-featured__slide:not([hidden])").length === 0;
}
function updateFeaturedSwiper() {
const root = document.querySelector(".n-featured");
const el = root?.querySelector(".n-featured__swiper");
@ -83,25 +59,12 @@ function updateFeaturedSwiper() {
}
});
}
function applyCategory(cat) {
activateTab(cat);
filterNews(cat);
updateFeaturedSwiper();
}
function initNewsTabs() {
const tabs = document.querySelector(".n-tabs");
if (!tabs) return;
applyCategory(getCategoryFromQuery());
tabs.addEventListener("click", (event) => {
const btn = event.target.closest(".n-tabs__item");
if (!btn) return;
const cat = btn.dataset.cat || "all";
setCategoryInUrl(cat);
applyCategory(cat);
});
window.addEventListener("popstate", () => {
applyCategory(getCategoryFromQuery());
});
const cat = getCategoryFromQuery();
if (cat) activateTab(cat);
updateFeaturedSwiper();
}
function newsCardClick() {
$(".n-card, .n-featured").on("click", function(event) {

11
public/themes/website/1/zh/demo/news.html

@ -75,9 +75,16 @@
<span>新闻动态</span>
</h1>
<div class="n-tabs" role="tablist" aria-label="新闻分类">
<a href="{$news_cate_info_alias}?cat={$news_cate_info['id']}" type="button" class="n-tabs__item is-active" role="tab" aria-selected="true" data-cat="all">全部</a>
{php}
$news_active_cat = (string)input('cat', '');
if ($news_active_cat === '' || $news_active_cat === 'all') {
$news_active_cat = (string)($current_cate_id ?: ($news_cate_info['id'] ?? ''));
}
$news_all_cat = (string)($news_cate_info['id'] ?? '');
{/php}
<a href="{$news_cate_info_alias}?cat={$news_cate_info['id']}" class="n-tabs__item{if $news_active_cat == $news_all_cat} is-active{/if}" role="tab" aria-selected="{if $news_active_cat == $news_all_cat}true{else /}false{/if}" data-cat="{$news_cate_info['id']}">全部</a>
{hcTaglib:subcategory pid="$news_cate_info['id']" item="vo" sort=""}
<a href="{$vo.alias}?cat={$vo['id']}" type="button" class="n-tabs__item" role="tab" aria-selected="false" data-cat="{$vo.id}">{$vo.title}</a>
<a href="{$vo.alias}?cat={$vo['id']}" class="n-tabs__item{if $news_active_cat == $vo['id']} is-active{/if}" role="tab" aria-selected="{if $news_active_cat == $vo['id']}true{else /}false{/if}" data-cat="{$vo.id}">{$vo.title}</a>
{/hcTaglib:subcategory}
</div>
</div>

Loading…
Cancel
Save