Semi working conditions for the new ui

This commit is contained in:
2026-02-05 18:54:16 +01:00
parent b554263808
commit 923c1d6f9a
7 changed files with 1004 additions and 762 deletions

View File

@@ -1,54 +1,67 @@
document.addEventListener('DOMContentLoaded', () => {
// ---------- DOM Elements ----------
const shell = document.getElementById("shell");
const topbar = document.getElementById("topbar");
const shell = document.getElementById("pexpo-core-shell");
const topbar = document.getElementById("pexpo-core-topbar");
const filterWrap = document.getElementById("filterWrap");
const filterBtn = document.getElementById("filterBtn");
const filterDrawer = document.getElementById("filterDrawer");
const drawerBackdrop = document.getElementById("drawerBackdrop");
const filterWrap = document.getElementById("pexpo-core-filterWrap");
const filterBtn = document.getElementById("pexpo-core-filterBtn");
const filterDrawer = document.getElementById("pexpo-core-filterDrawer");
const drawerBackdrop = document.getElementById("pexpo-core-drawerBackdrop");
const filterJson = document.getElementById("filterJson");
const jsonError = document.getElementById("jsonError");
const filterLabel = document.getElementById("filterLabel");
// const filterBody = document.getElementById("pexpo-core-filterBody");
// const filterLabel = document.getElementById("pexpo-core-filterLabel");
const filterFTag = document.getElementById("pexpo-core-tag-toggle");
const filterTags = document.getElementById("pexpo-core-tags");
const qInput = document.getElementById("q");
const masonry = document.getElementById("masonry");
const measure = document.getElementById("measure");
const qInput = document.getElementById("pexpo-core-q");
const masonry = document.getElementById("pexpo-core-masonry");
const measure = document.getElementById("pexpo-core-measure");
const count = document.getElementById("count");
const layoutMeta = document.getElementById("layoutMeta");
const sortSelect = document.getElementById("sortSelect");
const count = document.getElementById("pexpo-core-count");
const layoutMeta = document.getElementById("pexpo-core-layoutMeta");
const sortSelect = document.getElementById("pexpo-core-sortSelect");
// ---------- State ----------
let filters = {
q: "",
sort: "relevance",
status: ["active", "archived"],
tags: ["ui", "mock"],
maxResults: 20
force_tags: false,
tags: [],
resultsPerPage: 20,
page: 1,
};
let activeSortKey = "relevance";
let results = []; // Fills via Ajax
let results = [];
// ---------- Sort Definitions ---------- LEFTOVER FROM TESTING REMOVE IN PROD
// ---------- Initialize MultiSelect Library ----------
if (typeof MultiSelect !== 'undefined') {
new MultiSelect(filterTags, {
// max: 20,
search: true,
selectAll: false,
onSelect: function(value) {
if (!filters.tags.includes(value)) {
filters.tags.push(value);
}
console.log('Updated filters.tags:', filters.tags);
},
onUnselect: function(value) {
filters.tags = filters.tags.filter(tag => tag !== value);
console.log('Updated filters.tags:', filters.tags);
}
});
} else {
console.warn("MultiSelect library not found. Filters will not work without it.");
}
// ---------- Sort Definitions ----------
const SORTS = {
relevance: {
label: "Relevance",
compare: (a, b) => (b.relevance - a.relevance) || (b.score - a.score)
},
score_desc: {
label: "Score (high → low)",
compare: (a, b) => (b.score - a.score)
},
date_desc: {
label: "Date (new → old)",
compare: (a, b) => new Date(b.updated) - new Date(a.updated)
},
title_asc: {
label: "Title (A → Z)",
compare: (a, b) => (a.title || "").localeCompare(b.title || "")
}
relevance: "Relevánsság (legjobb → legrosszabb)",
date_desc: "Dátum (új → régi)",
date_asc: "Dátum (régi → új)",
title_asc: "Cím (A → Z)",
title_desc: "Cím (Z → A)",
};
// ---------- Helpers ----------
@@ -58,6 +71,13 @@ document.addEventListener('DOMContentLoaded', () => {
}[s]));
}
function encodeDataToURL(data) {
return Object
.keys(data)
.map(value => `${value}=${encodeURIComponent(data[value])}`)
.join('&');
}
function cardEl(r) {
const div = document.createElement("div");
div.className = "pexpo-core-card";
@@ -86,12 +106,12 @@ document.addEventListener('DOMContentLoaded', () => {
}
// ---------- Ajax Function ----------
async function fetchData(query = "") {
async function fetchData() {
// 1. Show loading state if needed
masonry.style.opacity = "0.5";
try {
const response = await fetch(`/wp-json/pexpo/v1/query?q=${encodeURIComponent(query)}&limit=${filters.maxResults}`);
const response = await fetch(`/wp-json/pexpo/v1/query?${encodeDataToURL(filters)}`);
const data = await response.json();
results = data;
@@ -106,21 +126,6 @@ document.addEventListener('DOMContentLoaded', () => {
}
}
// FOR TESTING ONLY REMOVE IN PROD
// function computeLocalRelevance(query) {
// if (!query) {
// results.forEach(r => r.relevance = r.score);
// return;
// }
// const q = query.toLowerCase();
// results.forEach(r => {
// let hits = 0;
// if (r.title.toLowerCase().includes(q)) hits += 50;
// if (r.desc.toLowerCase().includes(q)) hits += 20;
// r.relevance = hits + r.score;
// });
// }
// ---------- Layout & Masonry Logic ----------
const minCard = () => Number(getComputedStyle(document.documentElement).getPropertyValue("--cardMin")) || 240;
const gap = () => Number(getComputedStyle(document.documentElement).getPropertyValue("--gap")) || 12;
@@ -215,7 +220,7 @@ document.addEventListener('DOMContentLoaded', () => {
colEls[p.col].appendChild(cardEl(p.item.r));
}
layoutMeta.textContent = `${cols} cols • ${SORTS[activeSortKey]?.label || "Relevance"}`;
// layoutMeta.textContent = `${cols} oszlop • ${SORTS[activeSortKey]?.label || "Relevance"}`;
}
// ---------- UI Events ----------
@@ -223,22 +228,35 @@ document.addEventListener('DOMContentLoaded', () => {
// Sort Dropdown
if (sortSelect) {
sortSelect.innerHTML = Object.entries(SORTS)
.map(([k, def]) => `<option value="${escapeHtml(k)}">${escapeHtml(def.label)}</option>`)
.map(([k, label]) => `<option value="${escapeHtml(k)}">${escapeHtml(label)}</option>`)
.join("");
sortSelect.value = activeSortKey;
sortSelect.addEventListener("change", () => {
activeSortKey = sortSelect.value;
requestLayout();
filters.sort = activeSortKey;
fetchData();
});
}
// Search
qInput.addEventListener("keydown", (e) => {
if (e.key === "Enter") {
fetchData(qInput.value.trim());
filters.q = qInput.value.trim();
fetchData();
}
});
// Tag Toggle
filterFTag.addEventListener("change", () => {
filters.force_tags = filterFTag.checked;
});
// Tags multiselect
filterTags.addEventListener("change", (value, text, element) => {
console.log('Change:', value, text, element);
});
// Filter Drawer Logic
function syncTopbarHeight() {
const h = topbar.offsetHeight;
@@ -256,7 +274,6 @@ document.addEventListener('DOMContentLoaded', () => {
shell.classList.toggle("pexpo-core-drawerOpen", open);
syncTopbarHeight();
if (open) filterJson.focus();
}
filterBtn.addEventListener("click", () => setOpen(!filterDrawer.classList.contains("pexpo-core-open")));
@@ -265,30 +282,31 @@ document.addEventListener('DOMContentLoaded', () => {
if (e.key === "Escape" && filterDrawer.classList.contains("pexpo-core-open")) setOpen(false);
});
// Apply JSON Filter
function applyJson() {
try {
const parsed = JSON.parse(filterJson.value);
jsonError.classList.remove("pexpo-core-show");
filters = parsed;
filterLabel.textContent = (filters.category || "Custom");
// // Apply JSON Filter
// function applyJson() {
// try {
// const parsed = JSON.parse(filterJson.value);
// jsonError.classList.remove("pexpo-core-show");
// filters = parsed;
// filterLabel.textContent = (filters.category || "Custom");
// Trigger new search with new filters
fetchData(qInput.value.trim());
// // Trigger new search with new filters
// filters.q = qInput.value.trim();
// fetchData();
// Close drawer on success (optional)
// setOpen(false);
} catch (err) {
jsonError.classList.add("pexpo-core-show");
}
}
// // Close drawer on success (optional)
// // setOpen(false);
// } catch (err) {
// jsonError.classList.add("pexpo-core-show");
// }
// }
filterJson.addEventListener("keydown", (e) => {
if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {
e.preventDefault();
applyJson();
}
});
// filterJson.addEventListener("keydown", (e) => {
// if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {
// e.preventDefault();
// applyJson();
// }
// });
// Resize Observer
const ro = new ResizeObserver(() => {
@@ -299,8 +317,9 @@ document.addEventListener('DOMContentLoaded', () => {
ro.observe(masonry);
// Initial Load
initFilters();
syncTopbarHeight();
fetchData("");
fetchData();
// --- Temporary Mock Response Generator (DELETE ME IN PRODUCTION) ---
function simulateBackendResponse(q) {