persistent folder state
This commit is contained in:
@@ -93,33 +93,38 @@ window.updateRowHighlight = function (checkbox) {
|
|||||||
|
|
||||||
export function loadFileList(folderParam) {
|
export function loadFileList(folderParam) {
|
||||||
const folder = folderParam || "root";
|
const folder = folderParam || "root";
|
||||||
// Request a recursive listing from the server.
|
const fileListContainer = document.getElementById("fileList");
|
||||||
|
|
||||||
|
// Hide the container while loading
|
||||||
|
fileListContainer.style.visibility = "hidden";
|
||||||
|
fileListContainer.innerHTML = "<div class='loader'>Loading files...</div>";
|
||||||
|
|
||||||
return fetch("getFileList.php?folder=" + encodeURIComponent(folder) + "&recursive=1&t=" + new Date().getTime())
|
return fetch("getFileList.php?folder=" + encodeURIComponent(folder) + "&recursive=1&t=" + new Date().getTime())
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
const fileListContainer = document.getElementById("fileList");
|
// Clear the container once data is loaded
|
||||||
fileListContainer.innerHTML = "";
|
fileListContainer.innerHTML = "";
|
||||||
if (data.files && data.files.length > 0) {
|
if (data.files && data.files.length > 0) {
|
||||||
// Map each file so that we have a full name that includes subfolder information.
|
|
||||||
// We assume that getFileList.php returns a property 'path' that contains the full relative path (e.g. "subfolder/filename.txt")
|
|
||||||
data.files = data.files.map(file => {
|
data.files = data.files.map(file => {
|
||||||
// If file.path exists, use that; otherwise fallback to file.name.
|
|
||||||
file.fullName = (file.path || file.name).trim().toLowerCase();
|
file.fullName = (file.path || file.name).trim().toLowerCase();
|
||||||
return file;
|
return file;
|
||||||
});
|
});
|
||||||
// Save fileData and render file table using your full list.
|
|
||||||
fileData = data.files;
|
fileData = data.files;
|
||||||
renderFileTable(folder);
|
renderFileTable(folder);
|
||||||
} else {
|
} else {
|
||||||
fileListContainer.textContent = "No files found.";
|
fileListContainer.textContent = "No files found.";
|
||||||
updateFileActionButtons();
|
updateFileActionButtons();
|
||||||
}
|
}
|
||||||
// Return the full file objects.
|
|
||||||
return data.files || [];
|
return data.files || [];
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
console.error("Error loading file list:", error);
|
console.error("Error loading file list:", error);
|
||||||
|
fileListContainer.textContent = "Error loading files.";
|
||||||
return [];
|
return [];
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
// Make the container visible after processing
|
||||||
|
fileListContainer.style.visibility = "visible";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +222,7 @@ export function renderFileTable(folder) {
|
|||||||
let previewIcon = "";
|
let previewIcon = "";
|
||||||
if (/\.(jpg|jpeg|png|gif|bmp|webp|svg|ico|tif|tiff|eps|heic)$/i.test(file.name)) {
|
if (/\.(jpg|jpeg|png|gif|bmp|webp|svg|ico|tif|tiff|eps|heic)$/i.test(file.name)) {
|
||||||
previewIcon = `<i class="material-icons">image</i>`;
|
previewIcon = `<i class="material-icons">image</i>`;
|
||||||
} else if (/\.(mp4|webm|mov|ogg)$/i.test(file.name)) {
|
} else if (/\.(mp4|webm|ogg)$/i.test(file.name)) {
|
||||||
previewIcon = `<i class="material-icons">videocam</i>`;
|
previewIcon = `<i class="material-icons">videocam</i>`;
|
||||||
} else if (/\.pdf$/i.test(file.name)) {
|
} else if (/\.pdf$/i.test(file.name)) {
|
||||||
previewIcon = `<i class="material-icons">picture_as_pdf</i>`;
|
previewIcon = `<i class="material-icons">picture_as_pdf</i>`;
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ function renderFolderTree(tree, parentPath = "", defaultDisplay = "block") {
|
|||||||
const hasChildren = Object.keys(tree[folder]).length > 0;
|
const hasChildren = Object.keys(tree[folder]).length > 0;
|
||||||
// Use saved state if exists; otherwise use the defaultDisplay.
|
// Use saved state if exists; otherwise use the defaultDisplay.
|
||||||
const displayState = state[fullPath] !== undefined ? state[fullPath] : defaultDisplay;
|
const displayState = state[fullPath] !== undefined ? state[fullPath] : defaultDisplay;
|
||||||
const ulClass = displayState === "none" ? "collapsed" : "expanded";
|
|
||||||
html += `<li class="folder-item">`;
|
html += `<li class="folder-item">`;
|
||||||
if (hasChildren) {
|
if (hasChildren) {
|
||||||
const toggleSymbol = (displayState === "none") ? "[+]" : "[-]";
|
const toggleSymbol = (displayState === "none") ? "[+]" : "[-]";
|
||||||
@@ -169,20 +168,31 @@ export async function loadFolderTree(selectedFolder) {
|
|||||||
container.innerHTML = html;
|
container.innerHTML = html;
|
||||||
console.log("Rendered folder tree HTML:", container.innerHTML);
|
console.log("Rendered folder tree HTML:", container.innerHTML);
|
||||||
|
|
||||||
|
// Use the provided selectedFolder if available,
|
||||||
|
// otherwise check localStorage for the last opened folder.
|
||||||
if (selectedFolder) {
|
if (selectedFolder) {
|
||||||
window.currentFolder = selectedFolder;
|
window.currentFolder = selectedFolder;
|
||||||
} else if (!window.currentFolder) {
|
} else {
|
||||||
window.currentFolder = "root";
|
window.currentFolder = localStorage.getItem("lastOpenedFolder") || "root";
|
||||||
}
|
}
|
||||||
|
localStorage.setItem("lastOpenedFolder", window.currentFolder);
|
||||||
|
|
||||||
document.getElementById("fileListTitle").textContent =
|
document.getElementById("fileListTitle").textContent =
|
||||||
window.currentFolder === "root" ? "Files in (Root)" : "Files in (" + window.currentFolder + ")";
|
window.currentFolder === "root" ? "Files in (Root)" : "Files in (" + window.currentFolder + ")";
|
||||||
loadFileList(window.currentFolder);
|
loadFileList(window.currentFolder);
|
||||||
|
|
||||||
if (window.currentFolder !== "root") {
|
const folderState = loadFolderTreeState();
|
||||||
|
if (window.currentFolder !== "root" && folderState[window.currentFolder] !== "none") {
|
||||||
expandTreePath(window.currentFolder);
|
expandTreePath(window.currentFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- NEW SNIPPET: Highlight the current folder ---
|
||||||
|
const selectedEl = container.querySelector(`.folder-option[data-folder="${window.currentFolder}"]`);
|
||||||
|
if (selectedEl) {
|
||||||
|
selectedEl.classList.add("selected");
|
||||||
|
}
|
||||||
|
// ----------------------------------------------------
|
||||||
|
|
||||||
// Attach events to folder options.
|
// Attach events to folder options.
|
||||||
container.querySelectorAll(".folder-option").forEach(el => {
|
container.querySelectorAll(".folder-option").forEach(el => {
|
||||||
el.addEventListener("click", function (e) {
|
el.addEventListener("click", function (e) {
|
||||||
@@ -191,6 +201,7 @@ export async function loadFolderTree(selectedFolder) {
|
|||||||
this.classList.add("selected");
|
this.classList.add("selected");
|
||||||
const selected = this.getAttribute("data-folder");
|
const selected = this.getAttribute("data-folder");
|
||||||
window.currentFolder = selected;
|
window.currentFolder = selected;
|
||||||
|
localStorage.setItem("lastOpenedFolder", selected);
|
||||||
document.getElementById("fileListTitle").textContent =
|
document.getElementById("fileListTitle").textContent =
|
||||||
selected === "root" ? "Files in (Root)" : "Files in (" + selected + ")";
|
selected === "root" ? "Files in (Root)" : "Files in (" + selected + ")";
|
||||||
loadFileList(selected);
|
loadFileList(selected);
|
||||||
@@ -303,6 +314,7 @@ document.getElementById("submitRenameFolder").addEventListener("click", function
|
|||||||
if (data.success) {
|
if (data.success) {
|
||||||
showToast("Folder renamed successfully!");
|
showToast("Folder renamed successfully!");
|
||||||
window.currentFolder = newFolderFull;
|
window.currentFolder = newFolderFull;
|
||||||
|
localStorage.setItem("lastOpenedFolder", newFolderFull);
|
||||||
loadFolderList(newFolderFull);
|
loadFolderList(newFolderFull);
|
||||||
} else {
|
} else {
|
||||||
showToast("Error: " + (data.error || "Could not rename folder"));
|
showToast("Error: " + (data.error || "Could not rename folder"));
|
||||||
@@ -343,6 +355,7 @@ document.getElementById("confirmDeleteFolder").addEventListener("click", functio
|
|||||||
showToast("Folder deleted successfully!");
|
showToast("Folder deleted successfully!");
|
||||||
// Set current folder to the parent folder, not root
|
// Set current folder to the parent folder, not root
|
||||||
window.currentFolder = getParentFolder(selectedFolder);
|
window.currentFolder = getParentFolder(selectedFolder);
|
||||||
|
localStorage.setItem("lastOpenedFolder", window.currentFolder);
|
||||||
loadFolderList(window.currentFolder);
|
loadFolderList(window.currentFolder);
|
||||||
} else {
|
} else {
|
||||||
showToast("Error: " + (data.error || "Could not delete folder"));
|
showToast("Error: " + (data.error || "Could not delete folder"));
|
||||||
@@ -386,6 +399,7 @@ document.getElementById("submitCreateFolder").addEventListener("click", function
|
|||||||
if (data.success) {
|
if (data.success) {
|
||||||
showToast("Folder created successfully!");
|
showToast("Folder created successfully!");
|
||||||
window.currentFolder = fullFolderName;
|
window.currentFolder = fullFolderName;
|
||||||
|
localStorage.setItem("lastOpenedFolder", fullFolderName);
|
||||||
loadFolderList(fullFolderName);
|
loadFolderList(fullFolderName);
|
||||||
} else {
|
} else {
|
||||||
showToast("Error: " + (data.error || "Could not create folder"));
|
showToast("Error: " + (data.error || "Could not create folder"));
|
||||||
|
|||||||
Reference in New Issue
Block a user