class CustomList extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
No batches yet
Upload a file to get started
`;
this.sortConfig = {
key: 'id',
direction: 'desc'
};
}
connectedCallback() {
this.loadBatches();
feather.replace({ width: 16, height: 16 });
// Add event listeners for sorting
this.shadowRoot.querySelectorAll('th[data-sort]').forEach(th => {
th.addEventListener('click', () => this.handleSort(th.dataset.sort));
});
// Listen for new batch events
document.addEventListener('batch-created', () => this.loadBatches());
}
async loadBatches() {
const tableBody = this.shadowRoot.getElementById('batchTableBody');
const loading = this.shadowRoot.getElementById('loading');
const emptyState = this.shadowRoot.getElementById('emptyState');
tableBody.innerHTML = '';
loading.classList.remove('hidden');
emptyState.classList.add('hidden');
try {
const batches = await window.batchService.getAllBatches();
if (batches.length === 0) {
loading.classList.add('hidden');
emptyState.classList.remove('hidden');
return;
}
// Apply sorting
const sortedBatches = [...batches].sort((a, b) => {
if (a[this.sortConfig.key] < b[this.sortConfig.key]) {
return this.sortConfig.direction === 'asc' ? -1 : 1;
}
if (a[this.sortConfig.key] > b[this.sortConfig.key]) {
return this.sortConfig.direction === 'asc' ? 1 : -1;
}
return 0;
});
sortedBatches.forEach(batch => {
const row = document.createElement('tr');
let statusBadgeClass = '';
switch (batch.status) {
case 'PENDING':
statusBadgeClass = 'processing-badge-pending';
break;
case 'RUNNING':
statusBadgeClass = 'processing-badge-running';
break;
case 'COMPLETED':
statusBadgeClass = 'processing-badge-completed';
break;
}
row.innerHTML = `