refactor(frontend): extract shared modules, thin views, delete dead code
Shared utilities: - Add src/utils/formatters.js — formatDate, formatSize, providerColor, providerBg, providerLabel; all components import from here, no inline duplicates - Add src/components/ui/TreeItem.vue — generic expand/collapse tree node; FolderTreeItem, CloudFolderTreeItem, CloudProviderTreeItem now wrap it - Add src/components/storage/StorageBrowser.vue — unified file browser grid used by both FileManagerView and CloudFolderView View refactor (thin data-providers): - FileManagerView.vue: stripped to props + event wiring; all layout moved to StorageBrowser - CloudFolderView.vue: same treatment — feeds props into StorageBrowser - All tree sidebar components delegate expand/collapse to TreeItem.vue Dead code removed: - Delete HomeView.vue — no active route, replaced by FileManagerView - Delete FolderView.vue — no active route, logic merged into FileManagerView Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
a548266461
commit
cce70b2ef6
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Shared formatting utilities — import from here, never redefine inline.
|
||||
*/
|
||||
|
||||
export function formatDate(iso) {
|
||||
if (!iso) return '—'
|
||||
return new Date(iso).toLocaleDateString(undefined, {
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
year: 'numeric',
|
||||
})
|
||||
}
|
||||
|
||||
export function formatSize(bytes) {
|
||||
if (!bytes) return '—'
|
||||
if (bytes < 1024) return bytes + ' B'
|
||||
if (bytes < 1048576) return (bytes / 1024).toFixed(1) + ' KB'
|
||||
return (bytes / 1048576).toFixed(1) + ' MB'
|
||||
}
|
||||
|
||||
/** Maps a cloud provider slug to a Tailwind text-color class. */
|
||||
export function providerColor(provider) {
|
||||
const map = {
|
||||
google_drive: 'text-blue-500',
|
||||
onedrive: 'text-sky-500',
|
||||
nextcloud: 'text-orange-500',
|
||||
webdav: 'text-gray-500',
|
||||
}
|
||||
return map[provider] ?? 'text-gray-400'
|
||||
}
|
||||
|
||||
/** Maps a cloud provider slug to a Tailwind background-color class. */
|
||||
export function providerBg(provider) {
|
||||
const map = {
|
||||
google_drive: 'bg-blue-50',
|
||||
onedrive: 'bg-sky-50',
|
||||
nextcloud: 'bg-orange-50',
|
||||
webdav: 'bg-gray-50',
|
||||
}
|
||||
return map[provider] ?? 'bg-gray-50'
|
||||
}
|
||||
|
||||
/** Human-readable label for a cloud provider slug. */
|
||||
export function providerLabel(provider) {
|
||||
const map = {
|
||||
google_drive: 'Google Drive',
|
||||
onedrive: 'OneDrive',
|
||||
nextcloud: 'Nextcloud',
|
||||
webdav: 'WebDAV',
|
||||
}
|
||||
return map[provider] ?? provider
|
||||
}
|
||||
Reference in New Issue
Block a user