- 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
153 lines
5.2 KiB
JavaScript
153 lines
5.2 KiB
JavaScript
/**
|
|
* Collection Selector Module
|
|
* Manages the collection dropdown selector and persistence
|
|
*/
|
|
|
|
class CollectionSelector {
|
|
constructor(selectId, webdavClient) {
|
|
this.select = document.getElementById(selectId);
|
|
this.webdavClient = webdavClient;
|
|
this.onChange = null;
|
|
this.storageKey = Config.STORAGE_KEYS.SELECTED_COLLECTION;
|
|
}
|
|
|
|
/**
|
|
* Load collections from WebDAV and populate the selector
|
|
*/
|
|
async load() {
|
|
try {
|
|
const collections = await this.webdavClient.getCollections();
|
|
this.select.innerHTML = '';
|
|
|
|
collections.forEach(collection => {
|
|
const option = document.createElement('option');
|
|
option.value = collection;
|
|
option.textContent = collection;
|
|
this.select.appendChild(option);
|
|
});
|
|
|
|
// Determine which collection to select (priority: URL > localStorage > first)
|
|
let collectionToSelect = collections[0]; // Default to first
|
|
|
|
// 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) {
|
|
this.select.value = collectionToSelect;
|
|
this.webdavClient.setCollection(collectionToSelect);
|
|
if (this.onChange) {
|
|
this.onChange(collectionToSelect);
|
|
}
|
|
}
|
|
|
|
// Add change listener
|
|
this.select.addEventListener('change', () => {
|
|
const collection = this.select.value;
|
|
// 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);
|
|
if (window.showNotification) {
|
|
window.showNotification('Failed to load collections', 'error');
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the currently selected collection
|
|
* @returns {string} The collection name
|
|
*/
|
|
getCurrentCollection() {
|
|
return this.select.value;
|
|
}
|
|
|
|
/**
|
|
* Set the collection to a specific value
|
|
* @param {string} collection - The collection name to set
|
|
*/
|
|
async setCollection(collection) {
|
|
const collections = Array.from(this.select.options).map(opt => opt.value);
|
|
if (collections.includes(collection)) {
|
|
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);
|
|
}
|
|
} else {
|
|
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
|
|
window.CollectionSelector = CollectionSelector;
|
|
|