smaller screen size fixes
This commit is contained in:
140
fileManager.js
140
fileManager.js
@@ -107,40 +107,42 @@ export function renderFileTable(folder) {
|
|||||||
const currentPage = window.currentPage || 1;
|
const currentPage = window.currentPage || 1;
|
||||||
const totalFiles = filteredFiles.length;
|
const totalFiles = filteredFiles.length;
|
||||||
const totalPages = Math.ceil(totalFiles / itemsPerPage);
|
const totalPages = Math.ceil(totalFiles / itemsPerPage);
|
||||||
|
const safeSearchTerm = escapeHTML(searchTerm);
|
||||||
// 1. Top controls: Responsive row with search box on the left and Prev/Next on the right.
|
// 1. Top controls: Responsive row with search box on the left and Prev/Next on the right.
|
||||||
const topControlsHTML = `
|
const topControlsHTML = `
|
||||||
<div class="row align-items-center mb-3">
|
<div class="row align-items-center mb-3">
|
||||||
<!-- Search box: occupies 8 columns on medium+ screens -->
|
<!-- Search box: full width on small, 8 columns on md+ -->
|
||||||
<div class="col-12 col-md-5">
|
<div class="col-12 col-md-8 mb-2 mb-md-0">
|
||||||
<div class="input-group" style="max-width: 500px;">
|
<div class="input-group" style="max-width: 100%;">
|
||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text" id="searchIcon">
|
<span class="input-group-text" id="searchIcon">
|
||||||
<i class="material-icons">search</i>
|
<i class="material-icons">search</i>
|
||||||
</span>
|
</span>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="searchInput"
|
||||||
|
class="form-control"
|
||||||
|
placeholder="Search files..."
|
||||||
|
value="${safeSearchTerm}"
|
||||||
|
aria-describedby="searchIcon"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Prev/Next buttons: full width on small, 4 columns on md+ -->
|
||||||
|
<div class="col-12 col-md-4 text-left">
|
||||||
|
<div class="d-flex justify-content-center justify-content-md-start align-items-center">
|
||||||
|
<button class="custom-prev-next-btn" ${currentPage === 1 ? "disabled" : ""} onclick="changePage(${currentPage - 1})">
|
||||||
|
Prev
|
||||||
|
</button>
|
||||||
|
<span style="margin: 0 8px; white-space: nowrap;">Page ${currentPage} of ${totalPages || 1}</span>
|
||||||
|
<button class="custom-prev-next-btn" ${currentPage === totalPages || totalFiles === 0 ? "disabled" : ""} onclick="changePage(${currentPage + 1})">
|
||||||
|
Next
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="searchInput"
|
|
||||||
class="form-control"
|
|
||||||
placeholder="Search files..."
|
|
||||||
value="${searchTerm}"
|
|
||||||
aria-describedby="searchIcon"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- Prev/Next buttons: occupies 4 columns on medium+ screens, left-aligned -->
|
`;
|
||||||
<div class="col-12 col-md-4 text-left mt-2 mt-md-0">
|
|
||||||
<button class="custom-prev-next-btn" ${currentPage === 1 ? "disabled" : ""} onclick="changePage(${currentPage - 1})">
|
|
||||||
Prev
|
|
||||||
</button>
|
|
||||||
<span style="margin: 0 8px;">Page ${currentPage} of ${totalPages || 1}</span>
|
|
||||||
<button class="custom-prev-next-btn" ${currentPage === totalPages || totalFiles === 0 ? "disabled" : ""} onclick="changePage(${currentPage + 1})">
|
|
||||||
Next
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
|
|
||||||
// 2. Build the File Table with Bootstrap styling.
|
// 2. Build the File Table with Bootstrap styling.
|
||||||
let tableHTML = `
|
let tableHTML = `
|
||||||
@@ -185,30 +187,32 @@ export function renderFileTable(folder) {
|
|||||||
const safeUploader = escapeHTML(file.uploader || "Unknown");
|
const safeUploader = escapeHTML(file.uploader || "Unknown");
|
||||||
|
|
||||||
tableBody += `
|
tableBody += `
|
||||||
<tr onclick="toggleRowSelection(event, '${safeFileName}')" style="cursor:pointer;">
|
<tr onclick="toggleRowSelection(event, '${safeFileName}')" style="cursor:pointer;">
|
||||||
<td>
|
<td>
|
||||||
<input type="checkbox" class="file-checkbox" value="${safeFileName}" onclick="event.stopPropagation(); updateRowHighlight(this);">
|
<input type="checkbox" class="file-checkbox" value="${safeFileName}" onclick="event.stopPropagation(); updateRowHighlight(this);">
|
||||||
</td>
|
</td>
|
||||||
<td>${safeFileName}</td>
|
<td>${safeFileName}</td>
|
||||||
<td class="hide-small" style="white-space: nowrap;">${safeModified}</td>
|
<td class="hide-small" style="white-space: nowrap;">${safeModified}</td>
|
||||||
<td class="hide-small" style="white-space: nowrap;">${safeUploaded}</td>
|
<td class="hide-small" style="white-space: nowrap;">${safeUploaded}</td>
|
||||||
<td class="hide-small" style="white-space: nowrap;">${safeSize}</td>
|
<td class="hide-small" style="white-space: nowrap;">${safeSize}</td>
|
||||||
<td class="hide-small" style="white-space: nowrap;">${safeUploader}</td>
|
<td class="hide-small" style="white-space: nowrap;">${safeUploader}</td>
|
||||||
<td>
|
<td>
|
||||||
<div style="display: inline-flex; align-items: center; gap: 5px;">
|
<div class="button-wrap">
|
||||||
<a class="btn btn-sm btn-success" href="${folderPath + encodeURIComponent(file.name)}" download>Download</a>
|
<a class="btn btn-sm btn-success" href="${folderPath + encodeURIComponent(file.name)}" download>
|
||||||
${isEditable ? `
|
Download
|
||||||
<button class="btn btn-sm btn-primary ml-2" onclick='editFile(${JSON.stringify(file.name)}, ${JSON.stringify(folder)})'>
|
</a>
|
||||||
Edit
|
${isEditable ? `
|
||||||
</button>
|
<button class="btn btn-sm btn-primary ml-2" onclick='editFile(${JSON.stringify(file.name)}, ${JSON.stringify(folder)})'>
|
||||||
` : ""}
|
Edit
|
||||||
<button class="btn btn-sm btn-warning ml-2" onclick='renameFile(${JSON.stringify(file.name)}, ${JSON.stringify(folder)})'>
|
|
||||||
Rename
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
` : ""}
|
||||||
</td>
|
<button class="btn btn-sm btn-warning ml-2" onclick='renameFile(${JSON.stringify(file.name)}, ${JSON.stringify(folder)})'>
|
||||||
</tr>
|
Rename
|
||||||
`;
|
</button>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
`;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
tableBody += `<tr><td colspan="7">No files found.</td></tr>`;
|
tableBody += `<tr><td colspan="7">No files found.</td></tr>`;
|
||||||
@@ -299,34 +303,34 @@ export function sortFiles(column, folder) {
|
|||||||
sortOrder.column = column;
|
sortOrder.column = column;
|
||||||
sortOrder.ascending = true;
|
sortOrder.ascending = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort fileData based on the column.
|
// Sort fileData based on the column.
|
||||||
fileData.sort((a, b) => {
|
fileData.sort((a, b) => {
|
||||||
let valA = a[column] || "";
|
let valA = a[column] || "";
|
||||||
let valB = b[column] || "";
|
let valB = b[column] || "";
|
||||||
|
|
||||||
if (column === "modified" || column === "uploaded") {
|
if (column === "modified" || column === "uploaded") {
|
||||||
// Log the raw date strings.
|
// Log the raw date strings.
|
||||||
//console.log(`Sorting ${column}: raw values ->`, valA, valB);
|
//console.log(`Sorting ${column}: raw values ->`, valA, valB);
|
||||||
|
|
||||||
const parsedA = parseCustomDate(valA);
|
const parsedA = parseCustomDate(valA);
|
||||||
const parsedB = parseCustomDate(valB);
|
const parsedB = parseCustomDate(valB);
|
||||||
|
|
||||||
// Log the parsed numeric timestamps.
|
// Log the parsed numeric timestamps.
|
||||||
//console.log(`Sorting ${column}: parsed values ->`, parsedA, parsedB);
|
//console.log(`Sorting ${column}: parsed values ->`, parsedA, parsedB);
|
||||||
|
|
||||||
valA = parsedA;
|
valA = parsedA;
|
||||||
valB = parsedB;
|
valB = parsedB;
|
||||||
} else if (typeof valA === "string") {
|
} else if (typeof valA === "string") {
|
||||||
valA = valA.toLowerCase();
|
valA = valA.toLowerCase();
|
||||||
valB = valB.toLowerCase();
|
valB = valB.toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (valA < valB) return sortOrder.ascending ? -1 : 1;
|
if (valA < valB) return sortOrder.ascending ? -1 : 1;
|
||||||
if (valA > valB) return sortOrder.ascending ? 1 : -1;
|
if (valA > valB) return sortOrder.ascending ? 1 : -1;
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Re-render the file table after sorting.
|
// Re-render the file table after sorting.
|
||||||
renderFileTable(folder);
|
renderFileTable(folder);
|
||||||
}
|
}
|
||||||
@@ -408,15 +412,15 @@ export async function loadCopyMoveFolderListForModal(dropdownId) {
|
|||||||
const response = await fetch('getFolderList.php');
|
const response = await fetch('getFolderList.php');
|
||||||
const folders = await response.json();
|
const folders = await response.json();
|
||||||
console.log('Folders fetched for modal:', folders);
|
console.log('Folders fetched for modal:', folders);
|
||||||
|
|
||||||
const folderSelect = document.getElementById(dropdownId);
|
const folderSelect = document.getElementById(dropdownId);
|
||||||
folderSelect.innerHTML = '';
|
folderSelect.innerHTML = '';
|
||||||
|
|
||||||
const rootOption = document.createElement('option');
|
const rootOption = document.createElement('option');
|
||||||
rootOption.value = 'root';
|
rootOption.value = 'root';
|
||||||
rootOption.textContent = '(Root)';
|
rootOption.textContent = '(Root)';
|
||||||
folderSelect.appendChild(rootOption);
|
folderSelect.appendChild(rootOption);
|
||||||
|
|
||||||
if (Array.isArray(folders) && folders.length > 0) {
|
if (Array.isArray(folders) && folders.length > 0) {
|
||||||
folders.forEach(folder => {
|
folders.forEach(folder => {
|
||||||
const option = document.createElement('option');
|
const option = document.createElement('option');
|
||||||
@@ -462,7 +466,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
showToast("Selected files copied successfully!", 5000);
|
showToast("Selected files copied successfully!", 5000);
|
||||||
loadFileList(window.currentFolder);
|
loadFileList(window.currentFolder);
|
||||||
} else {
|
} else {
|
||||||
showToast("Error: " + (data.error || "Could not copy files"), 5000);
|
showToast("Error: " + (data.error || "Could not copy files"), 5000);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => console.error("Error copying files:", error))
|
.catch(error => console.error("Error copying files:", error))
|
||||||
@@ -656,10 +660,10 @@ export function renameFile(oldName, folder) {
|
|||||||
// Store the file name and folder globally for use in the modal.
|
// Store the file name and folder globally for use in the modal.
|
||||||
window.fileToRename = oldName;
|
window.fileToRename = oldName;
|
||||||
window.fileFolder = folder || window.currentFolder || "root";
|
window.fileFolder = folder || window.currentFolder || "root";
|
||||||
|
|
||||||
// Pre-fill the input with the current file name.
|
// Pre-fill the input with the current file name.
|
||||||
document.getElementById("newFileName").value = oldName;
|
document.getElementById("newFileName").value = oldName;
|
||||||
|
|
||||||
// Show the rename file modal.
|
// Show the rename file modal.
|
||||||
document.getElementById("renameFileModal").style.display = "block";
|
document.getElementById("renameFileModal").style.display = "block";
|
||||||
}
|
}
|
||||||
@@ -669,16 +673,16 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
// Cancel button: hide modal and clear input.
|
// Cancel button: hide modal and clear input.
|
||||||
const cancelBtn = document.getElementById("cancelRenameFile");
|
const cancelBtn = document.getElementById("cancelRenameFile");
|
||||||
if (cancelBtn) {
|
if (cancelBtn) {
|
||||||
cancelBtn.addEventListener("click", function() {
|
cancelBtn.addEventListener("click", function () {
|
||||||
document.getElementById("renameFileModal").style.display = "none";
|
document.getElementById("renameFileModal").style.display = "none";
|
||||||
document.getElementById("newFileName").value = "";
|
document.getElementById("newFileName").value = "";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Submit button: send rename request.
|
// Submit button: send rename request.
|
||||||
const submitBtn = document.getElementById("submitRenameFile");
|
const submitBtn = document.getElementById("submitRenameFile");
|
||||||
if (submitBtn) {
|
if (submitBtn) {
|
||||||
submitBtn.addEventListener("click", function() {
|
submitBtn.addEventListener("click", function () {
|
||||||
const newName = document.getElementById("newFileName").value.trim();
|
const newName = document.getElementById("newFileName").value.trim();
|
||||||
if (!newName || newName === window.fileToRename) {
|
if (!newName || newName === window.fileToRename) {
|
||||||
// No change; just hide the modal.
|
// No change; just hide the modal.
|
||||||
|
|||||||
48
index.html
48
index.html
@@ -26,9 +26,15 @@
|
|||||||
<h1>Multi File Upload Editor</h1>
|
<h1>Multi File Upload Editor</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-buttons">
|
<div class="header-buttons">
|
||||||
<button id="logoutBtn" title="Logout"><i class="material-icons">exit_to_app</i></button>
|
<button id="logoutBtn" title="Logout">
|
||||||
<button id="addUserBtn" title="Add User"><i class="material-icons">person_add</i></button>
|
<i class="material-icons">exit_to_app</i>
|
||||||
<button id="removeUserBtn" title="Remove User"><i class="material-icons">person_remove</i></button>
|
</button>
|
||||||
|
<button id="addUserBtn" title="Add User">
|
||||||
|
<i class="material-icons">person_add</i>
|
||||||
|
</button>
|
||||||
|
<button id="removeUserBtn" title="Remove User">
|
||||||
|
<i class="material-icons">person_remove</i>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<!-- Custom Toast Container -->
|
<!-- Custom Toast Container -->
|
||||||
@@ -163,39 +169,53 @@
|
|||||||
<div id="fileListContainer">
|
<div id="fileListContainer">
|
||||||
<h2 id="fileListTitle">Files in (Root)</h2>
|
<h2 id="fileListTitle">Files in (Root)</h2>
|
||||||
<div id="fileListActions" class="file-list-actions">
|
<div id="fileListActions" class="file-list-actions">
|
||||||
<button id="deleteSelectedBtn" class="btn action-btn" style="display: none;">Delete Selected</button>
|
<button id="deleteSelectedBtn" class="btn action-btn" style="display: none;">
|
||||||
|
Delete Selected
|
||||||
|
</button>
|
||||||
<!-- Delete Files Modal -->
|
<!-- Delete Files Modal -->
|
||||||
<div id="deleteFilesModal" class="modal">
|
<div id="deleteFilesModal" class="modal">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<h4>Delete Selected Files</h4>
|
<h4>Delete Selected Files</h4>
|
||||||
<p id="deleteFilesMessage">Are you sure you want to delete the selected files?</p>
|
<p id="deleteFilesMessage">
|
||||||
<div style="margin-top:15px; text-align:right;">
|
Are you sure you want to delete the selected files?
|
||||||
|
</p>
|
||||||
|
<div class="modal-footer">
|
||||||
<button id="cancelDeleteFiles" class="btn btn-secondary">Cancel</button>
|
<button id="cancelDeleteFiles" class="btn btn-secondary">Cancel</button>
|
||||||
<button id="confirmDeleteFiles" class="btn btn-danger">Delete</button>
|
<button id="confirmDeleteFiles" class="btn btn-danger">Delete</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button id="copySelectedBtn" class="btn action-btn" style="display: none;" disabled>Copy Selected</button>
|
|
||||||
|
<button id="copySelectedBtn" class="btn action-btn" style="display: none;" disabled>
|
||||||
|
Copy Selected
|
||||||
|
</button>
|
||||||
<!-- Copy Files Modal -->
|
<!-- Copy Files Modal -->
|
||||||
<div id="copyFilesModal" class="modal">
|
<div id="copyFilesModal" class="modal">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<h4>Copy Selected Files</h4>
|
<h4>Copy Selected Files</h4>
|
||||||
<p id="copyFilesMessage">Select a target folder for copying the selected files:</p>
|
<p id="copyFilesMessage">
|
||||||
<select id="copyTargetFolder" class="form-control" style="margin-top:10px;"></select>
|
Select a target folder for copying the selected files:
|
||||||
<div style="margin-top:15px; text-align:right;">
|
</p>
|
||||||
|
<select id="copyTargetFolder" class="form-control modal-input"></select>
|
||||||
|
<div class="modal-footer">
|
||||||
<button id="cancelCopyFiles" class="btn btn-secondary">Cancel</button>
|
<button id="cancelCopyFiles" class="btn btn-secondary">Cancel</button>
|
||||||
<button id="confirmCopyFiles" class="btn btn-primary">Copy</button>
|
<button id="confirmCopyFiles" class="btn btn-primary">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button id="moveSelectedBtn" class="btn action-btn" style="display: none;" disabled>Move Selected</button>
|
|
||||||
|
<button id="moveSelectedBtn" class="btn action-btn" style="display: none;" disabled>
|
||||||
|
Move Selected
|
||||||
|
</button>
|
||||||
<!-- Move Files Modal -->
|
<!-- Move Files Modal -->
|
||||||
<div id="moveFilesModal" class="modal">
|
<div id="moveFilesModal" class="modal">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<h4>Move Selected Files</h4>
|
<h4>Move Selected Files</h4>
|
||||||
<p id="moveFilesMessage">Select a target folder for moving the selected files:</p>
|
<p id="moveFilesMessage">
|
||||||
<select id="moveTargetFolder" class="form-control" style="margin-top:10px;"></select>
|
Select a target folder for moving the selected files:
|
||||||
<div style="margin-top:15px; text-align:right;">
|
</p>
|
||||||
|
<select id="moveTargetFolder" class="form-control modal-input"></select>
|
||||||
|
<div class="modal-footer">
|
||||||
<button id="cancelMoveFiles" class="btn btn-secondary">Cancel</button>
|
<button id="cancelMoveFiles" class="btn btn-secondary">Cancel</button>
|
||||||
<button id="confirmMoveFiles" class="btn btn-primary">Move</button>
|
<button id="confirmMoveFiles" class="btn btn-primary">Move</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
237
styles.css
237
styles.css
@@ -1,3 +1,7 @@
|
|||||||
|
/* ===========================================================
|
||||||
|
GENERAL STYLES & BASE LAYOUT
|
||||||
|
=========================================================== */
|
||||||
|
|
||||||
/* GENERAL STYLES */
|
/* GENERAL STYLES */
|
||||||
body {
|
body {
|
||||||
font-family: 'Roboto', sans-serif;
|
font-family: 'Roboto', sans-serif;
|
||||||
@@ -10,7 +14,11 @@ body {
|
|||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* HEADER */
|
/* ===========================================================
|
||||||
|
HEADER & NAVIGATION
|
||||||
|
=========================================================== */
|
||||||
|
|
||||||
|
/* HEADER (Large Screens) */
|
||||||
header {
|
header {
|
||||||
display: flex !important;
|
display: flex !important;
|
||||||
flex-direction: row !important;
|
flex-direction: row !important;
|
||||||
@@ -34,11 +42,9 @@ header {
|
|||||||
|
|
||||||
.header-title {
|
.header-title {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
/* Absolutely position the title */
|
/* Center the title using absolute positioning */
|
||||||
left: 50%;
|
left: 50%;
|
||||||
/* Position it 50% from the left edge */
|
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
/* Center it by moving it left by 50% of its own width */
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: white;
|
color: white;
|
||||||
@@ -70,12 +76,56 @@ header {
|
|||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Responsive Header (Small Screens) */
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
header {
|
||||||
|
flex-direction: column !important;
|
||||||
|
height: auto !important;
|
||||||
|
padding: 10px 20px !important;
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove absolute positioning to let items stack */
|
||||||
|
.header-title {
|
||||||
|
position: static !important;
|
||||||
|
left: auto !important;
|
||||||
|
transform: none !important;
|
||||||
|
margin: 10px 0 !important;
|
||||||
|
font-size: 1.2em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure logo and buttons are centered and full width */
|
||||||
|
.header-left,
|
||||||
|
.header-buttons {
|
||||||
|
position: static !important;
|
||||||
|
transform: none !important;
|
||||||
|
margin: 5px 0 !important;
|
||||||
|
width: 100% !important;
|
||||||
|
text-align: center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-left img {
|
||||||
|
height: 50px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-buttons {
|
||||||
|
justify-content: center !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================
|
||||||
|
MATERIAL ICONS
|
||||||
|
=========================================================== */
|
||||||
.material-icons {
|
.material-icons {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================
|
||||||
|
FORMS & LOGIN
|
||||||
|
=========================================================== */
|
||||||
|
|
||||||
/* LOGIN FORM */
|
/* LOGIN FORM */
|
||||||
#loginForm {
|
#loginForm {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
@@ -86,7 +136,11 @@ header {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* MODALS & EDITOR MODALS */
|
/* ===========================================================
|
||||||
|
MODALS & EDITOR MODALS
|
||||||
|
=========================================================== */
|
||||||
|
|
||||||
|
/* General Modal Styles */
|
||||||
.modal {
|
.modal {
|
||||||
display: none; /* Hidden by default */
|
display: none; /* Hidden by default */
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@@ -114,6 +168,7 @@ header {
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Editor Modal */
|
||||||
.editor-modal {
|
.editor-modal {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
@@ -123,7 +178,6 @@ header {
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
border: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
/* centers the editor modal */
|
|
||||||
width: 50vw;
|
width: 50vw;
|
||||||
max-width: 90vw;
|
max-width: 90vw;
|
||||||
min-width: 400px;
|
min-width: 400px;
|
||||||
@@ -132,10 +186,12 @@ header {
|
|||||||
overflow: auto;
|
overflow: auto;
|
||||||
resize: both;
|
resize: both;
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||||
z-index: 1100; /* make sure it’s on top of any overlay */
|
z-index: 1100; /* Ensure it's on top of any overlay */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* LOGOUT & USER BUTTON CONTAINER */
|
/* ===========================================================
|
||||||
|
LOGOUT & USER CONTROLS
|
||||||
|
=========================================================== */
|
||||||
.logout-container {
|
.logout-container {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10px;
|
top: 10px;
|
||||||
@@ -152,7 +208,9 @@ header {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UPLOAD PROGRESS */
|
/* ===========================================================
|
||||||
|
UPLOAD PROGRESS STYLES
|
||||||
|
=========================================================== */
|
||||||
#uploadProgressContainer ul {
|
#uploadProgressContainer ul {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -169,7 +227,7 @@ header {
|
|||||||
#uploadProgressContainer .file-preview {
|
#uploadProgressContainer .file-preview {
|
||||||
width: 32px !important;
|
width: 32px !important;
|
||||||
height: 32px !important;
|
height: 32px !important;
|
||||||
margin-right: 0px;
|
margin-right: 0;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,8 +238,7 @@ header {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#uploadProgressContainer .file-name {
|
#uploadProgressContainer .file-name {
|
||||||
margin-right: 20px;
|
margin: 0 20px 0 2px;
|
||||||
margin-left: 2px;
|
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
@@ -190,8 +247,7 @@ header {
|
|||||||
background-color: #e9ecef;
|
background-color: #e9ecef;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin-top: 5px;
|
margin: 5px 0 10px;
|
||||||
margin-bottom: 10px;
|
|
||||||
height: 24px;
|
height: 24px;
|
||||||
width: 250px;
|
width: 250px;
|
||||||
}
|
}
|
||||||
@@ -210,7 +266,9 @@ header {
|
|||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* RESPONSIVE (small screens) */
|
/* ===========================================================
|
||||||
|
RESPONSIVE ADJUSTMENTS (General Small Screens)
|
||||||
|
=========================================================== */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.logout-container {
|
.logout-container {
|
||||||
position: static;
|
position: static;
|
||||||
@@ -227,10 +285,11 @@ header {
|
|||||||
.hide-small {
|
.hide-small {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* BUTTON STYLES (MATERIAL THEME) */
|
/* ===========================================================
|
||||||
|
BUTTON STYLES (MATERIAL THEME)
|
||||||
|
=========================================================== */
|
||||||
.btn {
|
.btn {
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
border: none;
|
border: none;
|
||||||
@@ -246,9 +305,9 @@ header {
|
|||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Specific Action Buttons */
|
||||||
#deleteSelectedBtn {
|
#deleteSelectedBtn {
|
||||||
background-color: #f44336;
|
background-color: #f44336; /* Material red */
|
||||||
/* Material red */
|
|
||||||
color: white;
|
color: white;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@@ -260,8 +319,7 @@ header {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#copySelectedBtn {
|
#copySelectedBtn {
|
||||||
background-color: #9E9E9E;
|
background-color: #9E9E9E; /* Material grey */
|
||||||
/* Material grey */
|
|
||||||
color: white;
|
color: white;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@@ -273,8 +331,7 @@ header {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#moveSelectedBtn {
|
#moveSelectedBtn {
|
||||||
background-color: #ff9800;
|
background-color: #ff9800; /* Material orange */
|
||||||
/* Material orange */
|
|
||||||
color: white;
|
color: white;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@@ -285,7 +342,7 @@ header {
|
|||||||
background-color: #fb8c00;
|
background-color: #fb8c00;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Material green style for Edit button in file list */
|
/* File List Edit Button (Material Green) */
|
||||||
#fileList button.edit-btn {
|
#fileList button.edit-btn {
|
||||||
background-color: #4CAF50;
|
background-color: #4CAF50;
|
||||||
color: white;
|
color: white;
|
||||||
@@ -300,43 +357,20 @@ header {
|
|||||||
background-color: #43A047;
|
background-color: #43A047;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FILE LIST ACTIONS CONTAINER */
|
/* ===========================================================
|
||||||
.file-list-actions {
|
FILE LIST & TABLE STYLES
|
||||||
display: flex;
|
=========================================================== */
|
||||||
gap: 10px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
align-items: center;
|
|
||||||
max-width: 800px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.folder-dropdown {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FILE LIST TABLE */
|
|
||||||
#fileList table {
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fileList table th,
|
|
||||||
#fileList table td {
|
|
||||||
padding: 10px;
|
|
||||||
text-align: left;
|
|
||||||
border: none;
|
|
||||||
/* Remove table borders */
|
|
||||||
}
|
|
||||||
|
|
||||||
#fileList table tr:nth-child(even) {
|
#fileList table tr:nth-child(even) {
|
||||||
background-color: transparent;
|
background-color: transparent; /* Remove alternating grey rows */
|
||||||
/* Remove alternating grey rows */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#fileList table tr:hover {
|
#fileList table tr:hover {
|
||||||
background-color: #e0e0e0;
|
background-color: #e0e0e0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* HEADINGS & FORM LABELS */
|
/* ===========================================================
|
||||||
|
HEADINGS & FORM LABELS
|
||||||
|
=========================================================== */
|
||||||
h2 {
|
h2 {
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
@@ -349,7 +383,9 @@ label {
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UTILITY CLASSES */
|
/* ===========================================================
|
||||||
|
UTILITY CLASSES
|
||||||
|
=========================================================== */
|
||||||
.align-items-center {
|
.align-items-center {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -369,24 +405,22 @@ label {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove bottom margin from the form group */
|
/* Remove bottom margin from the form group in cards */
|
||||||
.card-body .form-group {
|
.card-body .form-group {
|
||||||
margin-bottom: 5px !important;
|
margin-bottom: 5px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Force a small top margin for the Create Folder button */
|
/* Create Folder Button */
|
||||||
#createFolderBtn {
|
#createFolderBtn {
|
||||||
margin-top: 0px !important;
|
margin-top: 0px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fileListContainer {
|
/* Row Selected Highlight */
|
||||||
margin-top: 40px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.row-selected {
|
.row-selected {
|
||||||
background-color: #f2f2f2 !important;
|
background-color: #f2f2f2 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Custom Prev/Next Buttons */
|
||||||
.custom-prev-next-btn {
|
.custom-prev-next-btn {
|
||||||
background-color: #e0e0e0;
|
background-color: #e0e0e0;
|
||||||
color: #000;
|
color: #000;
|
||||||
@@ -397,22 +431,28 @@ label {
|
|||||||
margin: 0 4px;
|
margin: 0 4px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.custom-prev-next-btn:hover:not(:disabled) {
|
.custom-prev-next-btn:hover:not(:disabled) {
|
||||||
background-color: #d5d5d5;
|
background-color: #d5d5d5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Folder Options */
|
||||||
.folder-option:hover {
|
.folder-option:hover {
|
||||||
background-color: #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.folder-option.selected {
|
.folder-option.selected {
|
||||||
background-color: #d0d0d0;
|
background-color: #d0d0d0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Custom Folder Card Body */
|
||||||
.custom-folder-card-body {
|
.custom-folder-card-body {
|
||||||
padding-top: 5px !important;
|
padding-top: 5px !important;
|
||||||
/* You can leave the other padding values as default or specify them if needed */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================
|
||||||
|
TOAST NOTIFICATIONS
|
||||||
|
=========================================================== */
|
||||||
#customToast {
|
#customToast {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 20px;
|
top: 20px;
|
||||||
@@ -424,11 +464,82 @@ label {
|
|||||||
box-shadow: 0 2px 6px rgba(0,0,0,0.3);
|
box-shadow: 0 2px 6px rgba(0,0,0,0.3);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.5s ease;
|
transition: opacity 0.5s ease;
|
||||||
z-index: 9999; /* Increased z-index */
|
z-index: 9999;
|
||||||
min-width: 250px;
|
min-width: 250px;
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#customToast.show {
|
#customToast.show {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================
|
||||||
|
BUTTON WRAP (For File List Actions)
|
||||||
|
=========================================================== */
|
||||||
|
.button-wrap {
|
||||||
|
display: inline-flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: left;
|
||||||
|
gap: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Media Query for Button Wrap on Smaller Devices */
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
.button-wrap {
|
||||||
|
display: flex; /* Use block-level flex */
|
||||||
|
width: 100%; /* Take full available width */
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================
|
||||||
|
FILE LIST SECTION
|
||||||
|
=========================================================== */
|
||||||
|
#fileListContainer {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fileListTitle {
|
||||||
|
font-size: 1.8em;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-list-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-list-actions .action-btn {
|
||||||
|
flex: 0 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-footer {
|
||||||
|
margin-top: 15px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-input {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive File List Section (Small Devices) */
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
#fileListTitle {
|
||||||
|
font-size: 1.4em;
|
||||||
|
}
|
||||||
|
.file-list-actions {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
.file-list-actions .action-btn {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.modal-content {
|
||||||
|
width: 95%;
|
||||||
|
margin: 20% auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user