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 = `
`;
return;
}
this.innerHTML = `
${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);