import { getJson } from './api.js'; import { esc } from './sanitize.js'; export function createWebdavController(deps) { var currentPath = '/'; var selectedPath = ''; var selectedName = ''; function browse(path) { currentPath = path || '/'; var list = document.getElementById('lh-ai-webdav-list'); var pathLabel = document.getElementById('lh-ai-webdav-path-label'); if (list) list.innerHTML = '
Loading...
'; if (pathLabel) pathLabel.textContent = currentPath; getJson('/api/admin/learning/webdav-browse?path=' + encodeURIComponent(currentPath)) .then(function(data) { if (!data.success) { if (list) list.innerHTML = '
' + esc(data.error) + '
'; return; } if (pathLabel) pathLabel.textContent = data.path; renderList(data); }) .catch(function(err) { if (list) list.innerHTML = '
' + esc(err.message) + '
'; }); } function renderList(data) { var list = document.getElementById('lh-ai-webdav-list'); if (!list) return; list.innerHTML = renderWebdavListHtml(data); } function openItem(el) { if (!el) return; if (el.dataset.isdir === '1') browse(el.dataset.path); else selectFile(el.dataset.path, el.dataset.name); } function selectFile(path, name) { selectedPath = path; selectedName = name; var browser = document.getElementById('lh-ai-webdav-browser'); var selDiv = document.getElementById('lh-ai-webdav-selected'); var selName = document.getElementById('lh-ai-webdav-selected-name'); if (browser) browser.style.display = 'none'; if (selDiv) selDiv.style.display = 'flex'; if (selName) selName.textContent = name; } function deselectFile() { selectedPath = ''; selectedName = ''; var browser = document.getElementById('lh-ai-webdav-browser'); var selDiv = document.getElementById('lh-ai-webdav-selected'); if (selDiv) selDiv.style.display = 'none'; if (browser) browser.style.display = ''; } return { browse: browse, deselectFile: deselectFile, getCurrentPath: function() { return currentPath; }, getSelectedName: function() { return selectedName; }, getSelectedPath: function() { return selectedPath; }, openItem: openItem, selectFile: selectFile, setCurrentPath: function(path) { currentPath = path || '/'; } }; } export function renderWebdavListHtml(data) { var html = ''; if (data.path !== '/' && data.path !== data.parentPath) { html += '
' + ' ..
'; } if (data.items.length === 0 && html === '') { return '
Empty folder
'; } data.items.forEach(function(item) { var icon = item.isDir ? 'fa-folder' : getFileIcon(item.contentType, item.name); var iconColor = item.isDir ? 'var(--amber)' : 'var(--blue)'; var sizeStr = (!item.isDir && item.size) ? ' (' + formatBytes(item.size) + ')' : ''; html += '
' + '' + '' + esc(item.name) + '' + sizeStr + '
'; }); return html; } export function getFileIcon(mime, name) { if (!name) name = ''; var ext = name.split('.').pop().toLowerCase(); if (mime && mime.includes('pdf') || ext === 'pdf') return 'fa-file-pdf'; if (['doc', 'docx'].includes(ext)) return 'fa-file-word'; if (['txt', 'md'].includes(ext)) return 'fa-file-lines'; if (['html', 'htm'].includes(ext)) return 'fa-file-code'; return 'fa-file'; } export function formatBytes(bytes) { if (bytes < 1024) return bytes + ' B'; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(0) + ' KB'; return (bytes / 1024 / 1024).toFixed(1) + ' MB'; }