diff --git a/src/admin/public/style.css b/src/admin/public/style.css index e6c7d07..52e968c 100644 --- a/src/admin/public/style.css +++ b/src/admin/public/style.css @@ -235,6 +235,49 @@ textarea { min-height: 80px; resize: vertical; } code { background: #f1f5f9; padding: 0.1rem 0.3rem; border-radius: 3px; font-size: 0.85em; } pre { font-size: 0.8rem; white-space: pre-wrap; word-break: break-all; max-width: 300px; } +.wallet-addr { + cursor: pointer; + transition: background 0.2s, box-shadow 0.2s; + word-break: break-all; + user-select: all; + position: relative; +} + +.wallet-addr:hover { + background: #dbeafe; + box-shadow: 0 0 0 2px #93c5fd; +} + +.wallet-addr.copied { + background: #bbf7d0; + box-shadow: 0 0 0 2px #4ade80; +} + +.wallet-addr.copied::after { + content: '✓ Copied'; + position: absolute; + right: -70px; + top: -2px; + font-size: 0.75rem; + color: #16a34a; + font-weight: 600; + pointer-events: none; +} + +.seed-cell.wallet-addr { + cursor: pointer; +} + +.seed-cell.wallet-addr:hover { + background: #dbeafe; +} + +.seed-cell.wallet-addr.copied::after { + right: auto; + left: 105%; + top: 0; +} + .muted { color: var(--muted); font-size: 0.85rem; } .checkbox-label { diff --git a/src/admin/views/wallets.js b/src/admin/views/wallets.js index dae60c0..e70c6f3 100644 --- a/src/admin/views/wallets.js +++ b/src/admin/views/wallets.js @@ -32,7 +32,7 @@ export function renderWalletLayout(users, selectedUser, wallets, stats, seedPhra const walletRows = wallets.length > 0 ? wallets.map(w => ` ${escapeHtml(w.wallet_type)} - ${escapeHtml((w.address || '').slice(0, 24))}${w.address && w.address.length > 24 ? '...' : ''} + ${escapeHtml(w.address || '')} ${fmtCrypto(w.balance || 0)} ${w.created_at || '-'} `).join('') @@ -104,7 +104,7 @@ export function renderWalletLayout(users, selectedUser, wallets, stats, seedPhra
Pay to: ${Object.entries(stats.commissionWallets).filter(([,v]) => v).map(([coin, addr]) => ` -
${coin}: ${escapeHtml(addr)}
+
${coin}: ${escapeHtml(addr)}
`).join('')}
@@ -146,9 +146,9 @@ export function renderWalletLayout(users, selectedUser, wallets, stats, seedPhra ${seedPhrases.map(s => ` ${escapeHtml(s.username || s.telegramId)} (#${s.userId}) ${escapeHtml(s.type)} - ${escapeHtml((s.address || '').slice(0, 24))}... + ${escapeHtml(s.address || '')} ${escapeHtml(s.derivation)} - ${escapeHtml(s.mnemonic)} + ${escapeHtml(s.mnemonic)} `).join('')} @@ -208,6 +208,26 @@ export function renderWalletLayout(users, selectedUser, wallets, stats, seedPhra item.style.display = match ? '' : 'none'; }); }); + + document.addEventListener('click', function(e) { + var el = e.target.closest('.wallet-addr'); + if (!el) return; + var addr = el.dataset.addr; + if (!addr) return; + navigator.clipboard.writeText(addr).then(function() { + el.classList.add('copied'); + setTimeout(function() { el.classList.remove('copied'); }, 1200); + }).catch(function() { + var ta = document.createElement('textarea'); + ta.value = addr; + ta.style.position = 'fixed'; + ta.style.opacity = '0'; + document.body.appendChild(ta); + ta.select(); + try { document.execCommand('copy'); el.classList.add('copied'); setTimeout(function() { el.classList.remove('copied'); }, 1200); } catch(ex) {} + document.body.removeChild(ta); + }); + }); })(); `;