${event.notes ? `
Notes:
${escapeHtml(event.notes)}
` : ''}
`;
eventsList.appendChild(listItem);
if (!timeInfo.past || timeInfo.status === 'unlocking') {
const countdownElement = document.getElementById(`countdown-${event.id}`);
const itemElement = listItem; // capture listItem for styling
const intervalId = setInterval(() => {
const newTimeInfo = getTimeDifferenceString(event.unlockDateTime);
if (countdownElement) countdownElement.textContent = newTimeInfo.text;
// Update status class if it changes (e.g., from upcoming to unlocking now)
itemElement.className = 'tust-event-item'; // Reset classes
itemElement.classList.add(`status-${newTimeInfo.status}`);
if (newTimeInfo.past && newTimeInfo.status !== 'unlocking') { // If it moved to fully past
clearInterval(intervalId);
renderEvents(); // Re-render to sort and correctly display past events
}
}, 1000);
countdownIntervals.push(intervalId);
}
});
}
}
if (addEventButton) {
addEventButton.addEventListener('click', function() {
const eventData = {
id: Date.now() + '_' + Math.random().toString(36).substr(2, 9), // More unique ID
tokenName: tokenNameInput.value.trim(),
tokenSymbol: tokenSymbolInput.value.trim().toUpperCase(),
projectName: projectNameInput.value.trim(),
tokenomicsLink: tokenomicsLinkInput.value.trim(),
eventName: eventNameInput.value.trim(),
unlockDateTime: unlockDateTimeInput.value,
unlockAmount: unlockAmountInput.value,
totalSupply: totalSupplyInput.value,
circulatingSupplyBefore: circulatingSupplyBeforeInput.value,
recipientCategory: recipientCategorySelect.value,
notes: notesInput.value.trim()
};
if (!eventData.tokenName || !eventData.tokenSymbol || !eventData.eventName || !eventData.unlockDateTime ||
!eventData.unlockAmount || !eventData.totalSupply) {
alert('Please fill in all required fields: Token Name, Symbol, Event Name, Unlock Date/Time, Unlock Amount, and Total Supply.');
return;
}
if (parseFloat(eventData.unlockAmount) <= 0 || parseFloat(eventData.totalSupply) <= 0) {
alert('Unlock Amount and Total Supply must be positive numbers.');
return;
}
trackedEvents.push(eventData);
saveEvents();
renderEvents();
// Clear form
tokenNameInput.value = ''; tokenSymbolInput.value = ''; projectNameInput.value = '';
tokenomicsLinkInput.value = ''; eventNameInput.value = ''; unlockDateTimeInput.value = '';
unlockAmountInput.value = ''; totalSupplyInput.value = ''; circulatingSupplyBeforeInput.value = '';
recipientCategorySelect.value = 'Team'; notesInput.value = '';
});
}
if (eventsList) {
eventsList.addEventListener('click', function(event) {
if (event.target.classList.contains('tust-remove-button')) {
const itemToRemoveEl = event.target.closest('.tust-event-item');
if (itemToRemoveEl) {
const eventId = itemToRemoveEl.getAttribute('data-id');
trackedEvents = trackedEvents.filter(ev => ev.id.toString() !== eventId);
saveEvents();
renderEvents(); // Re-render to remove item and clear its interval
}
}
});
}
if (pdfButton) {
pdfButton.addEventListener('click', function() {
if (trackedEvents.length === 0) {
alert("No events to export. Please add some first.");
return;
}
window.print();
});
}
const criticalElements = [tokenNameInput, tokenSymbolInput, eventNameInput, unlockDateTimeInput, unlockAmountInput, totalSupplyInput, addEventButton, eventsList, pdfButton, noEventsMessage];
if (criticalElements.some(el => !el)) {
console.error("TokenUnlockScheduleTracker: One or more critical HTML elements are missing.");
const appDiv = document.getElementById('tokenUnlockScheduleTrackerApp');
if(appDiv) appDiv.innerHTML = "
Error: Tool initialization failed. Required elements not found.
";
return;
}
loadEvents();
renderEvents(); // Initial render and start countdowns
});