// domUtils.js import { t } from './i18n.js'; import { openDownloadModal } from './fileActions.js'; // Basic DOM Helpers export function toggleVisibility(elementId, shouldShow) { const element = document.getElementById(elementId); if (element) { element.style.display = shouldShow ? "block" : "none"; } else { console.error(t("element_not_found", { id: elementId })); } } export function escapeHTML(str) { return String(str) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } export function toggleAllCheckboxes(masterCheckbox) { const checkboxes = document.querySelectorAll(".file-checkbox"); checkboxes.forEach(chk => { chk.checked = masterCheckbox.checked; updateRowHighlight(chk); }); updateFileActionButtons(); } export function updateFileActionButtons() { const fileCheckboxes = document.querySelectorAll("#fileList .file-checkbox"); const selectedCheckboxes = document.querySelectorAll("#fileList .file-checkbox:checked"); const deleteBtn = document.getElementById("deleteSelectedBtn"); const copyBtn = document.getElementById("copySelectedBtn"); const moveBtn = document.getElementById("moveSelectedBtn"); const zipBtn = document.getElementById("downloadZipBtn"); const extractZipBtn = document.getElementById("extractZipBtn"); const createBtn = document.getElementById("createBtn"); const anyFiles = fileCheckboxes.length > 0; const anySelected = selectedCheckboxes.length > 0; const anyZip = Array.from(selectedCheckboxes) .some(cb => cb.value.toLowerCase().endsWith(".zip")); // — Select All checkbox sync (unchanged) — const master = document.getElementById("selectAll"); if (master) { if (selectedCheckboxes.length === fileCheckboxes.length) { master.checked = true; master.indeterminate = false; } else if (selectedCheckboxes.length === 0) { master.checked = false; master.indeterminate = false; } else { master.checked = false; master.indeterminate = true; } } // Delete / Copy / Move: only show when something is selected if (deleteBtn) { deleteBtn.style.display = anySelected ? "" : "none"; } if (copyBtn) { copyBtn.style.display = anySelected ? "" : "none"; } if (moveBtn) { moveBtn.style.display = anySelected ? "" : "none"; } // Download ZIP: only show when something is selected if (zipBtn) { zipBtn.style.display = anySelected ? "" : "none"; } // Extract ZIP: only show when a selected file is a .zip if (extractZipBtn) { extractZipBtn.style.display = anyZip ? "" : "none"; } // Create File: only show when nothing is selected if (createBtn) { createBtn.style.display = anySelected ? "none" : ""; } // Finally disable the ones that are shown but shouldn’t be clickable if (deleteBtn) deleteBtn.disabled = !anySelected; if (copyBtn) copyBtn.disabled = !anySelected; if (moveBtn) moveBtn.disabled = !anySelected; if (zipBtn) zipBtn.disabled = !anySelected; if (extractZipBtn) extractZipBtn.disabled = !anyZip; } export function showToast(message, duration = 3000) { const toast = document.getElementById("customToast"); if (!toast) { console.error("Toast element not found"); return; } toast.textContent = message; toast.style.display = "block"; // Force reflow for transition effect. void toast.offsetWidth; toast.classList.add("show"); setTimeout(() => { toast.classList.remove("show"); setTimeout(() => { toast.style.display = "none"; }, 500); }, duration); } // --- DOM Building Functions for File Table --- export function buildSearchAndPaginationControls({ currentPage, totalPages, searchTerm }) { const safeSearchTerm = escapeHTML(searchTerm); // Choose the placeholder text based on advanced search mode const placeholderText = window.advancedSearchEnabled ? t("search_placeholder_advanced") : t("search_placeholder"); return `
| ${t("file_name")} ${sortOrder.column === "name" ? (sortOrder.ascending ? "▲" : "▼") : ""} | ${t("actions")} | |
|---|---|---|
| ${safeFileName} |
${file.editable ? `
` : ""}
${previewButton}
|