import { api } from '../api.js'; import { BaseFileList } from './base-file-list.js'; export class StarredItems extends BaseFileList { constructor() { super(); } async connectedCallback() { super.connectedCallback(); await this.loadStarredItems(); } async loadStarredItems() { try { this.files = await api.listStarredFiles(); this.folders = await api.listStarredFolders(); this.selectedFiles.clear(); this.selectedFolders.clear(); this.render(); } catch (error) { console.error('Failed to load starred items:', error); document.dispatchEvent(new CustomEvent('show-toast', { detail: { message: 'Failed to load starred items: ' + error.message, type: 'error' } })); } } render() { const allStarred = [...this.folders, ...this.files]; const hasSelected = this.selectedFiles.size > 0 || this.selectedFolders.size > 0; const totalItems = this.files.length + this.folders.length; const totalSelected = this.selectedFiles.size + this.selectedFolders.size; const allFilesSelected = this.files.length > 0 && this.selectedFiles.size === this.files.length; const allFoldersSelected = this.folders.length > 0 && this.selectedFolders.size === this.folders.length; const allSelected = totalItems > 0 && allFilesSelected && allFoldersSelected; const someSelected = hasSelected && !allSelected; if (allStarred.length === 0) { this.innerHTML = `

Starred Items

No starred items found.

`; return; } this.innerHTML = `

Starred Items

${totalItems > 0 ? `
` : ''}
${hasSelected ? `
` : ''}
${this.folders.map(folder => this.renderFolder(folder)).join('')} ${this.files.map(file => this.renderFile(file)).join('')}
`; this.attachListeners(); this.updateIndeterminateState(); } getFolderActions(folder) { return ``; } getFileActions(file) { return ` `; } createBatchActionsBar() { const container = this.querySelector('.file-list-container'); const header = container.querySelector('.file-list-header'); const batchBar = document.createElement('div'); batchBar.className = 'batch-actions'; batchBar.innerHTML = ` `; header.insertAdjacentElement('afterend', batchBar); } attachListeners() { const batchUnstarBtn = this.querySelector('#batch-unstar-btn'); if (batchUnstarBtn) { batchUnstarBtn.addEventListener('click', () => this.handleBatchUnstar()); } } async handleBatchUnstar() { const totalSelected = this.selectedFiles.size + this.selectedFolders.size; if (totalSelected === 0) return; if (!confirm(`Unstar ${totalSelected} items?`)) return; try { for (const fileId of this.selectedFiles) { await api.unstarFile(fileId); } for (const folderId of this.selectedFolders) { await api.unstarFolder(folderId); } document.dispatchEvent(new CustomEvent('show-toast', { detail: { message: 'Items unstarred successfully!', type: 'success' } })); await this.loadStarredItems(); } catch (error) { document.dispatchEvent(new CustomEvent('show-toast', { detail: { message: 'Failed to unstar items: ' + error.message, type: 'error' } })); } } async handleAction(action, id) { try { switch (action) { case 'download': const blob = await api.downloadFile(id); const file = this.files.find(f => f.id === id); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = file.name; a.click(); URL.revokeObjectURL(url); document.dispatchEvent(new CustomEvent('show-toast', { detail: { message: 'File downloaded successfully!', type: 'success' } })); break; case 'unstar-file': await api.unstarFile(id); document.dispatchEvent(new CustomEvent('show-toast', { detail: { message: 'File unstarred successfully!', type: 'success' } })); await this.loadStarredItems(); break; case 'unstar-folder': await api.unstarFolder(id); document.dispatchEvent(new CustomEvent('show-toast', { detail: { message: 'Folder unstarred successfully!', type: 'success' } })); await this.loadStarredItems(); break; } } catch (error) { document.dispatchEvent(new CustomEvent('show-toast', { detail: { message: 'Action failed: ' + error.message, type: 'error' } })); } } } customElements.define('starred-items', StarredItems);