220 lines
6.4 KiB
JavaScript
220 lines
6.4 KiB
JavaScript
// OPTIONS SHEET — Ordinamento, raggruppamento e filtri.
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
const optionsSheet = document.getElementById("optionsSheet");
|
|
const sheetOverlay = document.getElementById("sheetOverlay");
|
|
const optionsBtn = document.getElementById("optionsBtn");
|
|
|
|
if (!optionsSheet || !sheetOverlay || !optionsBtn) {
|
|
console.warn("[optionsSheet] Elementi del pannello non trovati.");
|
|
return;
|
|
}
|
|
|
|
const searchInput = document.getElementById("gallerySearch");
|
|
const yearSelect = document.getElementById("galleryYear");
|
|
const monthSelect = document.getElementById("galleryMonth");
|
|
const folderSelect = document.getElementById("galleryFolder");
|
|
|
|
function isPhotoMode() {
|
|
return window.state?.mode === "photos";
|
|
}
|
|
|
|
function updateSheetVisibility() {
|
|
optionsSheet.querySelectorAll("[data-photo-filter], [data-filter]")
|
|
.forEach((element) => {
|
|
element.style.display =
|
|
isPhotoMode() ? "" : "none";
|
|
});
|
|
}
|
|
|
|
function populateYears(serverYears = null) {
|
|
if (!yearSelect) return;
|
|
|
|
const previous = yearSelect.value;
|
|
const years = new Set();
|
|
|
|
if (Array.isArray(serverYears)) {
|
|
for (const value of serverYears) {
|
|
const year = Number(value);
|
|
if (Number.isInteger(year) && year >= 1000 && year <= 9999) {
|
|
years.add(year);
|
|
}
|
|
}
|
|
} else {
|
|
const items = window.getLocalItems?.() || [];
|
|
for (const item of items) {
|
|
if (!item?.taken_at) continue;
|
|
const date = new Date(item.taken_at);
|
|
if (!Number.isNaN(date.getTime())) years.add(date.getFullYear());
|
|
}
|
|
}
|
|
|
|
yearSelect.replaceChildren();
|
|
|
|
const all = document.createElement("option");
|
|
all.value = "";
|
|
all.textContent = "Tutti gli anni";
|
|
yearSelect.appendChild(all);
|
|
|
|
[...years].sort((a, b) => b - a).forEach(year => {
|
|
const option = document.createElement("option");
|
|
option.value = String(year);
|
|
option.textContent = String(year);
|
|
yearSelect.appendChild(option);
|
|
});
|
|
|
|
yearSelect.value = years.has(Number(previous)) ? previous : "";
|
|
}
|
|
function populateFolders(serverFolders = null) {
|
|
if (!folderSelect) return;
|
|
|
|
const previous = window.currentFolder || "";
|
|
const folders = new Set();
|
|
|
|
if (Array.isArray(serverFolders)) {
|
|
for (const value of serverFolders) {
|
|
const folder = String(value || "").trim();
|
|
if (folder) folders.add(folder);
|
|
}
|
|
} else {
|
|
const items = window.getLocalItems?.() || [];
|
|
for (const item of items) {
|
|
const folder = String(item?.cartella || item?.folder || "").trim();
|
|
if (folder) folders.add(folder);
|
|
}
|
|
}
|
|
|
|
folderSelect.replaceChildren();
|
|
|
|
const all = document.createElement("option");
|
|
all.value = "";
|
|
all.textContent = "Tutte le cartelle";
|
|
folderSelect.appendChild(all);
|
|
|
|
[...folders].sort((a, b) =>
|
|
a.localeCompare(b, "it", { sensitivity: "base" })
|
|
).forEach(folder => {
|
|
const option = document.createElement("option");
|
|
option.value = folder;
|
|
option.textContent = folder;
|
|
folderSelect.appendChild(option);
|
|
});
|
|
|
|
folderSelect.value = folders.has(previous) ? previous : "";
|
|
if (previous && !folders.has(previous)) window.currentFolder = "";
|
|
}
|
|
async function openOptionsSheet() {
|
|
updateSheetVisibility();
|
|
|
|
let serverOptions = null;
|
|
if (isPhotoMode()) {
|
|
try {
|
|
const token = localStorage.getItem("token");
|
|
const showDeleted =
|
|
document.getElementById("showDeleted")?.checked ? "1" : "0";
|
|
|
|
const response = await fetch(
|
|
`/photos/gallery/options?showDeleted=${showDeleted}`,
|
|
{ headers: { Authorization: "Bearer " + token } }
|
|
);
|
|
|
|
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
|
serverOptions = await response.json();
|
|
} catch (error) {
|
|
console.error("[optionsSheet] errore opzioni server:", error);
|
|
}
|
|
}
|
|
|
|
populateYears(
|
|
Array.isArray(serverOptions?.years) ? serverOptions.years : null
|
|
);
|
|
populateFolders(
|
|
Array.isArray(serverOptions?.folders) ? serverOptions.folders : null
|
|
);
|
|
|
|
if (searchInput) {
|
|
searchInput.value = window.currentSearch || "";
|
|
}
|
|
if (yearSelect) {
|
|
yearSelect.value = window.currentYear || "";
|
|
}
|
|
if (monthSelect) {
|
|
monthSelect.value = window.currentMonth || "";
|
|
}
|
|
if (folderSelect) {
|
|
folderSelect.value = window.currentFolder || "";
|
|
}
|
|
|
|
optionsSheet.classList.add("open");
|
|
sheetOverlay.classList.add("open");
|
|
}
|
|
|
|
function closeOptionsSheet() {
|
|
optionsSheet.classList.remove("open");
|
|
sheetOverlay.classList.remove("open");
|
|
}
|
|
|
|
function resetFilters() {
|
|
window.currentFilter = "";
|
|
window.currentSearch = "";
|
|
window.currentYear = "";
|
|
window.currentMonth = "";
|
|
window.currentFolder = "";
|
|
|
|
if (searchInput) searchInput.value = "";
|
|
if (yearSelect) yearSelect.value = "";
|
|
if (monthSelect) monthSelect.value = "";
|
|
if (folderSelect) folderSelect.value = "";
|
|
|
|
refreshGallery();
|
|
}
|
|
|
|
optionsSheet.addEventListener("click", (event) => {
|
|
const btn = event.target.closest(".sheet-btn");
|
|
if (!btn) return;
|
|
|
|
if (btn.hasAttribute("data-reset-filters")) {
|
|
resetFilters();
|
|
closeOptionsSheet();
|
|
return;
|
|
}
|
|
|
|
const sort = btn.dataset.sort;
|
|
const group = btn.dataset.group;
|
|
const filter = btn.dataset.filter;
|
|
|
|
if (sort) window.currentSort = sort;
|
|
if (group) window.currentGroup = group;
|
|
|
|
if (filter !== undefined && isPhotoMode()) {
|
|
window.currentFilter = filter;
|
|
}
|
|
|
|
refreshGallery();
|
|
closeOptionsSheet();
|
|
});
|
|
|
|
function updateSearchAndDate() {
|
|
if (!isPhotoMode()) return;
|
|
|
|
window.currentSearch = searchInput?.value?.trim() || "";
|
|
window.currentYear = yearSelect?.value || "";
|
|
window.currentMonth = monthSelect?.value || "";
|
|
window.currentFolder = folderSelect?.value || "";
|
|
|
|
refreshGallery();
|
|
}
|
|
|
|
// La ricerca viene applicata mentre si digita.
|
|
searchInput?.addEventListener("input", updateSearchAndDate);
|
|
yearSelect?.addEventListener("change", updateSearchAndDate);
|
|
monthSelect?.addEventListener("change", updateSearchAndDate);
|
|
folderSelect?.addEventListener("change", updateSearchAndDate);
|
|
|
|
sheetOverlay.addEventListener("click", closeOptionsSheet);
|
|
optionsBtn.addEventListener("click", openOptionsSheet);
|
|
|
|
updateSheetVisibility();
|
|
|
|
window.openOptionsSheet = openOptionsSheet;
|
|
window.closeOptionsSheet = closeOptionsSheet;
|
|
});
|