This commit is contained in:
Faheed 2025-11-24 12:25:28 +03:00
parent 19c3f87c06
commit 7366d07e49

View File

@ -502,7 +502,7 @@
<div class="info-label">{% trans "Generated Password" %}</div> <div class="info-label">{% trans "Generated Password" %}</div>
<div class="password-container"> <div class="password-container">
<div class="password-value" id="password-value">{{ generated_password }}</div> <div class="password-value" id="password-value">{{ generated_password }}</div>
<button type="button" class="btn btn-sm btn-outline-secondary ms-2" onclick="copyPassword()"> <button type="button" class="btn btn-sm btn-outline-secondary ms-2" onclick="copyPassword(this)">
<i class="fas fa-copy me-1"></i> <i class="fas fa-copy me-1"></i>
{% trans "Copy" %} {% trans "Copy" %}
</button> </button>
@ -711,25 +711,46 @@
</div> </div>
<script> <script>
function copyPassword() { function copyPassword(button) {
const passwordText = document.getElementById('password-value').textContent; const passwordTextEl = document.getElementById('password-value');
navigator.clipboard.writeText(passwordText).then(function() { if (!passwordTextEl) return;
// Show success feedback const passwordText = passwordTextEl.textContent;
const button = event.target;
const originalText = button.innerHTML; // Try Clipboard API first
button.innerHTML = '<i class="fas fa-check me-1"></i> {% trans "Copied!" %}'; const doFeedback = (btn) => {
button.classList.remove('btn-outline-secondary'); const originalHTML = btn.innerHTML;
button.classList.add('btn-success'); btn.innerHTML = '<i class="fas fa-check me-1"></i> {% trans "Copied!" %}';
btn.classList.remove('btn-outline-secondary');
// Reset after 2 seconds btn.classList.add('btn-success');
setTimeout(function() { setTimeout(function() {
button.innerHTML = originalText; btn.innerHTML = originalHTML;
button.classList.remove('btn-success'); btn.classList.remove('btn-success');
button.classList.add('btn-outline-secondary'); btn.classList.add('btn-outline-secondary');
}, 2000); }, 2000);
}).catch(function(err) { };
console.error('Failed to copy password: ', err);
}); if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(passwordText).then(function() {
doFeedback(button);
}).catch(function(err) {
console.error('Failed to copy password via Clipboard API: ', err);
// fallback
const ta = document.createElement('textarea');
ta.value = passwordText;
document.body.appendChild(ta);
ta.select();
try { document.execCommand('copy'); doFeedback(button); } catch (e) { console.error('execCommand fallback failed', e); }
document.body.removeChild(ta);
});
} else {
// fallback for older browsers
const ta = document.createElement('textarea');
ta.value = passwordText;
document.body.appendChild(ta);
ta.select();
try { document.execCommand('copy'); doFeedback(button); } catch (e) { console.error('execCommand fallback failed', e); }
document.body.removeChild(ta);
}
} }
</script> </script>