Files
BetterDesk/web-nodejs/views/keys.ejs
T
UNITRONIX 32e29723e4 Add Node.js web console and update to v2.2.0
Introduce a new Node.js-based web console (Express + EJS + better-sqlite3) under web-nodejs/ and add installer support to choose between Node.js and the legacy Flask console. Update interactive ALL-IN-ONE installers (betterdesk.sh, betterdesk.ps1) with flags/options for --nodejs/--flask, automatic Node.js installation, migration logic, enhanced service handling and diagnostics. Bump VERSION to 2.2.0 and update README and project docs (.github/copilot-instructions.md) to reflect the new console, usage examples, and Docker/docs changes. Many new web-nodejs files and supporting middleware/services/routes/views/static assets were added to support the new console.
2026-02-17 10:59:46 +01:00

98 lines
4.4 KiB
HTML

<%- include('layouts/main', {
title: _('nav.keys'),
pageStyles: ['pages'],
pageScripts: ['keys'],
currentPage: 'keys',
breadcrumb: [{ label: _('nav.keys') }],
body: `
<div class="page-header">
<h1 class="page-title">${_('keys.title')}</h1>
<p class="page-subtitle">${_('keys.subtitle')}</p>
</div>
<div class="keys-grid">
<!-- Public Key Card -->
<div class="key-card">
<div class="key-card-header">
<span class="material-icons">vpn_key</span>
<span class="key-card-title">${_('keys.public_key')}</span>
</div>
<div class="key-card-body">
<div class="public-key-display">
<code class="public-key-text" id="public-key-text">
<span class="skeleton skeleton-text" style="width: 100%;"></span>
</code>
<button class="public-key-copy" id="copy-key-btn" title="${_('actions.copy')}">
<span class="material-icons">content_copy</span>
</button>
</div>
<div class="key-actions">
<button class="btn btn-secondary" id="download-key-btn">
<span class="material-icons">download</span>
${_('keys.download')}
</button>
<button class="btn btn-secondary" id="show-qr-btn">
<span class="material-icons">qr_code</span>
${_('keys.show_qr')}
</button>
</div>
</div>
</div>
<!-- QR Code Card -->
<div class="key-card">
<div class="key-card-header">
<span class="material-icons">qr_code_2</span>
<span class="key-card-title">${_('keys.qr_code')}</span>
</div>
<div class="key-card-body">
<div class="qr-code-container">
<div class="qr-code-wrapper" id="qr-wrapper">
<div class="skeleton" style="width: 200px; height: 200px;"></div>
</div>
<p class="qr-code-hint">${_('keys.qr_hint')}</p>
</div>
</div>
</div>
<!-- Server Info Card -->
<div class="key-card">
<div class="key-card-header">
<span class="material-icons">dns</span>
<span class="key-card-title">${_('keys.server_info')}</span>
</div>
<div class="key-card-body">
<div class="server-info-grid">
<div class="server-info-item">
<span class="server-info-label">
<span class="material-icons">router</span>
${_('server.id_server')}
</span>
<span class="server-info-value" id="server-ip">
<span class="skeleton skeleton-text"></span>
</span>
</div>
<div class="server-info-item">
<span class="server-info-label">
<span class="material-icons">swap_horiz</span>
${_('server.relay_server')}
</span>
<span class="server-info-value" id="relay-ip">
<span class="skeleton skeleton-text"></span>
</span>
</div>
<div class="server-info-item">
<span class="server-info-label">
<span class="material-icons">key</span>
${_('server.api_key')}
</span>
<span class="server-info-value api-key-masked" id="api-key">••••••••</span>
</div>
</div>
</div>
</div>
</div>
`
}) %>