ui: Fixes

This commit is contained in:
gerlofvanek
2024-10-12 21:37:51 +02:00
parent 75fa008f0a
commit 376b485261
3 changed files with 177 additions and 253 deletions

View File

@@ -637,20 +637,11 @@ function filterAndSortData() {
let passesFilter = true;
if (isSentOffers) {
if (filters.coin_to !== 'any' && coinFrom.toLowerCase() !== filters.coin_to.toLowerCase()) {
passesFilter = false;
}
if (filters.coin_from !== 'any' && coinTo.toLowerCase() !== filters.coin_from.toLowerCase()) {
passesFilter = false;
}
} else {
if (filters.coin_to !== 'any' && coinTo.toLowerCase() !== filters.coin_to.toLowerCase()) {
passesFilter = false;
}
if (filters.coin_from !== 'any' && coinFrom.toLowerCase() !== filters.coin_from.toLowerCase()) {
passesFilter = false;
}
if (filters.coin_to !== 'any' && coinTo.toLowerCase() !== filters.coin_to.toLowerCase()) {
passesFilter = false;
}
if (filters.coin_from !== 'any' && coinFrom.toLowerCase() !== filters.coin_from.toLowerCase()) {
passesFilter = false;
}
if (isSentOffers && filters.active && filters.active !== 'any') {
@@ -939,7 +930,7 @@ function getProfitColorClass(percentage) {
const numericPercentage = parseFloat(percentage);
if (numericPercentage > 0) return 'text-green-500';
if (numericPercentage < 0) return 'text-red-500';
if (numericPercentage === 0) return 'text-yellowr-400';
if (numericPercentage === 0) return 'text-yellow-400';
return 'text-white';
}
@@ -1025,16 +1016,16 @@ function createDetailsColumn(offer) {
`;
}
function createOrderbookColumn(offer, coinFrom, coinTo) {
function createTakerAmountColumn(offer, coinTo, coinFrom) {
const toAmount = parseFloat(offer.amount_to);
const fromSymbol = getCoinSymbol(coinFrom);
return `
<td class="py-0">
<div class="py-3 px-4 text-right">
<a data-tooltip-target="tooltip-wallet${offer.offer_id}" href="/wallet/${fromSymbol}" class="items-center monospace">
<div class="py-3 px-4 text-left">
<a data-tooltip-target="tooltip-wallet${escapeHtml(offer.offer_id)}" href="/wallet/${escapeHtml(fromSymbol)}" class="items-center monospace">
<div class="pr-2">
<div class="text-sm font-semibold">${toAmount.toFixed(4)}</div>
<div class="text-xs text-gray-500 dark:text-gray-400">${coinFrom}</div>
<div class="text-sm text-gray-500 dark:text-gray-400">${coinFrom}</div>
</div>
</a>
</div>
@@ -1042,7 +1033,7 @@ function createOrderbookColumn(offer, coinFrom, coinTo) {
`;
}
function createSwapColumn(offer, coinFrom, coinTo) {
function createSwapColumn(offer, coinTo, coinFrom) {
return `
<td class="py-0 px-0 text-right text-sm">
<a data-tooltip-target="tooltip-offer${offer.offer_id}" href="/offer/${offer.offer_id}">
@@ -1061,16 +1052,16 @@ function createSwapColumn(offer, coinFrom, coinTo) {
`;
}
function createTakerAmountColumn(offer, coinTo, coinFrom) {
function createOrderbookColumn(offer, coinFrom, coinTo) {
const fromAmount = parseFloat(offer.amount_from);
const toSymbol = getCoinSymbol(coinTo);
return `
<td class="p-0">
<div class="py-3 px-4 text-left">
<div class="py-3 px-4 text-right">
<a data-tooltip-target="tooltip-wallet-maker${escapeHtml(offer.offer_id)}" href="/wallet/${escapeHtml(toSymbol)}" class="items-center monospace">
<div class="pr-2">
<div class="text-sm font-semibold">${fromAmount.toFixed(4)}</div>
<div class="text-xs text-gray-500 dark:text-gray-400">${coinTo}</div>
<div class="text-sm text-gray-500 dark:text-gray-400">${coinTo}</div>
</div>
</a>
</div>
@@ -1101,17 +1092,17 @@ function createRateColumn(offer, coinFrom, coinTo) {
console.log(`Rate in USD: $${rateInUSD.toFixed(2)}`);
return `
<td class="py-3 pl-6 bold monospace text-xs text-right items-center rate-table-info">
<td class="py-3 semibold monospace text-xs text-right items-center rate-table-info">
<div class="relative">
<div class="flex flex-col items-end" data-tooltip-target="tooltip-rate-${offer.offer_id}">
<span class="text-gray-700 dark:text-white">
$${rateInUSD.toFixed(2)}/${fromSymbol}
<div class="flex flex-col items-end pr-3" data-tooltip-target="tooltip-rate-${offer.offer_id}">
<span class="text-sm bold text-gray-700 dark:text-white">
$${rateInUSD.toFixed(2)} USD
</span>
<span class="text-gray-700 dark:text-white">
${rate.toFixed(6)} ${toSymbol}/${fromSymbol}
<span class="bold text-gray-700 dark:text-white">
${rate.toFixed(8)} ${toSymbol}/${fromSymbol}
</span>
<span class="text-gray-700 dark:text-white">
${inverseRate.toFixed(6)} ${fromSymbol}/${toSymbol}
<span class="semibold text-gray-400 dark:text-gray-300">
${inverseRate.toFixed(8)} ${fromSymbol}/${toSymbol}
</span>
</div>
</div>
@@ -1183,7 +1174,7 @@ function createTooltips(offer, isSentOffers, coinFrom, coinTo, postedTime, expir
</div>
<div id="tooltip-offer${offer.offer_id}" role="tooltip" class="inline-block absolute z-10 py-2 px-3 text-sm font-medium text-white ${offer.is_own_offer ? 'bg-gray-300' : 'bg-green-700'} rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
<div class="active-revoked-expired"><span class="bold">${offer.is_own_offer ? 'Edit Offer' : `Buy ${coinTo}`}</span></div>
<div class="active-revoked-expired"><span class="bold">${offer.is_own_offer ? 'Edit Offer' : `Buy ${coinFrom}`}</span></div>
<div class="tooltip-arrow pr-6" data-popper-arrow></div>
</div>
@@ -1283,14 +1274,14 @@ function createCombinedRateTooltip(offer, coinFrom, coinTo) {
<p class="font-bold mb-1">Exchange Rate Explanation:</p>
<p>This offer is ${action} ${coinFrom} for ${coinTo} <br/>at a rate that is ${Math.abs(percentDiff).toFixed(2)}% ${aboveOrBelow} market price.</p>
<p class="font-bold mt-1">Exchange Rates:</p>
<p>1 ${coinFrom} = ${rate.toFixed(6)} ${toSymbol}</p>
<p>1 ${coinTo} = ${inverseRate.toFixed(6)} ${fromSymbol}</p>
<p>1 ${coinFrom} = ${rate.toFixed(8)} ${coinTo}</p>
<p>1 ${coinTo} = ${inverseRate.toFixed(8)} ${coinFrom}</p>
<p class="font-bold mt-2">USD Equivalent:</p>
<p>1 ${coinFrom} = $${rateInUSD.toFixed(2)} USD</p>
<p class="font-bold mt-2">Current market prices:</p>
<p>${coinFrom}: $${fromPriceUSD.toFixed(2)} USD</p>
<p>${coinTo}: $${toPriceUSD.toFixed(2)} USD</p>
<p class="mt-1">Market rate: 1 ${coinFrom} = ${marketRate.toFixed(6)} ${toSymbol}</p>
<p class="mt-1">Market rate: 1 ${coinFrom} = ${marketRate.toFixed(8)} ${coinTo}</p>
`;
}
@@ -1646,8 +1637,6 @@ document.addEventListener('DOMContentLoaded', () => {
document.getElementById('coin_to').addEventListener('change', applyFilters);
document.getElementById('coin_from').addEventListener('change', applyFilters);
document.getElementById('sort_by').addEventListener('change', applyFilters);
document.getElementById('sort_dir').addEventListener('change', applyFilters);
document.getElementById('clearFilters').addEventListener('click', () => {
filterForm.reset();

View File

@@ -209,7 +209,7 @@ fetchHistoricalDataXHR: (coinSymbol) => {
// Cache
const cache = {
ttl: 15 * 60 * 1000,
ttl: 15 * 60 * 1000, // 15 minutes in milliseconds
set: (key, value, customTtl = null) => {
const item = {
value: value,
@@ -858,7 +858,7 @@ const app = {
autoRefreshInterval: null,
nextRefreshTime: null,
lastRefreshedTime: null,
isAutoRefreshEnabled: localStorage.getItem('autoRefreshEnabled') === 'true',
isAutoRefreshEnabled: localStorage.getItem('autoRefreshEnabled') !== 'false',
refreshTexts: {
label: 'Auto-refresh in',
disabled: 'Auto-refresh: disabled',
@@ -868,6 +868,7 @@ const app = {
init: () => {
window.addEventListener('load', app.onLoad);
app.loadLastRefreshedTime();
app.updateAutoRefreshButton();
},
onLoad: async () => {
@@ -882,44 +883,22 @@ const app = {
} else {
console.warn('Chart container not found, skipping chart initialization');
}
for (const coin of config.coins) {
await app.loadCoinData(coin);
}
// Load all coin data immediately
await app.loadAllCoinData();
if (chartModule.chart) {
config.currentResolution = 'month';
await chartModule.updateChart('BTC');
app.updateResolutionButtons('BTC');
}
ui.setActiveContainer('btc-container');
config.coins.forEach(coin => {
const container = document.getElementById(`${coin.symbol.toLowerCase()}-container`);
if (container) {
container.addEventListener('click', () => {
ui.setActiveContainer(`${coin.symbol.toLowerCase()}-container`);
if (chartModule.chart) {
if (coin.symbol === 'WOW') {
config.currentResolution = 'day';
}
chartModule.updateChart(coin.symbol);
app.updateResolutionButtons(coin.symbol);
}
});
}
});
const refreshAllButton = document.getElementById('refresh-all');
if (refreshAllButton) {
refreshAllButton.addEventListener('click', app.refreshAllData);
}
// Set up event listeners and other initializations
app.setupEventListeners();
app.initializeSelectImages();
const headers = document.querySelectorAll('th');
headers.forEach((header, index) => {
header.addEventListener('click', () => app.sortTable(index, header.classList.contains('disabled')));
});
const closeErrorButton = document.getElementById('close-error');
if (closeErrorButton) {
closeErrorButton.addEventListener('click', ui.hideErrorMessage);
}
app.initAutoRefresh();
} catch (error) {
console.error('Error during initialization:', error);
ui.displayErrorMessage('Failed to initialize the dashboard. Please try refreshing the page.');
@@ -930,7 +909,13 @@ const app = {
}
}
},
loadAllCoinData: async () => {
for (const coin of config.coins) {
await app.loadCoinData(coin);
}
},
loadCoinData: async (coin) => {
const cacheKey = `coinData_${coin.symbol}`;
let cachedData = cache.get(cacheKey);
@@ -962,6 +947,39 @@ const app = {
ui.displayCoinData(coin.symbol, data);
ui.updateLoadTimeAndCache(0, cachedData);
},
setupEventListeners: () => {
config.coins.forEach(coin => {
const container = document.getElementById(`${coin.symbol.toLowerCase()}-container`);
if (container) {
container.addEventListener('click', () => {
ui.setActiveContainer(`${coin.symbol.toLowerCase()}-container`);
if (chartModule.chart) {
if (coin.symbol === 'WOW') {
config.currentResolution = 'day';
}
chartModule.updateChart(coin.symbol);
app.updateResolutionButtons(coin.symbol);
}
});
}
});
const refreshAllButton = document.getElementById('refresh-all');
if (refreshAllButton) {
refreshAllButton.addEventListener('click', app.refreshAllData);
}
const headers = document.querySelectorAll('th');
headers.forEach((header, index) => {
header.addEventListener('click', () => app.sortTable(index, header.classList.contains('disabled')));
});
const closeErrorButton = document.getElementById('close-error');
if (closeErrorButton) {
closeErrorButton.addEventListener('click', ui.hideErrorMessage);
}
},
initAutoRefresh: () => {
const toggleAutoRefreshButton = document.getElementById('toggle-auto-refresh');
@@ -990,13 +1008,13 @@ const app = {
app.stopAutoRefresh();
if (resetTimer || !app.nextRefreshTime) {
app.nextRefreshTime = Date.now() + 15 * 60 * 1000;
app.nextRefreshTime = Date.now() + cache.ttl;
}
const timeUntilNextRefresh = Math.max(0, app.nextRefreshTime - Date.now());
if (timeUntilNextRefresh === 0) {
app.nextRefreshTime = Date.now() + 15 * 60 * 1000;
app.nextRefreshTime = Date.now() + cache.ttl;
}
app.autoRefreshInterval = setTimeout(() => {
@@ -1061,37 +1079,37 @@ const app = {
},
updateAutoRefreshButton: () => {
const button = document.getElementById('toggle-auto-refresh');
if (button) {
if (app.isAutoRefreshEnabled) {
button.classList.remove('text-gray-600', 'dark:text-gray-400');
button.classList.add('text-green-500', 'dark:text-green-400');
app.startSpinAnimation();
} else {
button.classList.remove('text-green-500', 'dark:text-green-400');
button.classList.add('text-gray-600', 'dark:text-gray-400');
app.stopSpinAnimation();
const button = document.getElementById('toggle-auto-refresh');
if (button) {
if (app.isAutoRefreshEnabled) {
button.classList.remove('text-gray-600', 'dark:text-gray-400');
button.classList.add('text-green-500', 'dark:text-green-400');
app.startSpinAnimation();
} else {
button.classList.remove('text-green-500', 'dark:text-green-400');
button.classList.add('text-gray-600', 'dark:text-gray-400');
app.stopSpinAnimation();
}
button.title = app.isAutoRefreshEnabled ? 'Disable Auto-Refresh' : 'Enable Auto-Refresh';
}
button.title = app.isAutoRefreshEnabled ? 'Disable Auto-Refresh' : 'Enable Auto-Refresh';
}
},
},
startSpinAnimation: () => {
const svg = document.querySelector('#toggle-auto-refresh svg');
if (svg) {
svg.classList.add('animate-spin');
setTimeout(() => {
startSpinAnimation: () => {
const svg = document.querySelector('#toggle-auto-refresh svg');
if (svg) {
svg.classList.add('animate-spin');
setTimeout(() => {
svg.classList.remove('animate-spin');
}, 2000);
}
},
stopSpinAnimation: () => {
const svg = document.querySelector('#toggle-auto-refresh svg');
if (svg) {
svg.classList.remove('animate-spin');
}, 2000); // Remove the animation after 2 seconds
}
},
stopSpinAnimation: () => {
const svg = document.querySelector('#toggle-auto-refresh svg');
if (svg) {
svg.classList.remove('animate-spin');
}
},
}
},
refreshAllData: async () => {
ui.showLoader();
@@ -1099,9 +1117,7 @@ stopSpinAnimation: () => {
try {
cache.clear();
await app.updateBTCPrice();
for (const coin of config.coins) {
await app.loadCoinData(coin);
}
await app.loadAllCoinData();
if (chartModule.currentCoin) {
await chartModule.updateChart(chartModule.currentCoin, true);
}