feat: Enhance WebDAV file management and UI

- Add functionality to create new collections via API
- Implement copy and move operations between collections
- Improve image rendering in markdown preview with relative path resolution
- Add support for previewing binary files (images, PDFs)
- Refactor modal styling to use flat buttons and improve accessibility
This commit is contained in:
Mahmoud-Emad
2025-10-26 17:29:45 +03:00
parent 0ed6bcf1f2
commit f319f29d4c
20 changed files with 1679 additions and 113 deletions

View File

@@ -26,12 +26,21 @@ class CollectionSelector {
this.select.appendChild(option);
});
// Try to restore previously selected collection from localStorage
const savedCollection = localStorage.getItem(this.storageKey);
// Determine which collection to select (priority: URL > localStorage > first)
let collectionToSelect = collections[0]; // Default to first
if (savedCollection && collections.includes(savedCollection)) {
collectionToSelect = savedCollection;
// Check URL first (highest priority)
const urlCollection = this.getCollectionFromURL();
if (urlCollection && collections.includes(urlCollection)) {
collectionToSelect = urlCollection;
Logger.info(`Using collection from URL: ${urlCollection}`);
} else {
// Fall back to localStorage
const savedCollection = localStorage.getItem(this.storageKey);
if (savedCollection && collections.includes(savedCollection)) {
collectionToSelect = savedCollection;
Logger.info(`Using collection from localStorage: ${savedCollection}`);
}
}
if (collections.length > 0) {
@@ -48,14 +57,17 @@ class CollectionSelector {
// Save to localStorage
localStorage.setItem(this.storageKey, collection);
this.webdavClient.setCollection(collection);
Logger.info(`Collection changed to: ${collection}`);
// Update URL to reflect collection change
this.updateURLForCollection(collection);
if (this.onChange) {
this.onChange(collection);
}
});
Logger.debug(`Loaded ${collections.length} collections`);
} catch (error) {
Logger.error('Failed to load collections:', error);
@@ -83,9 +95,12 @@ class CollectionSelector {
this.select.value = collection;
localStorage.setItem(this.storageKey, collection);
this.webdavClient.setCollection(collection);
Logger.info(`Collection set to: ${collection}`);
// Update URL to reflect collection change
this.updateURLForCollection(collection);
if (this.onChange) {
this.onChange(collection);
}
@@ -93,6 +108,43 @@ class CollectionSelector {
Logger.warn(`Collection "${collection}" not found in available collections`);
}
}
/**
* Update the browser URL to reflect the current collection
* @param {string} collection - The collection name
*/
updateURLForCollection(collection) {
// Get current URL parameters
const urlParams = new URLSearchParams(window.location.search);
const isEditMode = urlParams.get('edit') === 'true';
// Build new URL with collection
let url = `/${collection}/`;
if (isEditMode) {
url += '?edit=true';
}
// Use pushState to update URL without reloading
window.history.pushState({ collection, filePath: null }, '', url);
Logger.debug(`Updated URL to: ${url}`);
}
/**
* Extract collection name from current URL
* URL format: /<collection>/ or /<collection>/<file_path>
* @returns {string|null} The collection name or null if not found
*/
getCollectionFromURL() {
const pathname = window.location.pathname;
const parts = pathname.split('/').filter(p => p); // Remove empty parts
if (parts.length === 0) {
return null;
}
// First part is the collection
return parts[0];
}
}
// Make CollectionSelector globally available