ui: USD prices (single/total) in wallet/wallets, tooltip header update.
This commit is contained in:
parent
88fd8ac23e
commit
416b003da9
@ -106,9 +106,25 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Add this to your existing CSS file */
|
/* Add this to your existing CSS file */
|
||||||
.error {
|
.error {
|
||||||
border: 1px solid red !important;
|
border: 1px solid red !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.active-container {
|
||||||
|
position: relative;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active-container::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
border: 1px solid rgb(77, 132, 240);
|
||||||
|
border-radius: inherit;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<p class="mr-1 text-sm text-gray-90 dark:text-white font-medium ">© 2023~</p>
|
<p class="mr-1 text-sm text-gray-90 dark:text-white font-medium ">© 2023~</p>
|
||||||
<p class="text-sm text-coolGray-400 dark:text-white font-medium">{{ title }}</p> <span class="w-1 h-1 mx-1.5 bg-gray-500 rounded-full"></span>
|
<p class="text-sm text-coolGray-400 dark:text-white font-medium">{{ title }}</p> <span class="w-1 h-1 mx-1.5 bg-gray-500 rounded-full"></span>
|
||||||
<p class="text-sm text-coolGray-400 dark:text-white font-medium">GUI 2.0.1 </p> <span class="w-1 h-1 mx-1.5 bg-gray-500 rounded-full"></span>
|
<p class="text-sm text-coolGray-400 dark:text-white font-medium">GUI 2.0.2 </p> <span class="w-1 h-1 mx-1.5 bg-gray-500 rounded-full"></span>
|
||||||
<p class="mr-2 text-sm font-bold dark:text-white text-gray-90 ">Made with </p>
|
<p class="mr-2 text-sm font-bold dark:text-white text-gray-90 ">Made with </p>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24">
|
<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24">
|
||||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#f80b0b" stroke-linejoin="round">
|
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#f80b0b" stroke-linejoin="round">
|
||||||
@ -51,35 +51,44 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<script>
|
|
||||||
window.onload = () => {
|
|
||||||
toggleImages();
|
|
||||||
};
|
|
||||||
|
|
||||||
document.getElementById('theme-toggle').addEventListener('click', () => {
|
<script>
|
||||||
toggleImages();
|
(function() {
|
||||||
});
|
var toggleImages = function() {
|
||||||
|
var html = document.querySelector('html');
|
||||||
|
var darkImages = document.querySelectorAll('.dark-image');
|
||||||
|
var lightImages = document.querySelectorAll('.light-image');
|
||||||
|
|
||||||
function toggleImages() {
|
if (html && html.classList.contains('dark')) {
|
||||||
const html = document.querySelector('html');
|
toggleImageDisplay(darkImages, 'block');
|
||||||
const darkImages = document.querySelectorAll('.dark-image');
|
toggleImageDisplay(lightImages, 'none');
|
||||||
const lightImages = document.querySelectorAll('.light-image');
|
} else {
|
||||||
|
toggleImageDisplay(darkImages, 'none');
|
||||||
if (html && html.classList.contains('dark')) {
|
toggleImageDisplay(lightImages, 'block');
|
||||||
toggleImageDisplay(darkImages, 'block');
|
|
||||||
toggleImageDisplay(lightImages, 'none');
|
|
||||||
} else {
|
|
||||||
toggleImageDisplay(darkImages, 'none');
|
|
||||||
toggleImageDisplay(lightImages, 'block');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function toggleImageDisplay(images, display) {
|
var toggleImageDisplay = function(images, display) {
|
||||||
images.forEach(img => {
|
images.forEach(function(img) {
|
||||||
img.style.display = display;
|
img.style.display = display;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
var themeToggle = document.getElementById('theme-toggle');
|
||||||
|
|
||||||
|
if (themeToggle) {
|
||||||
|
themeToggle.addEventListener('click', function() {
|
||||||
|
toggleImages();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
</script>
|
|
||||||
|
toggleImages();
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var themeToggleDarkIcon = document.getElementById('theme-toggle-dark-icon');
|
var themeToggleDarkIcon = document.getElementById('theme-toggle-dark-icon');
|
||||||
|
@ -357,10 +357,12 @@
|
|||||||
<path data-cap="butt" d="M10,10a2,2,0,0,1,4,0" stroke="#2ad167"></path></g>
|
<path data-cap="butt" d="M10,10a2,2,0,0,1,4,0" stroke="#2ad167"></path></g>
|
||||||
</svg>
|
</svg>
|
||||||
<span data-tooltip-target="tooltip-DEV" ></span> </div>
|
<span data-tooltip-target="tooltip-DEV" ></span> </div>
|
||||||
<div class="tooltip-arrow" data-popper-arrow></div>
|
|
||||||
<div id="tooltip-DEV" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
<div id="tooltip-DEV" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
||||||
<p>Debug mode: Active </p> {% if debug_ui_mode == true %}
|
<p><b>Debug mode:</b> Active</p>
|
||||||
<p> Debug UI mode: Active </p> {% endif %} </div>
|
{% if debug_ui_mode == true %}
|
||||||
|
<p><b>Debug UI mode:</b> Active</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- dev mode icons on/off -->
|
<!-- dev mode icons on/off -->
|
||||||
@ -372,10 +374,9 @@
|
|||||||
<div data-tooltip-target="tooltip-locked-wallets" class="ml-5 flex items-center text-gray-50 hover:text-gray-100 text-sm">
|
<div data-tooltip-target="tooltip-locked-wallets" class="ml-5 flex items-center text-gray-50 hover:text-gray-100 text-sm">
|
||||||
<svg class="text-gray-500 w-5 h-5 mr-3" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"><g stroke-linecap="round" stroke-width="2" fill="none" stroke="#2ad167" stroke-linejoin="round"><rect x="3" y="11" width="18" height="12" rx="2"></rect><circle cx="12" cy="17" r="2" stroke="#2ad167"></circle><path d="M17,7V6a4.951,4.951,0,0,0-4.9-5H12A4.951,4.951,0,0,0,7,5.9V7" stroke="#2ad167"></path></g></svg>
|
<svg class="text-gray-500 w-5 h-5 mr-3" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"><g stroke-linecap="round" stroke-width="2" fill="none" stroke="#2ad167" stroke-linejoin="round"><rect x="3" y="11" width="18" height="12" rx="2"></rect><circle cx="12" cy="17" r="2" stroke="#2ad167"></circle><path d="M17,7V6a4.951,4.951,0,0,0-4.9-5H12A4.951,4.951,0,0,0,7,5.9V7" stroke="#2ad167"></path></g></svg>
|
||||||
<span data-tooltip-target="tooltip-locked-wallets" ></span> </div>
|
<span data-tooltip-target="tooltip-locked-wallets" ></span> </div>
|
||||||
<div class="tooltip-arrow" data-popper-arrow></div>
|
|
||||||
<div id="tooltip-locked-wallets" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
<div id="tooltip-locked-wallets" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
||||||
<p>Wallets locked </p>
|
<p><b>Wallets:</b> Locked </p>
|
||||||
<p> </p> </div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href='/lock'>
|
<a href='/lock'>
|
||||||
<div data-tooltip-target="tooltip-unlocked-wallets" class="ml-5 flex items-center text-gray-50 hover:text-gray-100 text-sm">
|
<div data-tooltip-target="tooltip-unlocked-wallets" class="ml-5 flex items-center text-gray-50 hover:text-gray-100 text-sm">
|
||||||
@ -383,8 +384,8 @@
|
|||||||
<span data-tooltip-target="tooltip-unlocked-wallets" ></span> </div>
|
<span data-tooltip-target="tooltip-unlocked-wallets" ></span> </div>
|
||||||
<div class="tooltip-arrow" data-popper-arrow></div>
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
<div id="tooltip-unlocked-wallets" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
<div id="tooltip-unlocked-wallets" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
||||||
<p>Wallets unlocked </p>
|
<p><b>Wallets:</b> Unlocked </p>
|
||||||
<p> </p> </div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li></ul>
|
</li></ul>
|
||||||
@ -403,9 +404,8 @@
|
|||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
</a> <span data-tooltip-target="tooltip-TOR"></span></div>
|
</a> <span data-tooltip-target="tooltip-TOR"></span></div>
|
||||||
<div class="tooltip-arrow" data-popper-arrow></div>
|
<div id="tooltip-TOR" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip"><b>Tor mode:</b> Active {% if tor_established == true %}
|
||||||
<div id="tooltip-TOR" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip"> Tor mode: Active {% if tor_established == true %}
|
<br><b>Tor:</b> Connected{% endif %}</div>
|
||||||
<br> Tor: Connected{% endif %}</div>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- tor -->
|
<!-- tor -->
|
||||||
@ -414,7 +414,6 @@
|
|||||||
<svg id="theme-toggle-dark-icon" class="hidden w-5 h-5" fill="#F59E0B" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path></svg>
|
<svg id="theme-toggle-dark-icon" class="hidden w-5 h-5" fill="#F59E0B" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path></svg>
|
||||||
<svg id="theme-toggle-light-icon" class="hidden w-5 h-5" fill="#F59E0B" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
|
<svg id="theme-toggle-light-icon" class="hidden w-5 h-5" fill="#F59E0B" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
|
||||||
<span data-tooltip-target="tooltip-darkmode"></span>
|
<span data-tooltip-target="tooltip-darkmode"></span>
|
||||||
<div class="tooltip-arrow" data-popper-arrow></div>
|
|
||||||
<div id="tooltip-darkmode" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">Dark mode</div>
|
<div id="tooltip-darkmode" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">Dark mode</div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -447,7 +446,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<div class="flex-shrink-0 w-px h-10 bg-gray-200 dark:bg-gray-400 mr-10"></div>
|
<div class="flex-shrink-0 w-px h-10 bg-gray-200 dark:bg-gray-400 mr-10"></div>
|
||||||
<li>
|
<li>
|
||||||
<a class="flex mr-5 items-center text-sm text-gray-400 hover:text-gray-600 dark:text-gray-100 dark:hover:text-gray-100" href="/sentoffers">
|
<a data-tooltip-target="tooltip-your-offers" class="flex mr-5 items-center text-sm text-gray-400 hover:text-gray-600 dark:text-gray-100 dark:hover:text-gray-100" href="/sentoffers">
|
||||||
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 24 24">
|
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 24 24">
|
||||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round">
|
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round">
|
||||||
<circle cx="5" cy="5" r="4"></circle>
|
<circle cx="5" cy="5" r="4"></circle>
|
||||||
@ -458,6 +457,12 @@
|
|||||||
<polyline points=" 8,16 11,19 8,22 " stroke="#6b7280"></polyline>
|
<polyline points=" 8,16 11,19 8,22 " stroke="#6b7280"></polyline>
|
||||||
</g>
|
</g>
|
||||||
</svg><span>Your Offers</span> <span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full" title="Total {{ summary.num_sent_offers }}">{{ summary.num_sent_active_offers }}</span></a>
|
</svg><span>Your Offers</span> <span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full" title="Total {{ summary.num_sent_offers }}">{{ summary.num_sent_active_offers }}</span></a>
|
||||||
|
|
||||||
|
<div id="tooltip-your-offers" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
||||||
|
<p><b>Total:</b> {{ summary.num_sent_offers }}</p>
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
<div class="flex-shrink-0 w-px h-10 bg-gray-200 dark:bg-gray-400 mr-10"></div>
|
<div class="flex-shrink-0 w-px h-10 bg-gray-200 dark:bg-gray-400 mr-10"></div>
|
||||||
<li>
|
<li>
|
||||||
@ -470,7 +475,7 @@
|
|||||||
</svg><span>Available Bids</span> <span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full">{{ summary.num_available_bids }}</span></a>
|
</svg><span>Available Bids</span> <span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full">{{ summary.num_available_bids }}</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="flex mr-10 items-center text-sm text-gray-400 hover:text-gray-600 dark:text-gray-100 dark:hover:text-gray-100" href="/receivedbids">
|
<a data-tooltip-target="tooltip-bids-received" class="flex mr-10 items-center text-sm text-gray-400 hover:text-gray-600 dark:text-gray-100 dark:hover:text-gray-100" href="/receivedbids">
|
||||||
<svg class="text-gray-100 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24">
|
<svg class="text-gray-100 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24">
|
||||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round">
|
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round">
|
||||||
<path d="M2,16v4a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V16"> </path>
|
<path d="M2,16v4a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V16"> </path>
|
||||||
@ -479,8 +484,13 @@
|
|||||||
</g>
|
</g>
|
||||||
</svg><span>Bids Received</span> <span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full" title="Total {{ summary.num_recv_bids }}">{{ summary.num_available_bids }}</span></a>
|
</svg><span>Bids Received</span> <span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full" title="Total {{ summary.num_recv_bids }}">{{ summary.num_available_bids }}</span></a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<div id="tooltip-bids-received" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
||||||
|
<p><b>Total:</b> {{ summary.num_recv_bids }}</p>
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
<li>
|
<li>
|
||||||
<a class="flex mr-10 items-center text-sm text-gray-400 hover:text-gray-600 dark:text-gray-100 dark:hover:text-gray-100" href="/sentbids">
|
<a data-tooltip-target="tooltip-bids-sent" class="flex mr-10 items-center text-sm text-gray-400 hover:text-gray-600 dark:text-gray-100 dark:hover:text-gray-100" href="/sentbids">
|
||||||
<svg class="text-gray-100 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24">
|
<svg class="text-gray-100 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24">
|
||||||
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round">
|
<g stroke-linecap="round" stroke-width="2" fill="none" stroke="#6b7280" stroke-linejoin="round">
|
||||||
<path d="M2,16v4a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V16"></path>
|
<path d="M2,16v4a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V16"></path>
|
||||||
@ -488,6 +498,13 @@
|
|||||||
<polyline points="17 7 12 2 7 7" stroke="#6b7280"></polyline>
|
<polyline points="17 7 12 2 7 7" stroke="#6b7280"></polyline>
|
||||||
</g>
|
</g>
|
||||||
</svg> <span>Bids Sent</span><span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full" title="Total {{ summary.num_sent_bids }}">{{ summary.num_sent_active_bids }}</span></a>
|
</svg> <span>Bids Sent</span><span class="inline-flex justify-center items-center text-xs font-semibold ml-3 mr-2 px-2.5 py-1 font-small text-white bg-blue-500 rounded-full" title="Total {{ summary.num_sent_bids }}">{{ summary.num_sent_active_bids }}</span></a>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="tooltip-bids-sent" role="tooltip" class="inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-blue-500 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip">
|
||||||
|
<p><b>Total:</b> {{ summary.num_sent_bids }}</p>
|
||||||
|
<div class="tooltip-arrow" data-popper-arrow></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -39,8 +39,8 @@
|
|||||||
<div class="w-full md:w-1/2 p-3">
|
<div class="w-full md:w-1/2 p-3">
|
||||||
<h2 class="text-4xl font-bold text-white tracking-tighter">
|
<h2 class="text-4xl font-bold text-white tracking-tighter">
|
||||||
<span class="inline-block align-middle">
|
<span class="inline-block align-middle">
|
||||||
<img class="h-20" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }}">
|
<img class="mr-2" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }}">
|
||||||
</span>{{ w.name }} Wallet
|
</span>{{ w.name }} Wallet - <span id="total-usd-value"></span>
|
||||||
</h2>
|
</h2>
|
||||||
<p class="font-normal text-coolGray-200 dark:text-white pl-2 pt-5">Manage your {{ w.ticker }} wallet. {% if refresh %} (Page Refresh: {{ refresh }} seconds) {% endif %}</p>
|
<p class="font-normal text-coolGray-200 dark:text-white pl-2 pt-5">Manage your {{ w.ticker }} wallet. {% if refresh %} (Page Refresh: {{ refresh }} seconds) {% endif %}</p>
|
||||||
</div>
|
</div>
|
||||||
@ -163,10 +163,7 @@
|
|||||||
<img class="h-7" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }}">
|
<img class="h-7" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }}">
|
||||||
</span>Balance:
|
</span>Balance:
|
||||||
</td>
|
</td>
|
||||||
<td class="py-3 px-6 bold">{{ w.balance }}</td>
|
<td class="py-3 px-6 bold coinname-value" data-coinname="{{ w.name }}">{{ w.balance }} {{ w.ticker }} (<span class="usd-value"></span>){% if w.unconfirmed %} <span class="inline-block py-1 px-2 rounded-full bg-green-100 text-green-500 dark:bg-gray-500 dark:text-green-500">Unconfirmed: +{{ w.unconfirmed }} {{ w.ticker }}</span>{% endif %}</td>
|
||||||
{% if w.unconfirmed %}<td>Unconfirmed:</td>
|
|
||||||
<td>{{ w.unconfirmed }}</td>
|
|
||||||
{% endif %}
|
|
||||||
</tr>
|
</tr>
|
||||||
{% if w.cid == '1' %}
|
{% if w.cid == '1' %}
|
||||||
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
||||||
@ -175,11 +172,7 @@
|
|||||||
<img class="h-7" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }} Blind">
|
<img class="h-7" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }} Blind">
|
||||||
</span>Blind Balance:
|
</span>Blind Balance:
|
||||||
</td>
|
</td>
|
||||||
<td class="py-3 px-6 bold">{{ w.blind_balance }}</td>
|
<td class="py-3 px-6 bold coinname-value" data-coinname="{{ w.name }}">{{ w.blind_balance }} {{ w.ticker }} (<span class="usd-value"></span>) {% if w.blind_unconfirmed %} <span class="inline-block py-1 px-2 rounded-full bg-green-100 text-green-500 dark:bg-gray-500 dark:text-green-500">Unconfirmed: +{{ w.blind_unconfirmed }} {{ w.ticker }}</span>{% endif %}</td>
|
||||||
{% if w.blind_unconfirmed %}
|
|
||||||
<td>Blind Unconfirmed:</td>
|
|
||||||
<td>{{ w.blind_unconfirmed }}</td>
|
|
||||||
{% endif %}
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
||||||
<td class="py-3 px-6 bold">
|
<td class="py-3 px-6 bold">
|
||||||
@ -187,8 +180,8 @@
|
|||||||
<img class="h-7" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }} Anon">
|
<img class="h-7" src="/static/images/coins/{{ w.name }}.png" alt="{{ w.name }} Anon">
|
||||||
</span>Anon Balance:
|
</span>Anon Balance:
|
||||||
</td>
|
</td>
|
||||||
<td class="py-3 px-6 bold">{{ w.anon_balance }}</td> {% if w.anon_pending %} <td>Anon Pending:</td>
|
<td class="py-3 px-6 bold coinname-value" data-coinname="{{ w.name }}">{{ w.anon_balance }} {{ w.ticker }} (<span class="usd-value"></span>) {% if w.anon_pending %} <span class="inline-block py-1 px-2 rounded-full bg-green-100 text-green-500 dark:bg-gray-500 dark:text-green-500">Pending: +{{ w.anon_pending }} {{ w.ticker }}</span>{% endif %}</td>
|
||||||
<td>{{ w.anon_pending }}</td>{% endif %}
|
<td class="usd-value"></td>
|
||||||
</tr> {% endif %} <tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
</tr> {% endif %} <tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
||||||
<td class="py-3 px-6 bold">Blocks:</td>
|
<td class="py-3 px-6 bold">Blocks:</td>
|
||||||
<td class="py-3 px-6">{{ w.blocks }} {% if w.known_block_count %} / {{ w.known_block_count }} {% endif %}</td>
|
<td class="py-3 px-6">{{ w.blocks }} {% if w.known_block_count %} / {{ w.known_block_count }} {% endif %}</td>
|
||||||
@ -237,26 +230,26 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
||||||
<td class="py-3 px-6 bold">
|
<td class="py-3 px-6 bold">
|
||||||
<button type="submit" class="flex flex-wrap justify-center w-52 py-2 px-4 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none" name="newaddr_{{ w.cid }}" value="New Subaddress">
|
<button type="submit" class="flex flex-wrap justify-center py-2 px-4 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none" name="newaddr_{{ w.cid }}" value="New Subaddress">
|
||||||
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
|
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
|
||||||
<g fill="#ffffff" class="nc-icon-wrapper">
|
<g fill="#ffffff" class="nc-icon-wrapper">
|
||||||
<path fill="#ffffff" d="M12,3c1.989,0,3.873,0.65,5.43,1.833l-3.604,3.393l9.167,0.983L22.562,0l-3.655,3.442 C16.957,1.862,14.545,1,12,1C5.935,1,1,5.935,1,12h2C3,7.037,7.037,3,12,3z"></path>
|
<path fill="#ffffff" d="M12,3c1.989,0,3.873,0.65,5.43,1.833l-3.604,3.393l9.167,0.983L22.562,0l-3.655,3.442 C16.957,1.862,14.545,1,12,1C5.935,1,1,5.935,1,12h2C3,7.037,7.037,3,12,3z"></path>
|
||||||
<path data-color="color-2" d="M12,21c-1.989,0-3.873-0.65-5.43-1.833l3.604-3.393l-9.167-0.983L1.438,24l3.655-3.442 C7.043,22.138,9.455,23,12,23c6.065,0,11-4.935,11-11h-2C21,16.963,16.963,21,12,21z"></path>
|
<path data-color="color-2" d="M12,21c-1.989,0-3.873-0.65-5.43-1.833l3.604-3.393l-9.167-0.983L1.438,24l3.655-3.442 C7.043,22.138,9.455,23,12,23c6.065,0,11-4.935,11-11h-2C21,16.963,16.963,21,12,21z"></path>
|
||||||
</g>
|
</g>
|
||||||
</svg> New Subaddress </button>
|
</svg> New {{ w.ticker }} Sub Address </button>
|
||||||
</td>
|
</td>
|
||||||
<td colspan=2 class="py-3 px-6 monospace select-all">{{ w.deposit_address }}</td>
|
<td colspan=2 class="py-3 px-6 monospace select-all">{{ w.deposit_address }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
<tr class="opacity-100 text-gray-500 dark:text-gray-100 hover:bg-coolGray-200 dark:hover:bg-gray-600">
|
||||||
<td class="py-3 px-6 bold">
|
<td class="py-3 px-6 bold">
|
||||||
<button type="submit" class="flex flex-wrap justify-center w-52 py-2 px-4 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none" name="newaddr_{{ w.cid }}" value="New Deposit Address">
|
<button type="submit" class="flex flex-wrap justify-center py-2 px-4 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none" name="newaddr_{{ w.cid }}" value="New Deposit Address">
|
||||||
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
|
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
|
||||||
<g fill="#ffffff" class="nc-icon-wrapper">
|
<g fill="#ffffff" class="nc-icon-wrapper">
|
||||||
<path fill="#ffffff" d="M12,3c1.989,0,3.873,0.65,5.43,1.833l-3.604,3.393l9.167,0.983L22.562,0l-3.655,3.442 C16.957,1.862,14.545,1,12,1C5.935,1,1,5.935,1,12h2C3,7.037,7.037,3,12,3z"></path>
|
<path fill="#ffffff" d="M12,3c1.989,0,3.873,0.65,5.43,1.833l-3.604,3.393l9.167,0.983L22.562,0l-3.655,3.442 C16.957,1.862,14.545,1,12,1C5.935,1,1,5.935,1,12h2C3,7.037,7.037,3,12,3z"></path>
|
||||||
<path data-color="color-2" d="M12,21c-1.989,0-3.873-0.65-5.43-1.833l3.604-3.393l-9.167-0.983L1.438,24l3.655-3.442 C7.043,22.138,9.455,23,12,23c6.065,0,11-4.935,11-11h-2C21,16.963,16.963,21,12,21z"></path>
|
<path data-color="color-2" d="M12,21c-1.989,0-3.873-0.65-5.43-1.833l3.604-3.393l-9.167-0.983L1.438,24l3.655-3.442 C7.043,22.138,9.455,23,12,23c6.065,0,11-4.935,11-11h-2C21,16.963,16.963,21,12,21z"></path>
|
||||||
</g>
|
</g>
|
||||||
</svg>New Deposit Address</button>
|
</svg>New {{ w.ticker }} Deposit Address</button>
|
||||||
</td>
|
</td>
|
||||||
<td colspan=2 class="py-3 px-6 monospace bold select-all" id="deposit_address">{{ w.deposit_address }}</td>
|
<td colspan=2 class="py-3 px-6 monospace bold select-all" id="deposit_address">{{ w.deposit_address }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -315,13 +308,13 @@
|
|||||||
<polygon data-color="color-2" points="6,10 12,17 18,10 13,10 13,1 11,1 11,10 "></polygon>
|
<polygon data-color="color-2" points="6,10 12,17 18,10 13,10 13,1 11,1 11,10 "></polygon>
|
||||||
<path fill="#ffffff" d="M22,21H2v-6H0v7c0,0.552,0.448,1,1,1h22c0.552,0,1-0.448,1-1v-7h-2V21z"></path>
|
<path fill="#ffffff" d="M22,21H2v-6H0v7c0,0.552,0.448,1,1,1h22c0.552,0,1-0.448,1-1v-7h-2V21z"></path>
|
||||||
</g>
|
</g>
|
||||||
</svg>Withdraw</button>
|
</svg>Withdraw {{ w.ticker }}</button>
|
||||||
</td>
|
</td>
|
||||||
<td class="py-3 px-6">
|
<td class="py-3 px-6">
|
||||||
<input placeholder="Address" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-400 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0" type="text" name="to_{{ w.cid }}" value="{{ w.wd_address }}">
|
<input placeholder="{{ w.ticker }} Address" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-400 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0" type="text" name="to_{{ w.cid }}" value="{{ w.wd_address }}">
|
||||||
</td>
|
</td>
|
||||||
<td class="py-3 px-6">
|
<td class="py-3 px-6">
|
||||||
<input placeholder="Amount" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-400 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0" type="text" name="amt_{{ w.cid }}" value="{{ w.wd_value }}">
|
<input placeholder="{{ w.ticker }} Amount" class="hover:border-blue-500 bg-gray-50 text-gray-900 appearance-none pr-10 dark:bg-gray-500 dark:text-white border border-gray-300 dark:border-gray-400 dark:text-gray-50 dark:placeholder-gray-400 text-sm rounded-lg outline-none focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 focus:ring-0" type="text" name="amt_{{ w.cid }}" value="{{ w.wd_value }}">
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="opacity-100 text-gray-500 dark:text-gray-100">
|
<tr class="opacity-100 text-gray-500 dark:text-gray-100">
|
||||||
@ -511,6 +504,117 @@
|
|||||||
<input type="hidden" name="formid" value="{{ form_id }}">
|
<input type="hidden" name="formid" value="{{ form_id }}">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
const coinNameToSymbol = {
|
||||||
|
'Bitcoin': 'BTC',
|
||||||
|
'Particl': 'PART',
|
||||||
|
'Particl Blind': 'PART',
|
||||||
|
'Particl Anon': 'PART',
|
||||||
|
'Monero': 'XMR',
|
||||||
|
'Litecoin': 'LTC',
|
||||||
|
'Firo': 'FIRO',
|
||||||
|
'Dash': 'DASH',
|
||||||
|
'PIVX': 'PIVX'
|
||||||
|
};
|
||||||
|
|
||||||
|
const getUsdValue = (cryptoValue, coinSymbol) => fetch(`https://min-api.cryptocompare.com/data/price?fsym=${coinSymbol}&tsyms=USD`)
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
const exchangeRate = data.USD;
|
||||||
|
if (!isNaN(exchangeRate)) {
|
||||||
|
return cryptoValue * exchangeRate;
|
||||||
|
} else {
|
||||||
|
throw new Error(`Invalid exchange rate for ${coinSymbol}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const updateUsdValue = async (cryptoCell, coinFullName, usdValueSpan) => {
|
||||||
|
console.log('updateUsdValue called with:', cryptoCell, coinFullName);
|
||||||
|
const coinSymbol = coinNameToSymbol[coinFullName] || '';
|
||||||
|
if (!coinSymbol) {
|
||||||
|
console.error(`Coin symbol not found for full name: ${coinFullName}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const cryptoValue = parseFloat(cryptoCell.textContent);
|
||||||
|
|
||||||
|
if (!isNaN(cryptoValue) && cryptoValue !== 0) {
|
||||||
|
try {
|
||||||
|
const usdValue = await getUsdValue(cryptoValue, coinSymbol);
|
||||||
|
console.log('usdValue:', usdValue);
|
||||||
|
if (usdValueSpan) {
|
||||||
|
usdValueSpan.textContent = `$${usdValue.toFixed(2)}`;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error in updateUsdValue:', error);
|
||||||
|
if (usdValueSpan) {
|
||||||
|
usdValueSpan.textContent = 'Error retrieving exchange rate';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (usdValueSpan) {
|
||||||
|
usdValueSpan.textContent = `$0.00`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const calculateTotalUsdValue = async () => {
|
||||||
|
const coinNameValues = document.querySelectorAll('.coinname-value');
|
||||||
|
let totalUsdValue = 0;
|
||||||
|
|
||||||
|
for (const coinNameValue of coinNameValues) {
|
||||||
|
const coinFullName = coinNameValue.getAttribute('data-coinname');
|
||||||
|
const cryptoValue = parseFloat(coinNameValue.textContent);
|
||||||
|
const coinSymbol = coinNameToSymbol[coinFullName];
|
||||||
|
|
||||||
|
if (coinSymbol) {
|
||||||
|
const usdValueSpan = coinNameValue.querySelector('.usd-value');
|
||||||
|
|
||||||
|
if (!isNaN(cryptoValue) && cryptoValue !== 0) {
|
||||||
|
try {
|
||||||
|
const usdValue = await getUsdValue(cryptoValue, coinSymbol);
|
||||||
|
totalUsdValue += usdValue;
|
||||||
|
if (usdValueSpan) {
|
||||||
|
usdValueSpan.textContent = `$${usdValue.toFixed(2)}`;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error retrieving exchange rate for ${coinFullName}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (usdValueSpan) {
|
||||||
|
usdValueSpan.textContent = `$0.00`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.error(`Coin symbol not found for full name: ${coinFullName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalUsdValueElement = document.getElementById('total-usd-value');
|
||||||
|
if (totalUsdValueElement) {
|
||||||
|
totalUsdValueElement.textContent = `$${totalUsdValue.toFixed(2)}`;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Call the function to calculate the USD values and total USD value when the DOM content is loaded
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const coinNameValues = document.querySelectorAll('.coinname-value');
|
||||||
|
|
||||||
|
for (const coinNameValue of coinNameValues) {
|
||||||
|
const coinFullName = coinNameValue.getAttribute('data-coinname');
|
||||||
|
const usdValueSpan = coinNameValue.querySelector('.usd-value');
|
||||||
|
updateUsdValue(coinNameValue, coinFullName, usdValueSpan);
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateTotalUsdValue();
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% include 'footer.html' %}
|
||||||
<script>
|
<script>
|
||||||
function confirmReseed() {
|
function confirmReseed() {
|
||||||
return confirm("Are you sure?\nBackup your wallet before and after.\nWon't detect used keys.\nShould only be used for new wallets.");
|
return confirm("Are you sure?\nBackup your wallet before and after.\nWon't detect used keys.\nShould only be used for new wallets.");
|
||||||
@ -524,10 +628,5 @@
|
|||||||
return confirm("Are you sure?");
|
return confirm("Are you sure?");
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% include 'footer.html' %}
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -33,10 +33,36 @@
|
|||||||
<img class="absolute z-10 right-4 bottom-4" src="/static/images/elements/dots-red.svg" alt="">
|
<img class="absolute z-10 right-4 bottom-4" src="/static/images/elements/dots-red.svg" alt="">
|
||||||
<img class="absolute h-64 left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2 object-cover" src="/static/images/elements/wave.svg" alt="">
|
<img class="absolute h-64 left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2 object-cover" src="/static/images/elements/wave.svg" alt="">
|
||||||
<div class="relative z-20 flex flex-wrap items-center -m-3">
|
<div class="relative z-20 flex flex-wrap items-center -m-3">
|
||||||
<div class="w-full md:w-1/2 p-3">
|
<div class="w-full md:w-1/2 p-3 h-48">
|
||||||
<h2 class="mb-6 text-4xl font-bold text-white tracking-tighter">Wallets</h2>
|
|
||||||
<p class="font-normal text-coolGray-200 dark:text-white">Check your coin balances and manage your wallets. {% if refresh %} (Page Refresh: {{ refresh }} seconds) {% endif %}</p>
|
|
||||||
|
<h2 class="mb-6 text-4xl font-bold text-white tracking-tighter">
|
||||||
|
Wallets
|
||||||
|
</h2>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<h2 class="text-lg font-bold text-white tracking-tighter mr-2">
|
||||||
|
Total Assets:
|
||||||
|
</h2>
|
||||||
|
<button id="hide-usd-amount-toggle" class="flex items-center justify-center p-1 focus:ring-0 focus:outline-none">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="#ffffff" height="20" width="20" viewBox="0 0 24 24">
|
||||||
|
<path d="M23.444,10.239a22.936,22.936,0,0,0-2.492-2.948l-4.021,4.021A5.026,5.026,0,0,1,17,12a5,5,0,0,1-5,5,5.026,5.026,0,0,1-.688-.069L8.055,20.188A10.286,10.286,0,0,0,12,21c5.708,0,9.905-5.062,11.445-7.24A3.058,3.058,0,0,0,23.444,10.239Z"></path>
|
||||||
|
<path d="M12,3C6.292,3,2.1,8.062,.555,10.24a3.058,3.058,0,0,0,0,3.52h0a21.272,21.272,0,0,0,4.784,4.9l3.124-3.124a5,5,0,0,1,7.071-7.072L8.464,15.536l10.2-10.2A11.484,11.484,0,0,0,12,3Z"></path>
|
||||||
|
<path data-color="color-2" d="M1,24a1,1,0,0,1-.707-1.707l22-22a1,1,0,0,1,1.414,1.414l-22,22A1,1,0,0,1,1,24Z"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-baseline mt-2">
|
||||||
|
<div id="total-usd-value" class="text-5xl font-bold text-white"></div>
|
||||||
|
<div id="usd-text" class="text-sm text-white ml-1">USD</div>
|
||||||
|
</div>
|
||||||
|
<div id="total-btc-value" class="text-sm text-white mt-2"></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="w-full md:w-1/2 p-3 p-6 container flex flex-wrap items-center justify-end items-center mx-auto">
|
<div class="w-full md:w-1/2 p-3 p-6 container flex flex-wrap items-center justify-end items-center mx-auto">
|
||||||
<a class="mr-5 flex flex-wrap justify-center px-5 py-3 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border dark:bg-gray-500 dark:hover:bg-gray-700 border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none" id="refresh" href="/changepassword">
|
<a class="mr-5 flex flex-wrap justify-center px-5 py-3 bg-blue-500 hover:bg-blue-600 font-medium text-sm text-white border dark:bg-gray-500 dark:hover:bg-gray-700 border-blue-500 rounded-md shadow-button focus:ring-0 focus:outline-none" id="refresh" href="/changepassword">
|
||||||
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
|
<svg class="text-gray-500 w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
|
||||||
@ -82,31 +108,54 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="p-6 bg-coolGray-100 dark:bg-gray-600">
|
<div class="p-6 bg-coolGray-100 dark:bg-gray-600">
|
||||||
<!-- bg here -->
|
<!-- bg here -->
|
||||||
<div class="flex mb-2 justify-between items-center">
|
|
||||||
<h4 class="text-xs font-medium dark:text-white">Balance:</h4>
|
<div class="flex mb-2 justify-between items-center">
|
||||||
<span class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200">{{ w.balance }}</span>
|
<h4 class="text-xs font-medium dark:text-white">Balance:</h4>
|
||||||
</div>{% if w.unconfirmed %}
|
<div class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200 coinname-value" data-coinname="{{ w.name }}">{{ w.balance }} {{ w.ticker }}</div>
|
||||||
<div class="flex mb-2 justify-between items-center">
|
</div>
|
||||||
<h4 class="text-xs font-medium dark:text-white">Unconfirmed:</h4>
|
{% if w.unconfirmed %}
|
||||||
<span class="inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200">{{ w.unconfirmed }}</span>
|
<div class="flex mb-2 justify-between items-center">
|
||||||
</div>
|
<h4 class="text-xs font-medium dark:text-white">Unconfirmed:</h4>
|
||||||
{% endif %}
|
<span class="inline-block py-1 px-2 rounded-full bg-green-100 text-xs text-green-500 dark:bg-gray-500 dark:text-green-500">+{{ w.unconfirmed }} {{ w.ticker }}</span>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="flex mb-2 justify-between items-center">
|
||||||
|
<h4 class="text-xs font-medium dark:text-white">USD value:</h4>
|
||||||
|
<div class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200 usd-value"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{% if w.cid == '1' %}
|
{% if w.cid == '1' %}
|
||||||
<div class="flex mb-2 justify-between items-center">
|
<div class="flex mb-2 justify-between items-center">
|
||||||
<h4 class="text-xs font-medium dark:text-white">Blind Balance:</h4>
|
<h4 class="text-xs font-medium dark:text-white">Blind Balance:</h4>
|
||||||
<span class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200">{{ w.blind_balance }}</span>
|
<span class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200 coinname-value" data-coinname="{{ w.name }}">{{ w.blind_balance }} {{ w.ticker }}</span>
|
||||||
</div>{% if w.blind_unconfirmed %}
|
</div>
|
||||||
|
<div class="flex mb-2 justify-between items-center">
|
||||||
|
<h4 class="text-xs font-medium dark:text-white">USD value:</h4>
|
||||||
|
<div class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200 usd-value"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{% if w.blind_unconfirmed %}
|
||||||
<div class="flex mb-2 justify-between items-center">
|
<div class="flex mb-2 justify-between items-center">
|
||||||
<h4 class="text-xs font-medium dark:text-white">Blind Unconfirmed:</h4>
|
<h4 class="text-xs font-medium dark:text-white">Blind Unconfirmed:</h4>
|
||||||
<span class="inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200">{{ w.blind_unconfirmed }}</span>
|
<span class="bold inline-block py-1 px-2 rounded-full bg-green-100 text-xs text-green-500 dark:bg-gray-500 dark:text-green-500">+{{ w.blind_unconfirmed }} {{ w.ticker }}</span>
|
||||||
</div>{% endif %}
|
</div>{% endif %}
|
||||||
<div class="flex mb-2 justify-between items-center">
|
<div class="flex mb-2 justify-between items-center">
|
||||||
<h4 class="text-xs font-medium dark:text-white">Anon Balance:</h4>
|
<h4 class="text-xs font-medium dark:text-white">Anon Balance:</h4>
|
||||||
<span class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200">{{ w.anon_balance }}</span>
|
<span class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200 coinname-value" data-coinname="{{ w.name }}">{{ w.anon_balance }} {{ w.ticker }}</span>
|
||||||
</div>{% if w.anon_pending %}
|
</div>
|
||||||
|
<div class="flex mb-2 justify-between items-center">
|
||||||
|
<h4 class="text-xs font-medium dark:text-white">USD value:</h4>
|
||||||
|
<div class="bold inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200 usd-value"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{% if w.anon_pending %}
|
||||||
<div class="flex mb-2 justify-between items-center">
|
<div class="flex mb-2 justify-between items-center">
|
||||||
<h4 class="text-xs font-medium dark:text-white">Anon Pending:</h4>
|
<h4 class="text-xs font-medium dark:text-white">Anon Pending:</h4>
|
||||||
<span class="inline-block py-1 px-2 rounded-full bg-blue-100 text-xs text-black-500 dark:bg-gray-500 dark:text-gray-200">{{ w.anon_pending }}</span>
|
<span class="bold inline-block py-1 px-2 rounded-full bg-green-100 text-xs text-green-500 dark:bg-gray-500 dark:text-green-500">
|
||||||
|
+{{ w.anon_pending }} {{ w.ticker }}</span>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -146,6 +195,226 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% include 'footer.html' %}
|
{% include 'footer.html' %}
|
||||||
|
<script>
|
||||||
|
const coinNameToSymbol = {
|
||||||
|
'Bitcoin': 'BTC',
|
||||||
|
'Particl': 'PART',
|
||||||
|
'Particl Blind': 'PART',
|
||||||
|
'Particl Anon': 'PART',
|
||||||
|
'Monero': 'XMR',
|
||||||
|
'Litecoin': 'LTC',
|
||||||
|
'Firo': 'FIRO',
|
||||||
|
'Dash': 'DASH',
|
||||||
|
'PIVX': 'PIVX'
|
||||||
|
};
|
||||||
|
|
||||||
|
const getUsdValue = (cryptoValue, coinSymbol) => {
|
||||||
|
return fetch(`https://min-api.cryptocompare.com/data/price?fsym=${coinSymbol}&tsyms=USD`)
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
const exchangeRate = data.USD;
|
||||||
|
if (!isNaN(exchangeRate)) {
|
||||||
|
return {
|
||||||
|
usdValue: cryptoValue * exchangeRate,
|
||||||
|
btcValue: cryptoValue / exchangeRate
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
throw new Error(`Invalid exchange rate for ${coinSymbol}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateValues = async () => {
|
||||||
|
const coinNameValues = document.querySelectorAll('.coinname-value');
|
||||||
|
|
||||||
|
for (const coinNameValue of coinNameValues) {
|
||||||
|
const coinFullName = coinNameValue.getAttribute('data-coinname');
|
||||||
|
const cryptoValue = parseFloat(coinNameValue.textContent);
|
||||||
|
const coinSymbol = coinNameToSymbol[coinFullName];
|
||||||
|
|
||||||
|
if (coinSymbol) {
|
||||||
|
try {
|
||||||
|
const { usdValue, btcValue } = await getUsdValue(cryptoValue, coinSymbol);
|
||||||
|
|
||||||
|
const usdValueElement = coinNameValue.nextElementSibling.querySelector('.usd-value');
|
||||||
|
if (usdValueElement) {
|
||||||
|
usdValueElement.textContent = `$${usdValue.toFixed(2)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const btcValueElement = coinNameValue.nextElementSibling.querySelector('.btc-value');
|
||||||
|
if (btcValueElement) {
|
||||||
|
btcValueElement.textContent = `${btcValue.toFixed(8)} BTC`;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error retrieving exchange rate for ${coinSymbol}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.error(`Coin symbol not found for full name: ${coinFullName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateTotalUsdValue();
|
||||||
|
calculateTotalBtcValue();
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleUsdAmount = (usdCell, isVisible) => {
|
||||||
|
const usdText = document.getElementById('usd-text');
|
||||||
|
if (usdText) {
|
||||||
|
usdText.style.display = isVisible ? 'inline' : 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isVisible) {
|
||||||
|
const coinFullName = usdCell.previousElementSibling.getAttribute('data-coinname');
|
||||||
|
const cryptoValue = parseFloat(usdCell.previousElementSibling.textContent);
|
||||||
|
const coinSymbol = coinNameToSymbol[coinFullName];
|
||||||
|
if (coinSymbol) {
|
||||||
|
updateValues();
|
||||||
|
} else {
|
||||||
|
console.error(`Coin symbol not found for full name: ${coinFullName}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
usdCell.textContent = "******";
|
||||||
|
const btcValueElement = usdCell.nextElementSibling;
|
||||||
|
if (btcValueElement) {
|
||||||
|
btcValueElement.textContent = "****";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleUsdIcon = (isVisible) => {
|
||||||
|
const usdIcon = document.querySelector("#hide-usd-amount-toggle svg");
|
||||||
|
if (usdIcon) {
|
||||||
|
if (isVisible) {
|
||||||
|
usdIcon.innerHTML = `
|
||||||
|
<path d="M23.444,10.239C21.905,8.062,17.708,3,12,3S2.1,8.062,.555,10.24a3.058,3.058,0,0,0,0,3.52h0C2.1,15.938,6.292,21,12,21s9.905-5.062,11.445-7.24A3.058,3.058,0,0,0,23.444,10.239ZM12,17a5,5,0,1,1,5-5A5,5,0,0,1,12,17Z"></path>
|
||||||
|
`;
|
||||||
|
} else {
|
||||||
|
usdIcon.innerHTML = `
|
||||||
|
<path d="M23.444,10.239a22.936,22.936,0,0,0-2.492-2.948l-4.021,4.021A5.026,5.026,0,0,1,17,12a5,5,0,0,1-5,5,5.026,5.026,0,0,1-.688-.069L8.055,20.188A10.286,10.286,0,0,0,12,21c5.708,0,9.905-5.062,11.445-7.24A3.058,3.058,0,0,0,23.444,10.239Z"></path>
|
||||||
|
<path d="M12,3C6.292,3,2.1,8.062,.555,10.24a3.058,3.058,0,0,0,0,3.52h0a21.272,21.272,0,0,0,4.784,4.9l3.124-3.124a5,5,0,0,1,7.071-7.072L8.464,15.536l10.2-10.2A11.484,11.484,0,0,0,12,3Z"></path>
|
||||||
|
<path data-color="color-2" d="M1,24a1,1,0,0,1-.707-1.707l22-22a1,1,0,0,1,1.414,1.414l-22,22A1,1,0,0,1,1,24Z"></path>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const calculateTotalUsdValue = async () => {
|
||||||
|
const coinNameValues = document.querySelectorAll('.coinname-value');
|
||||||
|
let totalUsdValue = 0;
|
||||||
|
|
||||||
|
for (const coinNameValue of coinNameValues) {
|
||||||
|
const coinFullName = coinNameValue.getAttribute('data-coinname');
|
||||||
|
const cryptoValue = parseFloat(coinNameValue.textContent);
|
||||||
|
const coinSymbol = coinNameToSymbol[coinFullName];
|
||||||
|
|
||||||
|
if (coinSymbol) {
|
||||||
|
try {
|
||||||
|
const { usdValue } = await getUsdValue(cryptoValue, coinSymbol);
|
||||||
|
totalUsdValue += usdValue;
|
||||||
|
|
||||||
|
const usdValueElement = coinNameValue.parentElement.nextElementSibling.querySelector('.usd-value');
|
||||||
|
if (usdValueElement) {
|
||||||
|
usdValueElement.textContent = `$${usdValue.toFixed(2)}`;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error retrieving exchange rate for ${coinSymbol}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.error(`Coin symbol not found for full name: ${coinFullName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalUsdValueElement = document.getElementById('total-usd-value');
|
||||||
|
if (totalUsdValueElement) {
|
||||||
|
totalUsdValueElement.textContent = `$${totalUsdValue.toFixed(2)}`;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const calculateTotalBtcValue = async () => {
|
||||||
|
const usdValueElements = document.getElementsByClassName('usd-value');
|
||||||
|
let totalBtcValue = 0;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const btcToUsdRate = await fetch('https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => data.USD);
|
||||||
|
|
||||||
|
for (const usdValueElement of usdValueElements) {
|
||||||
|
const usdValue = parseFloat(usdValueElement.textContent.replace('$', ''));
|
||||||
|
const btcValue = usdValue / btcToUsdRate;
|
||||||
|
|
||||||
|
if (!isNaN(btcValue)) {
|
||||||
|
totalBtcValue += btcValue;
|
||||||
|
} else {
|
||||||
|
console.error(`Invalid USD value: ${usdValue}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalBtcValueElement = document.getElementById('total-btc-value');
|
||||||
|
if (totalBtcValueElement) {
|
||||||
|
if (localStorage.getItem('usdAmountVisible') === 'false') {
|
||||||
|
totalBtcValueElement.textContent = "****";
|
||||||
|
} else {
|
||||||
|
totalBtcValueElement.textContent = `~ ${totalBtcValue.toFixed(8)} BTC`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error retrieving BTC to USD exchange rate: ${error}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const loadUsdAmountVisibility = async () => {
|
||||||
|
let usdAmountVisible = localStorage.getItem('usdAmountVisible') === 'true';
|
||||||
|
toggleUsdIcon(usdAmountVisible);
|
||||||
|
|
||||||
|
const usdValueElements = document.getElementsByClassName('usd-value');
|
||||||
|
for (const usdValueElement of usdValueElements) {
|
||||||
|
toggleUsdAmount(usdValueElement, usdAmountVisible, !usdAmountVisible);
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalUsdValueElement = document.getElementById('total-usd-value');
|
||||||
|
if (!usdAmountVisible && totalUsdValueElement) {
|
||||||
|
totalUsdValueElement.textContent = "*****";
|
||||||
|
} else if (usdAmountVisible && totalUsdValueElement) {
|
||||||
|
await calculateTotalUsdValue();
|
||||||
|
calculateTotalBtcValue();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = async () => {
|
||||||
|
const hideUsdAmountToggle = document.getElementById('hide-usd-amount-toggle');
|
||||||
|
let usdAmountVisible = localStorage.getItem('usdAmountVisible') === 'true';
|
||||||
|
|
||||||
|
hideUsdAmountToggle.addEventListener('click', async () => {
|
||||||
|
usdAmountVisible = !usdAmountVisible;
|
||||||
|
localStorage.setItem('usdAmountVisible', usdAmountVisible);
|
||||||
|
|
||||||
|
toggleUsdIcon(usdAmountVisible);
|
||||||
|
|
||||||
|
const usdValueElements = document.getElementsByClassName('usd-value');
|
||||||
|
for (const usdValueElement of usdValueElements) {
|
||||||
|
toggleUsdAmount(usdValueElement, usdAmountVisible);
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalUsdValueElement = document.getElementById('total-usd-value');
|
||||||
|
if (!usdAmountVisible && totalUsdValueElement) {
|
||||||
|
totalUsdValueElement.textContent = "*****";
|
||||||
|
} else if (usdAmountVisible && totalUsdValueElement) {
|
||||||
|
await calculateTotalUsdValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalBtcValueElement = document.getElementById('total-btc-value');
|
||||||
|
if (!usdAmountVisible && totalBtcValueElement) {
|
||||||
|
totalBtcValueElement.textContent = "";
|
||||||
|
} else if (usdAmountVisible && totalBtcValueElement) {
|
||||||
|
await calculateTotalBtcValue();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await loadUsdAmountVisibility();
|
||||||
|
};
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
Loading…
Reference in New Issue
Block a user