Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,649 changes: 923 additions & 726 deletions static/admin/css/style.css

Large diffs are not rendered by default.

9 changes: 5 additions & 4 deletions static/admin/dmt/api-keys/api-keys.js
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ const screenApiKeysScript = {
trHead.appendChild(document.createElement('th')).textContent = 'Label'
trHead.appendChild(document.createElement('th')).textContent = 'Created'
trHead.appendChild(document.createElement('th')).textContent = 'Expires'
trHead.appendChild(document.createElement('th')).textContent = 'Active'
trHead.appendChild(document.createElement('th')).textContent = 'State'
trHead.appendChild(document.createElement('th'))

for (const apiKey of result) {
Expand All @@ -211,9 +211,10 @@ const screenApiKeysScript = {
expiresCell.classList.add('text-danger')
}

const activeCell = tr.appendChild(document.createElement('td')).appendChild(document.createElement('strong'))
activeCell.textContent = apiKey.active ? 'Yes' : 'No'
activeCell.classList.add(apiKey.active ? 'text-success' : 'text-danger')
const isActive = apiKey.active && expiresAt.getTime() >= Date.now()
const stateCell = tr.appendChild(document.createElement('td')).appendChild(document.createElement('span'))
stateCell.textContent = isActive ? 'ACTIVE' : 'EXPIRED'
stateCell.classList.add('chip', isActive ? 'chip-ok' : 'chip-ko')

const btnGroup = tr.appendChild(document.createElement('td')).appendChild(document.createElement('div'))
btnGroup.classList.add('btn-group')
Expand Down
65 changes: 39 additions & 26 deletions static/admin/dmt/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,35 +20,24 @@
</head>

<body class="dmt">
<div id="top-container" class="container" hidden>
<!-- HEADER -->
<div id="header" class="row">
<div class="col-xs-2">
<button id="mobile-menu-toggle" class="mobile-menu-btn" aria-label="Toggle menu">
<span></span>
<span></span>
<span></span>
</button>
</div>
<div class="col-xs-7">
<h1 class="title"><span>DOJO // MAINTENANCE TOOL</span> <span id="dojo-version" class="beta"></span></h1>
</div>
<div class="col-xs-3 login-box">
<a id="btn-logout" style="display: inline;" href="#" title="DISCONNECT">
<img src="../icons/ic_power_settings_new_white_24dp_1x.png" class="mini-icon"/>
</a>
</div>
</div>

<div class="spacer30"></div>

<div id="top-container" class="container-fluid" hidden>
<!-- BODY -->
<div id="body" class="row">
<!-- MOBILE MENU OVERLAY -->
<div id="mobile-menu-overlay" class="mobile-menu-overlay"></div>
<!-- MENU -->

<!-- MENU (full height, logo lives at its top) -->
<div id="menu" class="col-xs-2">
<div id="brand" class="brand">
<div class="brand-tile">
<img src="../icons/dojo.svg" class="brand-tile-icon" alt=""/>
</div>
<div class="brand-wordmark">
<div class="brand-name">DOJO</div>
<div class="brand-subtitle">MAINTENANCE TOOL</div>
<div id="dojo-version" class="beta"></div>
</div>
</div>
<div class="title">
<h1>MONITORING</h1>
</div>
Expand Down Expand Up @@ -103,9 +92,32 @@ <h1>HELP</h1>
</li>
</ul>
</div>
<div class="col-xs-1"></div>
<div id="menu-spacer" class="col-xs-1"></div>
<!-- CONTENT COLUMN: header sits only above this column, not the sidebar -->
<div id="content-col" class="col-xs-9">
<!-- HEADER -->
<div id="header" class="row">
<div class="col-xs-2">
<button id="mobile-menu-toggle" class="mobile-menu-btn" aria-label="Toggle menu">
<span></span>
<span></span>
<span></span>
</button>
</div>
<div class="col-xs-10 header-right">
<span id="sync-indicator" class="sync-indicator" data-state="idle">
<span class="sync-dot"></span>
<span>SYNCED &middot; <span id="sync-block-height">&mdash;</span></span>
</span>
<span id="sync-network" class="sync-network">MAINNET</span>
<a id="btn-logout" href="#" title="DISCONNECT">
<img src="../icons/ic_power_settings_new_white_24dp_1x.png" class="mini-icon"/>
</a>
</div>
</div>

<!-- MAIN AREA -->
<div id="main" class="col-xs-9">
<div id="main">
<!-- WELCOME -->
<div id="screen-welcome"
data-include-html="welcome/welcome.html"
Expand Down Expand Up @@ -157,6 +169,7 @@ <h1>HELP</h1>
hidden>
</div>
</div>
</div>
</div>
</div>
<!-- MSG BOX -->
Expand Down
21 changes: 21 additions & 0 deletions static/admin/dmt/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,21 @@ function initPages() {
}
}

function refreshSyncIndicator() {
lib_api.getPushtxStatus().then(pushTxStatus => {
const data = pushTxStatus && pushTxStatus.data
if (!data || !data.bitcoind)
throw new Error('no bitcoind status')

document.querySelector('#sync-indicator').dataset.state = 'ok'
document.querySelector('#sync-block-height').textContent = data.bitcoind.blocks
document.querySelector('#sync-network').textContent = data.bitcoind.testnet === true ? 'TESTNET' : 'MAINNET'
}).catch(() => {
document.querySelector('#sync-indicator').dataset.state = 'ko'
document.querySelector('#sync-block-height').textContent = '—'
})
}

function _initPages() {
for (let screen of screens) {
const screenScript = screenScripts.get(screen)
Expand Down Expand Up @@ -112,6 +127,12 @@ function preparePage() {
initTabs()
initPages()

// Refresh the header sync indicator
refreshSyncIndicator()
setInterval(() => {
refreshSyncIndicator()
}, 60000)

// Set event handlers
document.querySelector('#btn-logout').addEventListener('click', () => {
lib_auth.logout()
Expand Down
18 changes: 12 additions & 6 deletions static/admin/dmt/pairing/pairing.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,22 @@ <h1>PAIRING</h1>
<div class="box-context">Pair your wallet to your Dojo and to your Block Explorer with a simple QRCode.</div>

<div class="row box-main">
<div id="dojo-pairing" class="fullwidth box">
<div class="box-header">DOJO</div>
<div class="spacer10"></div>
<div class="box-body fullwidth" id="qr-container">
<div id="dojo-pairing" class="fullwidth box pairing-box">
<div class="pairing-qr-col">
<div class="center">Scan this QRCode with your wallet</div>
<div class="spacer10"></div>
<div id="qr-pairing"></div>
<div class="spacer10"></div>
<div id="qr-container">
<div id="qr-pairing"></div>
</div>
</div>
<div class="pairing-payload-col">
<div class="pairing-payload-label">PAIRING PAYLOAD</div>
<textarea id="dojo-pairing-payload" class="payload-textarea" rows="10" readonly></textarea>
<div class="spacer10"></div>
<div class="pairing-actions">
<button type="button" id="btn-copy-payload" class="btn btn-primary">Copy Payload</button>
<button type="button" id="btn-regenerate-payload" class="btn">Regenerate</button>
</div>
</div>
</div>
</div>
Expand Down
18 changes: 17 additions & 1 deletion static/admin/dmt/pairing/pairing.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
const screenPairingScript = {

initPage: () => {},
initPage: () => {
document.querySelector('#btn-copy-payload').addEventListener('click', () => {
screenPairingScript.copyPayload()
})
document.querySelector('#btn-regenerate-payload').addEventListener('click', () => {
screenPairingScript.displayQRPairing()
})
},

copyPayload: () => {
const payload = document.querySelector('#dojo-pairing-payload')
navigator.clipboard.writeText(payload.value).then(() => {
lib_msg.displayInfo('Pairing payload copied to clipboard')
}).catch((error) => {
lib_errors.processError(error)
})
},

preparePage: () => {
screenPairingScript.displayQRPairing()
Expand Down
36 changes: 16 additions & 20 deletions static/admin/dmt/pushtx/pushtx.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,27 @@ <h1>PUSHTX STATUS</h1>

<div class="box-context">Monitor the transactions pushed through your Dojo.</div>

<div class="row box-main">
<div id="txs-pushed" class="box fullwidth">
<div class="box-header">TRANSACTIONS PUSHED</div>
<div class="box-body">
<table>
<tr>
<td class="table-label">Uptime</td>
<td class="table-value" id="pushed-uptime"></td>
</tr>
<tr>
<td class="table-label">Number of Transactions</td>
<td class="table-value" id="pushed-count"></td>
</tr>
<tr>
<td class="table-label">Total Amount</td>
<td class="table-value" id="pushed-amount"></td>
</tr>
</table>
</div>
<div class="headline-strip">
<div class="headline-cell">
<div class="headline-label">Uptime</div>
<div class="headline-value" id="pushed-uptime">&mdash;</div>
</div>
<div class="headline-cell">
<div class="headline-label">Transactions Pushed</div>
<div class="headline-value" id="pushed-count">&mdash;</div>
</div>
<div class="headline-cell">
<div class="headline-label">Total Amount</div>
<div class="headline-value" id="pushed-amount">&mdash;</div>
</div>
</div>

<div class="row box-main">
<div id="txs-scheduled" class="box fullwidth">
<div class="box-header">TRANSACTIONS SCHEDULED</div>
<div class="box-header">
<span>SCHEDULED TRANSACTIONS</span>
<span id="scheduled-count" class="box-header-count">0</span>
</div>
<div class="box-body">
<table id="table-scheduled-txs">
<thead>
Expand Down
1 change: 1 addition & 0 deletions static/admin/dmt/pushtx/pushtx.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ const pushtxScript = {
pushtxScript.processedSchedTxs.add(tx.schTxid)
}
}
document.querySelector('#scheduled-count').textContent = data.txs.length
//lib_msg.cleanMessagesUi()
}
}).catch(error => {
Expand Down
27 changes: 23 additions & 4 deletions static/admin/dmt/status/status.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,25 @@ <h1>DOJO STATUS</h1>

<div class="box-context">Monitor the health of some core components of your Dojo.</div>

<div class="headline-strip">
<div class="headline-cell">
<div class="headline-label">Block Height</div>
<div class="headline-value" id="headline-block-height">&mdash;</div>
</div>
<div class="headline-cell">
<div class="headline-label">Uptime</div>
<div class="headline-value" id="headline-uptime">&mdash;</div>
</div>
<div class="headline-cell">
<div class="headline-label">Peers</div>
<div class="headline-value" id="headline-peers">&mdash;</div>
</div>
<div class="headline-cell">
<div class="headline-label">Relay Fee</div>
<div class="headline-value" id="headline-relay-fee">&mdash;</div>
</div>
</div>

<div class="row box-main">
<div id="left-column" class="two-columns-left">

Expand Down Expand Up @@ -111,21 +130,21 @@ <h1>DOJO STATUS</h1>
</div>

<div id="web-status" class="fullwidth box">
<div class="box-header">WEB</div>
<div class="box-header">WEB SERVICES</div>
<div class="spacer10"></div>
<div class="box-body">
<table>
<tr>
<td class="table-label">Tor status</td>
<td class="table-value" id="tor-status-ind">&#10003;</td>
<td class="table-value"><span class="web-service-status" id="tor-status-ind">CONNECTED<span class="status-dot"></span></span></td>
</tr>
<tr>
<td class="table-label">Nginx status</td>
<td class="table-value" id="nginx-status-ind">&#10003;</td>
<td class="table-value"><span class="web-service-status" id="nginx-status-ind">CONNECTED<span class="status-dot"></span></span></td>
</tr>
<tr>
<td class="table-label">Node.js status</td>
<td class="table-value" id="nodejs-status-ind">&#10003;</td>
<td class="table-value"><span class="web-service-status" id="nodejs-status-ind">CONNECTED<span class="status-dot"></span></span></td>
</tr>
</table>
</div>
Expand Down
22 changes: 16 additions & 6 deletions static/admin/dmt/status/status.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ const statusScript = {
document.querySelector('#node-network').textContent = '-'
document.querySelector('#node-conn').textContent = '-'
document.querySelector('#node-relay-fee').textContent = '-'
document.querySelector('#headline-block-height').textContent = '-'
document.querySelector('#headline-uptime').textContent = '-'
document.querySelector('#headline-peers').textContent = '-'
document.querySelector('#headline-relay-fee').textContent = '-'

//lib_msg.displayMessage('Loading Tracker status info...');
lib_api.getPushtxStatus().then(pushTxStatus => {
Expand All @@ -96,13 +100,19 @@ const statusScript = {
statusScript.setStatusIndicator('#node-status-ind', 'ok')
const uptime = lib_cmn.timePeriod(data.uptime)
document.querySelector('#node-uptime').textContent = uptime
document.querySelector('#headline-uptime').textContent = uptime
statusScript.chaintipBitcoind = data.bitcoind.blocks
document.querySelector('#node-chaintip').textContent = data.bitcoind.blocks
document.querySelector('#headline-block-height').textContent = data.bitcoind.blocks
document.querySelector('#node-version').textContent = data.bitcoind.version
const network = data.bitcoind.testnet === true ? 'testnet' : 'mainnet'
document.querySelector('#node-network').textContent = network
document.querySelector('#node-conn').textContent = data.bitcoind.conn
document.querySelector('#node-relay-fee').textContent = data.bitcoind.relayfee
document.querySelector('#headline-peers').textContent = data.bitcoind.conn
// relayfee is reported by bitcoind in BTC/kB; convert to sats/vB
const relayFeeSatsPerVb = `${(Number.parseFloat(data.bitcoind.relayfee) * 100000).toFixed(2)} sats/vB`
document.querySelector('#node-relay-fee').textContent = relayFeeSatsPerVb
document.querySelector('#headline-relay-fee').textContent = relayFeeSatsPerVb
statusScript.checkChaintips()
//lib_msg.cleanMessagesUi()
}
Expand All @@ -129,14 +139,14 @@ const statusScript = {
setStatusIndicator: (id, status) => {
switch (status) {
case 'ok': {
document.querySelector(id).innerHTML = '&#10003;'
document.querySelector(id).style.color = '#76d776'
document.querySelector(id).innerHTML = 'CONNECTED<span class="status-dot"></span>'
document.querySelector(id).style.color = '#4ec98a'

break
}
case 'ko': {
document.querySelector(id).innerHTML = 'X'
document.querySelector(id).style.color = '#f77c7c'
document.querySelector(id).innerHTML = 'DISCONNECTED<span class="status-dot"></span>'
document.querySelector(id).style.color = '#ff563c'

break
}
Expand All @@ -148,7 +158,7 @@ const statusScript = {
}
default: {
document.querySelector(id).innerHTML = '-'
document.querySelector(id).style.color = '#efefef'
document.querySelector(id).style.color = '#f3f2f2'
}
}
},
Expand Down
14 changes: 10 additions & 4 deletions static/admin/dmt/txs-tools/txs-tools.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,16 @@ const screenTxsToolsScript = {
const firstseen = txInfo.created ? lib_fmt.unixTsToLocaleString(txInfo.created) : '--'
document.querySelector('#tx-firstseen').textContent = firstseen

if ('block' in txInfo)
document.querySelector('#tx-location').textContent = ` Block ${txInfo.block.height}`
else
document.querySelector('#tx-location').textContent = ' Mempool'
const txLocation = document.querySelector('#tx-location')
txLocation.innerHTML = ''
const txLocationChip = txLocation.appendChild(document.createElement('span'))
if ('block' in txInfo) {
txLocationChip.textContent = `BLOCK ${txInfo.block.height}`
txLocationChip.classList.add('chip', 'chip-ok')
} else {
txLocationChip.textContent = 'MEMPOOL'
txLocationChip.classList.add('chip', 'chip-ko')
}


const nbInputs = txInfo.inputs.length
Expand Down
Loading