diff --git a/web/admin/admin.php b/web/admin/admin.php index c0082df..ee50f23 100644 --- a/web/admin/admin.php +++ b/web/admin/admin.php @@ -202,7 +202,9 @@ if ($authenticated && isset($_GET['host'])) { >
- +
+ +
diff --git a/web/admin/scripts.js b/web/admin/scripts.js index b29e9f4..99594c4 100644 --- a/web/admin/scripts.js +++ b/web/admin/scripts.js @@ -2,16 +2,53 @@ document.addEventListener('click', function(e) { if (e.target && e.target.classList.contains('copy-btn')) { const text = e.target.getAttribute('data-clipboard'); - navigator.clipboard.writeText(text).then(function() { - const originalText = e.target.innerText; - e.target.innerText = "copied!"; - setTimeout(() => { - e.target.innerText = originalText; - }, 1000); - }); + + // Check for clipboard API support + if (navigator.clipboard) { + navigator.clipboard.writeText(text) + .then(function() { + const originalText = e.target.innerText; + e.target.innerText = "copied!"; + setTimeout(() => { + e.target.innerText = originalText; + }, 1000); + }) + .catch(function(err) { + console.error('Failed to copy: ', err); + // Fallback method + fallbackCopyTextToClipboard(text, e.target); + }); + } else { + // Fallback for browsers without clipboard API + fallbackCopyTextToClipboard(text, e.target); + } } }); +// Fallback copy method for older browsers +function fallbackCopyTextToClipboard(text, button) { + const textArea = document.createElement("textarea"); + textArea.value = text; + textArea.style.position = "fixed"; // Avoid scrolling to bottom + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + const successful = document.execCommand('copy'); + if (successful) { + const originalText = button.innerText; + button.innerText = "copied!"; + setTimeout(() => { + button.innerText = originalText; + }, 1000); + } + } catch (err) { + console.error('Fallback: Unable to copy', err); + } + + document.body.removeChild(textArea); +} // Search functionality function setupSearch(inputId, itemsSelector) { const searchInput = document.getElementById(inputId); diff --git a/web/admin/styles.css b/web/admin/styles.css index 741d372..fb48447 100644 --- a/web/admin/styles.css +++ b/web/admin/styles.css @@ -179,47 +179,46 @@ button:hover, .action-btn:hover { color: var(--secondary); } -.secrets { - padding: 10px; -} - +/* Fix for secrets layout */ .secret { - margin-bottom: 10px; - border: 1px solid var(--border); - background: rgba(255, 255, 0, 0.05); -} - -.secret-title { - border-bottom: 1px dashed var(--border); - padding: 5px 8px; - font-size: 0.9em; - color: var(--text-dim); + margin-bottom: 15px; } .command { + display: flex; + align-items: flex-start; + background-color: #111; padding: 8px; - position: relative; + border-radius: 3px; + overflow: hidden; +} + +.secret-content { + flex: 1; + word-break: break-all; + white-space: pre-wrap; + overflow-wrap: break-word; + font-family: monospace; + max-width: calc(100% - 70px); overflow-x: auto; - white-space: pre; - font-family: 'Courier New', monospace; } .copy-btn { - position: absolute; - right: 5px; - top: 5px; - background: transparent; - color: var(--secondary); - border: 1px solid var(--border); - padding: 2px 5px; + flex: 0 0 60px; + margin-left: 10px; + align-self: flex-start; + background: #333; + color: #0f0; + border: 1px solid #444; + padding: 4px 8px; + border-radius: 3px; cursor: pointer; - font-size: 12px; - width: auto; + font-family: monospace; + text-transform: lowercase; } .copy-btn:hover { - background: var(--hover); - color: var(--text); + background: #444; } .alert {