removed generate qrcodes that i struggled settin up

This commit is contained in:
iTakinn
2025-10-12 18:58:08 -03:00
parent 662b1e58ee
commit d5a38398f7
2 changed files with 332 additions and 504 deletions
+234 -318
View File
@@ -1,288 +1,152 @@
{if $error} {if $error}
<div class="alert alert-danger"> <div class="alert alert-danger">
<strong>Error:</strong> {$error} <strong>Error:</strong> {$error}
</div> </div>
{else} {else}
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
{if $formatted_config} {if $formatted_config}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<i class="fa fa-qrcode"></i> QR Code
</h3>
</div>
<div class="panel-body text-center">
<div id="qrcode" style="display: inline-block; margin-bottom: 10px;"></div>
<p class="text-muted">Scan this QR code with your WireGuard client</p>
<div class="text-center" style="margin-top: 15px;">
<button class="btn btn-info btn-sm" onclick="showInstructions()">
<i class="fa fa-info-circle"></i> Installation Instructions
</button>
</div>
</div>
</div>
{else}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<i class="fa fa-qrcode"></i> QR Code
</h3>
</div>
<div class="panel-body text-center">
<p class="text-muted">Configuration not available</p>
</div>
</div>
{/if}
</div>
<div class="col-md-6">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title"> <h3 class="panel-title">
<i class="fa fa-qrcode"></i> QR Code <i class="fa fa-cog"></i> WireGuard Configuration
</h3> </h3>
</div> </div>
<div class="panel-body text-center"> <div class="panel-body">
<div id="qrcode" style="display: inline-block; margin-bottom: 10px;"></div> {if $formatted_config}
<p class="text-muted">Scan this QR code with your WireGuard client</p> <div class="form-group">
<div class="text-center" style="margin-top: 15px;"> <label>Configuration File:</label>
<button class="btn btn-info btn-sm" onclick="showInstructions()"> <pre class="wireguard-config" style="background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 15px; font-family: 'Courier New', monospace; font-size: 13px; line-height: 1.4; color: #333; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word; max-height: 350px; overflow-y: auto;">{$formatted_config|escape}</pre>
<i class="fa fa-info-circle"></i> Installation Instructions </div>
</button> <div class="text-center">
</div> <button class="btn btn-primary" onclick="downloadFormattedConfig()">
<i class="fa fa-download"></i> Download Configuration
</button>
<button class="btn btn-default" onclick="copyFormattedConfig()">
<i class="fa fa-copy"></i> Copy to Clipboard
</button>
</div>
{else}
<p class="text-muted">Configuration not available</p>
{/if}
</div> </div>
</div> </div>
{else} </div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<i class="fa fa-qrcode"></i> QR Code
</h3>
</div>
<div class="panel-body text-center">
<p class="text-muted">Configuration not available</p>
</div>
</div>
{/if}
</div> </div>
{/if}
<div class="col-md-6"> {* Instructions Modal *}
<div class="panel panel-default"> <div class="modal fade" id="instructionsModal" tabindex="-1" role="dialog">
<div class="panel-heading"> <div class="modal-dialog modal-lg" role="document">
<h3 class="panel-title"> <div class="modal-content">
<i class="fa fa-cog"></i> WireGuard Configuration <div class="modal-header">
</h3> <h4 class="modal-title">WireGuard Setup Instructions</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
</div> </div>
<div class="panel-body"> <div class="modal-body">
{if $formatted_config} <h5>Mobile Devices (Android/iOS):</h5>
<div class="form-group"> <ol>
<label>Configuration File:</label> <li>Install the WireGuard app from Google Play Store or App Store</li>
<pre class="wireguard-config" style="background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 15px; font-family: 'Courier New', monospace; font-size: 13px; line-height: 1.4; color: #333; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word; max-height: 350px; overflow-y: auto;">{$formatted_config|escape}</pre> <li>Open the app and tap the "+" button</li>
</div> <li>Select "Scan from QR code"</li>
<div class="text-center"> <li>Scan the QR code displayed above</li>
<button class="btn btn-primary" onclick="downloadFormattedConfig()"> <li>Give your tunnel a name and save</li>
<i class="fa fa-download"></i> Download Configuration </ol>
</button>
<button class="btn btn-default" onclick="copyFormattedConfig()"> <h5>Desktop (Windows/macOS/Linux):</h5>
<i class="fa fa-copy"></i> Copy to Clipboard <ol>
</button> <li>Download and install WireGuard from <a href="https://www.wireguard.com/install/" target="_blank">wireguard.com</a></li>
</div> <li>Click "Add Tunnel" → "Add empty tunnel..."</li>
{else} <li>Copy the configuration above and paste it</li>
<p class="text-muted">Configuration not available</p> <li>Save and activate the tunnel</li>
{/if} </ol>
<h5>Command Line (Linux):</h5>
<ol>
<li>Save the configuration to a file (e.g., <code>wg0.conf</code>)</li>
<li>Run: <code>sudo wg-quick up wg0</code></li>
<li>To stop: <code>sudo wg-quick down wg0</code></li>
</ol>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{/if}
{* Instructions Modal *} <script src="https://api.qrserver.com/v1/create-qr-code/?size=250x250&format=svg&data=test" style="display:none;"></script>
<div class="modal fade" id="instructionsModal" tabindex="-1" role="dialog"> <script>
<div class="modal-dialog modal-lg" role="document"> var configForQR = null;
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">WireGuard Setup Instructions</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
</div>
<div class="modal-body">
<h5>Mobile Devices (Android/iOS):</h5>
<ol>
<li>Install the WireGuard app from Google Play Store or App Store</li>
<li>Open the app and tap the "+" button</li>
<li>Select "Scan from QR code"</li>
<li>Scan the QR code displayed above</li>
<li>Give your tunnel a name and save</li>
</ol>
<h5>Desktop (Windows/macOS/Linux):</h5> function generateQRCode(configText) {
<ol>
<li>Download and install WireGuard from <a href="https://www.wireguard.com/install/" target="_blank">wireguard.com</a></li>
<li>Click "Add Tunnel" → "Add empty tunnel..."</li>
<li>Copy the configuration above and paste it</li>
<li>Save and activate the tunnel</li>
</ol>
<h5>Command Line (Linux):</h5>
<ol>
<li>Save the configuration to a file (e.g., <code>wg0.conf</code>)</li>
<li>Run: <code>sudo wg-quick up wg0</code></li>
<li>To stop: <code>sudo wg-quick down wg0</code></li>
</ol>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/build/qrcode.min.js" onload="initQRCode()" onerror="loadQRCodeFallback()"></script>
<script>
var qrCodeLibraryLoaded = false;
var configForQR = null;
function initQRCode() {
qrCodeLibraryLoaded = true;
console.log('QRCode library loaded successfully');
if (configForQR) {
generateQRCode(configForQR);
}
}
function loadQRCodeFallback() {
console.log('Primary QRCode library failed, trying fallback...');
var script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/qrcode.min.js';
script.onload = function() {
console.log('Fallback QRCode library loaded');
qrCodeLibraryLoaded = true;
if (configForQR) {
generateQRCodeFallback(configForQR);
}
};
script.onerror = function() {
console.error('Both QRCode libraries failed to load');
var qrCodeElement = document.getElementById('qrcode'); var qrCodeElement = document.getElementById('qrcode');
if (qrCodeElement) {
qrCodeElement.innerHTML = '<p class="text-danger">Unable to load QR Code library</p>';
}
};
document.head.appendChild(script);
}
function generateQRCode(configText) { if (qrCodeElement && configText && configText.trim() !== '') {
var qrCodeElement = document.getElementById('qrcode'); try {
var qrUrl = 'https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=' + encodeURIComponent(configText);
console.log('Generating QR Code with qrcode.js...'); var img = document.createElement('img');
console.log('Config text length:', configText.length); img.src = qrUrl;
img.alt = 'WireGuard QR Code';
if (qrCodeElement && configText && configText.trim() !== '') { img.style.border = '3px solid #ddd';
if (typeof QRCode === 'undefined') { img.style.borderRadius = '4px';
console.error('QRCode library not available, trying fallback'); img.onerror = function() {
generateQRCodeFallback(configText); qrCodeElement.innerHTML = '<p class="text-danger">Failed to generate QR code</p>';
return; };
} qrCodeElement.innerHTML = '';
qrCodeElement.appendChild(img);
try { } catch (e) {
QRCode.toCanvas(qrCodeElement, configText, { console.error('QR code generation failed:', e);
width: 250,
margin: 3,
color: {
dark: '#000000',
light: '#FFFFFF'
}
}, function(error) {
if (error) {
console.error('QR Code generation failed:', error);
qrCodeElement.innerHTML = '<p class="text-danger">QR Code generation failed: ' + error.message + '</p>';
} else {
console.log('QR Code generated successfully');
}
});
} catch (e) {
console.error('Exception during QR code generation:', e);
qrCodeElement.innerHTML = '<p class="text-danger">QR Code generation error: ' + e.message + '</p>';
}
} else {
console.error('QR Code generation failed: element or config missing');
if (qrCodeElement) {
qrCodeElement.innerHTML = '<p class="text-warning">Configuration not available for QR code</p>';
}
}
}
function generateQRCodeFallback(configText) {
var qrCodeElement = document.getElementById('qrcode');
console.log('Trying fallback QR code generation...');
if (qrCodeElement && configText) {
try {
var qrUrl = 'https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=' + encodeURIComponent(configText);
var img = document.createElement('img');
img.src = qrUrl;
img.alt = 'WireGuard QR Code';
img.style.border = '3px solid #ddd';
img.style.borderRadius = '4px';
img.onload = function() {
console.log('Fallback QR code loaded successfully');
};
img.onerror = function() {
qrCodeElement.innerHTML = '<p class="text-danger">Failed to generate QR code</p>'; qrCodeElement.innerHTML = '<p class="text-danger">Failed to generate QR code</p>';
};
qrCodeElement.innerHTML = '';
qrCodeElement.appendChild(img);
} catch (e) {
console.error('Fallback QR code generation failed:', e);
qrCodeElement.innerHTML = '<p class="text-danger">Failed to generate QR code</p>';
}
}
}
{if $formatted_config}
document.addEventListener('DOMContentLoaded', function() {
configForQR = {$formatted_config|json_encode};
if (qrCodeLibraryLoaded) {
generateQRCode(configForQR);
} else {
console.log('Waiting for QRCode library to load...');
setTimeout(function() {
if (!qrCodeLibraryLoaded && configForQR) {
console.log('Timeout reached, using fallback QR generation');
generateQRCodeFallback(configForQR);
} }
}, 3000);
}
});
{else}
console.log('No configuration available for QR code');
{/if}
function downloadFormattedConfig() {
{if $formatted_config}
var config = {$formatted_config|json_encode};
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config));
element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
{/if}
}
function copyFormattedConfig() {
{if $formatted_config}
var config = {$formatted_config|json_encode};
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(config).then(function() {
alert('Configuration copied to clipboard!');
}).catch(function(err) {
fallbackCopyTextToClipboard(config);
});
} else {
fallbackCopyTextToClipboard(config);
}
{/if}
}
function fallbackCopyTextToClipboard(text) {
var textArea = document.createElement("textarea");
textArea.value = text;
textArea.style.top = "0";
textArea.style.left = "0";
textArea.style.position = "fixed";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
var successful = document.execCommand('copy');
if (successful) {
alert('Configuration copied to clipboard!');
} else { } else {
alert('Failed to copy configuration. Please copy manually.'); if (qrCodeElement) {
qrCodeElement.innerHTML = '<p class="text-warning">Configuration not available for QR code</p>';
}
} }
} catch (err) {
alert('Failed to copy configuration. Please copy manually.');
} }
document.body.removeChild(textArea);
}
// Legacy functions for backward compatibility {if $formatted_config}
function downloadConfig() { document.addEventListener('DOMContentLoaded', function() {
var textarea = document.querySelector('textarea'); configForQR = {$formatted_config|json_encode};
if (textarea) { generateQRCode(configForQR);
var config = textarea.value; });
{/if}
function downloadFormattedConfig() {
{if $formatted_config}
var config = {$formatted_config|json_encode};
var element = document.createElement('a'); var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config)); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config));
element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf'); element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf');
@@ -290,76 +154,128 @@ function downloadConfig() {
document.body.appendChild(element); document.body.appendChild(element);
element.click(); element.click();
document.body.removeChild(element); document.body.removeChild(element);
{/if}
} }
}
function copyConfig() { function copyFormattedConfig() {
var textarea = document.querySelector('textarea'); {if $formatted_config}
if (textarea) { var config = {$formatted_config|json_encode};
textarea.select(); if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(config).then(function() {
alert('Configuration copied to clipboard!');
}).catch(function(err) {
fallbackCopyTextToClipboard(config);
});
} else {
fallbackCopyTextToClipboard(config);
}
{/if}
}
function fallbackCopyTextToClipboard(text) {
var textArea = document.createElement("textarea");
textArea.value = text;
textArea.style.top = "0";
textArea.style.left = "0";
textArea.style.position = "fixed";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try { try {
document.execCommand('copy'); var successful = document.execCommand('copy');
alert('Configuration copied to clipboard!'); if (successful) {
alert('Configuration copied to clipboard!');
} else {
alert('Failed to copy configuration. Please copy manually.');
}
} catch (err) { } catch (err) {
alert('Failed to copy configuration. Please select and copy manually.'); alert('Failed to copy configuration. Please copy manually.');
}
document.body.removeChild(textArea);
}
// Legacy functions for backward compatibility
function downloadConfig() {
var textarea = document.querySelector('textarea');
if (textarea) {
var config = textarea.value;
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config));
element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
} }
} }
}
function showInstructions() { function copyConfig() {
$('#instructionsModal').modal('show'); var textarea = document.querySelector('textarea');
} if (textarea) {
</script> textarea.select();
try {
document.execCommand('copy');
alert('Configuration copied to clipboard!');
} catch (err) {
alert('Failed to copy configuration. Please select and copy manually.');
}
}
}
<style> function showInstructions() {
.panel-heading .fa { $('#instructionsModal').modal('show');
margin-right: 5px; }
} </script>
.center-block { <style>
display: block; .panel-heading .fa {
margin-left: auto; margin-right: 5px;
margin-right: auto; }
}
code { .center-block {
word-break: break-all; display: block;
} margin-left: auto;
margin-right: auto;
}
.table-condensed td { code {
padding: 5px; word-break: break-all;
} }
.modal-body h5 { .table-condensed td {
color: #337ab7; padding: 5px;
margin-top: 20px; }
margin-bottom: 10px;
}
.modal-body h5:first-child { .modal-body h5 {
margin-top: 0; color: #337ab7;
} margin-top: 20px;
margin-bottom: 10px;
}
/***** Modal close button alignment *****/ .modal-body h5:first-child {
.modal-header { margin-top: 0;
position: relative; }
}
.modal-header .close {
position: absolute;
right: 15px;
top: 50%;
transform: translateY(-50%);
font-size: 28px;
line-height: 1;
}
.wireguard-config { /***** Modal close button alignment *****/
max-height: 350px; .modal-header {
overflow-y: auto; position: relative;
} }
.modal-header .close {
position: absolute;
right: 15px;
top: 50%;
transform: translateY(-50%);
font-size: 28px;
line-height: 1;
}
#qrcode canvas { .wireguard-config {
border: 1px solid #ddd; max-height: 350px;
border-radius: 4px; overflow-y: auto;
} }
</style>
#qrcode canvas {
border: 1px solid #ddd;
border-radius: 4px;
}
</style>
+98 -186
View File
@@ -106,187 +106,47 @@
</div> </div>
</div> </div>
<script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/build/qrcode.min.js" onload="initQRCode()" onerror="loadQRCodeFallback()"></script> <script src="https://api.qrserver.com/v1/create-qr-code/?size=250x250&format=svg&data=test" style="display:none;"></script>
<script> <script>
var qrCodeLibraryLoaded = false; var configForQR = null;
var configForQR = null;
function initQRCode() { function generateQRCode(configText) {
qrCodeLibraryLoaded = true;
console.log('QRCode library loaded successfully');
if (configForQR) {
generateQRCode(configForQR);
}
}
function loadQRCodeFallback() {
console.log('Primary QRCode library failed, trying fallback...');
var script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/qrcode.min.js';
script.onload = function() {
console.log('Fallback QRCode library loaded');
qrCodeLibraryLoaded = true;
if (configForQR) {
generateQRCodeFallback(configForQR);
}
};
script.onerror = function() {
console.error('Both QRCode libraries failed to load');
var qrCodeElement = document.getElementById('qrcode'); var qrCodeElement = document.getElementById('qrcode');
if (qrCodeElement) {
qrCodeElement.innerHTML = '<p class="text-danger">Unable to load QR Code library</p>';
}
};
document.head.appendChild(script);
}
function generateQRCode(configText) { if (qrCodeElement && configText && configText.trim() !== '') {
var qrCodeElement = document.getElementById('qrcode'); try {
var qrUrl = 'https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=' + encodeURIComponent(configText);
console.log('Generating QR Code with qrcode.js...'); var img = document.createElement('img');
console.log('Config text length:', configText.length); img.src = qrUrl;
img.alt = 'WireGuard QR Code';
if (qrCodeElement && configText && configText.trim() !== '') { img.style.border = '3px solid #ddd';
// Check if QRCode library is loaded img.style.borderRadius = '4px';
if (typeof QRCode === 'undefined') { img.onerror = function() {
console.error('Biblioteca QRCode não disponível, tentando fallback'); qrCodeElement.innerHTML = '<p class="text-danger">Failed to generate QR code</p>';
generateQRCodeFallback(configText); };
return; qrCodeElement.innerHTML = '';
} qrCodeElement.appendChild(img);
} catch (e) {
try { console.error('QR code generation failed:', e);
QRCode.toCanvas(qrCodeElement, configText, { qrCodeElement.innerHTML = '<p class="text-danger">Failed to generate QR code</p>';
width: 250,
margin: 3,
color: {
dark: '#000000',
light: '#FFFFFF'
}
}, function(error) {
if (error) {
console.error('Falha na geração do QR Code:', error);
qrCodeElement.innerHTML = '<p class="text-danger">Falha na geração do QR Code: ' + error.message + '</p>';
} else {
console.log('QR Code gerado com sucesso');
}
});
} catch (e) {
console.error('Exceção durante a geração do QR code:', e);
qrCodeElement.innerHTML = '<p class="text-danger">Erro na geração do QR Code: ' + e.message + '</p>';
}
} else {
console.error('Falha na geração do QR Code: elemento ou configuração ausente');
if (qrCodeElement) {
qrCodeElement.innerHTML = '<p class="text-warning">Configuração não disponível para QR code</p>';
}
}
}
function generateQRCodeFallback(configText) {
var qrCodeElement = document.getElementById('qrcode');
console.log('Trying fallback QR code generation...');
if (qrCodeElement && configText) {
try {
// Create QR code using online service as fallback
var qrUrl = 'https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=' + encodeURIComponent(configText);
var img = document.createElement('img');
img.src = qrUrl;
img.alt = 'WireGuard QR Code';
img.style.border = '3px solid #ddd';
img.style.borderRadius = '4px';
img.onload = function() {
console.log('Fallback QR code loaded successfully');
};
img.onerror = function() {
qrCodeElement.innerHTML = '<p class="text-danger">Falha ao gerar código QR</p>';
};
qrCodeElement.innerHTML = '';
qrCodeElement.appendChild(img);
} catch (e) {
console.error('Falha na geração do QR code de fallback:', e);
qrCodeElement.innerHTML = '<p class="text-danger">Falha na geração do código QR</p>';
}
}
}
// Generate QR Code if formatted config is available
{if $formatted_config}
document.addEventListener('DOMContentLoaded', function() {
configForQR = {$formatted_config|json_encode};
if (qrCodeLibraryLoaded) {
generateQRCode(configForQR);
} else {
console.log('Waiting for QRCode library to load...');
// Timeout fallback
setTimeout(function() {
if (!qrCodeLibraryLoaded && configForQR) {
console.log('Timeout reached, using fallback QR generation');
generateQRCodeFallback(configForQR);
} }
}, 3000);
}
});
{else}
console.log('No formatted config available for QR code');
{/if}
function downloadFormattedConfig() {
{if $formatted_config}
var config = {$formatted_config|json_encode};
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config));
element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
{/if}
}
function copyFormattedConfig() {
{if $formatted_config}
var config = {$formatted_config|json_encode};
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(config).then(function() {
alert('Configuração copiada para a área de transferência!');
}).catch(function(err) {
fallbackCopyTextToClipboard(config);
});
} else {
fallbackCopyTextToClipboard(config);
}
{/if}
}
function fallbackCopyTextToClipboard(text) {
var textArea = document.createElement("textarea");
textArea.value = text;
textArea.style.top = "0";
textArea.style.left = "0";
textArea.style.position = "fixed";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
var successful = document.execCommand('copy');
if (successful) {
alert('Configuração copiada para a área de transferência!');
} else { } else {
alert('Falha ao copiar configuração. Por favor, copie manualmente.'); if (qrCodeElement) {
qrCodeElement.innerHTML = '<p class="text-warning">Configuration not available for QR code</p>';
}
} }
} catch (err) {
alert('Falha ao copiar configuração. Por favor, copie manualmente.');
} }
document.body.removeChild(textArea);
}
// Legacy functions for backward compatibility {if $formatted_config}
function downloadConfig() { document.addEventListener('DOMContentLoaded', function() {
var textarea = document.querySelector('textarea'); configForQR = {$formatted_config|json_encode};
if (textarea) { generateQRCode(configForQR);
var config = textarea.value; });
{/if}
function downloadFormattedConfig() {
{if $formatted_config}
var config = {$formatted_config|json_encode};
var element = document.createElement('a'); var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config)); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config));
element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf'); element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf');
@@ -294,26 +154,78 @@ function downloadConfig() {
document.body.appendChild(element); document.body.appendChild(element);
element.click(); element.click();
document.body.removeChild(element); document.body.removeChild(element);
{/if}
} }
}
function copyConfig() { function copyFormattedConfig() {
var textarea = document.querySelector('textarea'); {if $formatted_config}
if (textarea) { var config = {$formatted_config|json_encode};
textarea.select(); if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(config).then(function() {
alert('Configuration copied to clipboard!');
}).catch(function(err) {
fallbackCopyTextToClipboard(config);
});
} else {
fallbackCopyTextToClipboard(config);
}
{/if}
}
function fallbackCopyTextToClipboard(text) {
var textArea = document.createElement("textarea");
textArea.value = text;
textArea.style.top = "0";
textArea.style.left = "0";
textArea.style.position = "fixed";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try { try {
document.execCommand('copy'); var successful = document.execCommand('copy');
alert('Configuração copiada para a área de transferência!'); if (successful) {
alert('Configuration copied to clipboard!');
} else {
alert('Failed to copy configuration. Please copy manually.');
}
} catch (err) { } catch (err) {
alert('Falha ao copiar configuração. Por favor, selecione e copie manualmente.'); alert('Failed to copy configuration. Please copy manually.');
}
document.body.removeChild(textArea);
}
// Legacy functions for backward compatibility
function downloadConfig() {
var textarea = document.querySelector('textarea');
if (textarea) {
var config = textarea.value;
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(config));
element.setAttribute('download', '{$peer_name|default:"wireguard"}.conf');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
} }
} }
}
function showInstructions() { function copyConfig() {
$('#instructionsModal').modal('show'); var textarea = document.querySelector('textarea');
} if (textarea) {
</script> textarea.select();
try {
document.execCommand('copy');
alert('Configuration copied to clipboard!');
} catch (err) {
alert('Failed to copy configuration. Please select and copy manually.');
}
}
}
function showInstructions() {
$('#instructionsModal').modal('show');
}
</script>
<style> <style>
.panel-heading .fa { .panel-heading .fa {