+40
-14
@@ -526,27 +526,46 @@ function renderAttempt(attempt) {
|
||||
root.append(label, title, form);
|
||||
}
|
||||
|
||||
function filterChip(label, value, type, active) {
|
||||
function filterOption(label, value, type, active) {
|
||||
const button = document.createElement("button");
|
||||
button.className = `filter-chip${active ? " active" : ""}`;
|
||||
button.className = `filter-option${active ? " active" : ""}`;
|
||||
button.textContent = label;
|
||||
button.dataset[type] = value;
|
||||
button.setAttribute("role", "option");
|
||||
button.addEventListener("click", () => {
|
||||
if (type === "ability") state.videoAbility = value;
|
||||
if (type === "discipline") state.videoDiscipline = value;
|
||||
renderVideoFilters();
|
||||
renderVideos();
|
||||
closeFilterDropdowns();
|
||||
});
|
||||
return button;
|
||||
}
|
||||
|
||||
function closeFilterDropdowns() {
|
||||
$$(".filter-dropdown-panel").forEach((panel) => panel.classList.add("hidden"));
|
||||
$$(".filter-dropdown-toggle").forEach((toggle) => toggle.setAttribute("aria-expanded", "false"));
|
||||
}
|
||||
|
||||
function toggleFilterDropdown(type) {
|
||||
const panel = $(`#${type}-panel`);
|
||||
const toggle = $(`#${type}-toggle`);
|
||||
const isOpen = !panel.classList.contains("hidden");
|
||||
closeFilterDropdowns();
|
||||
if (!isOpen) {
|
||||
panel.classList.remove("hidden");
|
||||
toggle.setAttribute("aria-expanded", "true");
|
||||
}
|
||||
}
|
||||
|
||||
function renderVideoFilters() {
|
||||
if (!state.videoCatalog) return;
|
||||
const abilityRoot = $("#ability-filters");
|
||||
abilityRoot.replaceChildren(
|
||||
filterChip(`全部 ${state.videoCatalog.total}`, "", "ability", !state.videoAbility),
|
||||
|
||||
const abilityPanel = $("#ability-panel");
|
||||
abilityPanel.replaceChildren(
|
||||
filterOption(`全部 ${state.videoCatalog.total}`, "", "ability", !state.videoAbility),
|
||||
...state.videoCatalog.abilities.map((ability) =>
|
||||
filterChip(
|
||||
filterOption(
|
||||
`${ability.icon} ${ability.label} ${ability.count}`,
|
||||
ability.id,
|
||||
"ability",
|
||||
@@ -554,11 +573,14 @@ function renderVideoFilters() {
|
||||
)
|
||||
),
|
||||
);
|
||||
const disciplineRoot = $("#discipline-filters");
|
||||
disciplineRoot.replaceChildren(
|
||||
filterChip("全部专业", "", "discipline", !state.videoDiscipline),
|
||||
const abilityLabel = state.videoCatalog.abilities.find((a) => a.id === state.videoAbility);
|
||||
$("#ability-label").textContent = abilityLabel ? `${abilityLabel.icon} ${abilityLabel.label}` : "全部维度";
|
||||
|
||||
const disciplinePanel = $("#discipline-panel");
|
||||
disciplinePanel.replaceChildren(
|
||||
filterOption("全部专业", "", "discipline", !state.videoDiscipline),
|
||||
...state.videoCatalog.disciplines.map((discipline) =>
|
||||
filterChip(
|
||||
filterOption(
|
||||
`${discipline.icon || "∑"} ${discipline.name}`,
|
||||
discipline.name,
|
||||
"discipline",
|
||||
@@ -566,11 +588,10 @@ function renderVideoFilters() {
|
||||
)
|
||||
),
|
||||
);
|
||||
const disciplineLabel = state.videoCatalog.disciplines.find((d) => d.name === state.videoDiscipline);
|
||||
$("#discipline-label").textContent = disciplineLabel ? `${disciplineLabel.icon || "∑"} ${disciplineLabel.name}` : "全部专业";
|
||||
|
||||
const selected = state.videoCatalog.abilities.find(
|
||||
(item) => item.id === state.videoAbility
|
||||
);
|
||||
$("#video-stream-title").textContent = selected ? `${selected.label}视频流` : "全部视频";
|
||||
$("#video-stream-title").textContent = abilityLabel ? `${abilityLabel.label}视频流` : "全部视频";
|
||||
$$(".ability-node").forEach((node) => {
|
||||
node.classList.toggle("active", node.dataset.ability === state.videoAbility);
|
||||
});
|
||||
@@ -1128,6 +1149,11 @@ function bindUI() {
|
||||
});
|
||||
$("#enter-alumni").addEventListener("click", showLifeSkills);
|
||||
$("#back-to-hub").addEventListener("click", showLifeHub);
|
||||
$("#ability-toggle").addEventListener("click", () => toggleFilterDropdown("ability"));
|
||||
$("#discipline-toggle").addEventListener("click", () => toggleFilterDropdown("discipline"));
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!event.target.closest(".filter-dropdown")) closeFilterDropdowns();
|
||||
});
|
||||
$$(".route-card").forEach((card) => {
|
||||
card.addEventListener("click", (event) => {
|
||||
if (event.target.closest(".route-enter")) return;
|
||||
|
||||
Reference in New Issue
Block a user