Compare commits
12 Commits
1.1.3
...
a1aa1c0d14
Author | SHA1 | Date | |
---|---|---|---|
a1aa1c0d14 | |||
ff97952f67 | |||
f0ce402830 | |||
80147b69eb | |||
11d8475c8a | |||
8f684513fd | |||
2ff3c846e9 | |||
fca5a173dc | |||
5d79ecf1b7 | |||
e876bf08da | |||
b19872fa5b | |||
6566a32f6a |
29
common.js
@@ -10,6 +10,7 @@ function check_deployments() {
|
|||||||
apps.length = 0; // reset
|
apps.length = 0; // reset
|
||||||
apps.push(...JSON.parse(data)); // push each element
|
apps.push(...JSON.parse(data)); // push each element
|
||||||
console.log(apps);
|
console.log(apps);
|
||||||
|
document.getElementById('installAppsBtn').click();
|
||||||
|
|
||||||
// manage
|
// manage
|
||||||
html_data = '';
|
html_data = '';
|
||||||
@@ -19,6 +20,7 @@ function check_deployments() {
|
|||||||
service_name = data[k].name;
|
service_name = data[k].name;
|
||||||
orig_service_name = data[k].orig_name;
|
orig_service_name = data[k].orig_name;
|
||||||
version = data[k].version;
|
version = data[k].version;
|
||||||
|
subtitle = data[k].subtitle;
|
||||||
installed = data[k].installed;
|
installed = data[k].installed;
|
||||||
if (installed=='true') {
|
if (installed=='true') {
|
||||||
html_data += '<div><a href="#" onclick="reinstall(\''+service_name+'\',\''+service_name+'\')">'+orig_service_name+'</a> - '+version+' - INSTALLED</div>';
|
html_data += '<div><a href="#" onclick="reinstall(\''+service_name+'\',\''+service_name+'\')">'+orig_service_name+'</a> - '+version+' - INSTALLED</div>';
|
||||||
@@ -29,7 +31,6 @@ function check_deployments() {
|
|||||||
html_data += '<div id="'+service_name+'" class="deployment"></div>';
|
html_data += '<div id="'+service_name+'" class="deployment"></div>';
|
||||||
}
|
}
|
||||||
jQuery("#deployments").html(html_data);
|
jQuery("#deployments").html(html_data);
|
||||||
document.getElementById('installAppsBtn').click();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -89,7 +90,7 @@ function get_repositories() {
|
|||||||
console.log('repositories: '+data);
|
console.log('repositories: '+data);
|
||||||
if (data=="OK") {
|
if (data=="OK") {
|
||||||
setTimeout(check_repositories, 500);
|
setTimeout(check_repositories, 500);
|
||||||
get_deployments();
|
//get_deployments();
|
||||||
}
|
}
|
||||||
else alert(data);
|
else alert(data);
|
||||||
});
|
});
|
||||||
@@ -109,7 +110,15 @@ function check_vpn() {
|
|||||||
var url = 'scan.php?op=check_vpn';
|
var url = 'scan.php?op=check_vpn';
|
||||||
jQuery.get(url, function(data) {
|
jQuery.get(url, function(data) {
|
||||||
console.log('check_vpn: '+data);
|
console.log('check_vpn: '+data);
|
||||||
if (data=="2") {
|
if (data=="1") { // save_vpn has finished
|
||||||
|
const vpn_div = document.getElementById("vpn");
|
||||||
|
console.log(vpn_div);
|
||||||
|
if (vpn_div) {
|
||||||
|
vpn_div.innerHTML = 'VPN start process has finished';
|
||||||
|
//document.getElementById('installAppsBtn').click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (data=="2") {
|
||||||
document.getElementById('vpnToggle').checked = true;
|
document.getElementById('vpnToggle').checked = true;
|
||||||
document.querySelector(".switch-label").textContent = "ON";
|
document.querySelector(".switch-label").textContent = "ON";
|
||||||
$('#vpn_off').hide();
|
$('#vpn_off').hide();
|
||||||
@@ -135,6 +144,7 @@ function save_vpn() {
|
|||||||
jQuery.get(url, function(data) {
|
jQuery.get(url, function(data) {
|
||||||
console.log('save_vpn: '+data);
|
console.log('save_vpn: '+data);
|
||||||
if (data=="OK") {
|
if (data=="OK") {
|
||||||
|
check_vpn();
|
||||||
}
|
}
|
||||||
//get_vpn();
|
//get_vpn();
|
||||||
});
|
});
|
||||||
@@ -243,11 +253,13 @@ function check_uninstall(additional) {
|
|||||||
console.log('check_uninstall '+additional+': '+data);
|
console.log('check_uninstall '+additional+': '+data);
|
||||||
if (data!="") {
|
if (data!="") {
|
||||||
jQuery("#"+additional).html(data);
|
jQuery("#"+additional).html(data);
|
||||||
|
jQuery("#popupText").html(data); // manage2
|
||||||
}
|
}
|
||||||
if (data!="OK") {
|
if (data!="OK") {
|
||||||
setTimeout(check_uninstall, 1000, additional);
|
setTimeout(check_uninstall, 1000, additional);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
jQuery("#popupText").html('Uninstall has finished'); // manage2
|
||||||
jQuery("#"+additional).html('Uninstall has finished');
|
jQuery("#"+additional).html('Uninstall has finished');
|
||||||
get_deployments();
|
get_deployments();
|
||||||
}
|
}
|
||||||
@@ -261,15 +273,18 @@ function uninstall(additional) {
|
|||||||
});
|
});
|
||||||
data = '<fieldset><form action="#" method="post"><div class="row">YOU ARE GOING TO UNINSTALL '+additional.toUpperCase()+'.<br>ARE YOU SURE? IF YES, PLEASE CLICK ON THE BUTTON BELOW.<br><br></div><div class="row"><div class="mb-3"><button class="btn btn-lg btn-primary btn-block" type="button" onclick="confirm_uninstall(\''+additional+'\')">Uninstall</button></div></div></form></fieldset>';
|
data = '<fieldset><form action="#" method="post"><div class="row">YOU ARE GOING TO UNINSTALL '+additional.toUpperCase()+'.<br>ARE YOU SURE? IF YES, PLEASE CLICK ON THE BUTTON BELOW.<br><br></div><div class="row"><div class="mb-3"><button class="btn btn-lg btn-primary btn-block" type="button" onclick="confirm_uninstall(\''+additional+'\')">Uninstall</button></div></div></form></fieldset>';
|
||||||
jQuery("#"+additional).html(data);
|
jQuery("#"+additional).html(data);
|
||||||
|
jQuery("#popupText").html(data); // manage2
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirm_uninstall(additional) {
|
function confirm_uninstall(additional) {
|
||||||
jQuery("#"+additional).html('Loading...');
|
jQuery("#"+additional).html('Loading...');
|
||||||
|
jQuery("#popupText").html('Loading'); // manage2
|
||||||
var url = 'scan.php?op=uninstall&additional='+additional;
|
var url = 'scan.php?op=uninstall&additional='+additional;
|
||||||
jQuery.get(url, function(data) {
|
jQuery.get(url, function(data) {
|
||||||
console.log('uninstall '+additional+': '+data);
|
console.log('uninstall '+additional+': '+data);
|
||||||
if (data!="") {
|
if (data!="") {
|
||||||
jQuery("#"+additional).html(data);
|
jQuery("#"+additional).html(data);
|
||||||
|
jQuery("#popupText").html(data); // manage2
|
||||||
setTimeout(check_uninstall, 1000, additional);
|
setTimeout(check_uninstall, 1000, additional);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -289,6 +304,7 @@ function update_deployment(additional) {
|
|||||||
console.log('edit '+additional+': '+data);
|
console.log('edit '+additional+': '+data);
|
||||||
if (data!="") {
|
if (data!="") {
|
||||||
jQuery("#"+additional).html(data);
|
jQuery("#"+additional).html(data);
|
||||||
|
jQuery("#popupText").html(data); // manage2
|
||||||
setTimeout(check_deployment, 1000, additional);
|
setTimeout(check_deployment, 1000, additional);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -320,7 +336,7 @@ function check_deployment(additional) {
|
|||||||
var url = 'scan.php?op=check_deployment&additional='+additional;
|
var url = 'scan.php?op=check_deployment&additional='+additional;
|
||||||
jQuery.get(url, function(data) {
|
jQuery.get(url, function(data) {
|
||||||
console.log('check_deployment '+additional);
|
console.log('check_deployment '+additional);
|
||||||
//console.log('check_deployment data: '+data);
|
console.log('check_deployment data: '+data);
|
||||||
if (data!="") {
|
if (data!="") {
|
||||||
jQuery("#"+additional).html(data);
|
jQuery("#"+additional).html(data);
|
||||||
jQuery("#popupText").html(data); // manage2
|
jQuery("#popupText").html(data); // manage2
|
||||||
@@ -342,6 +358,7 @@ function deploy(additional) {
|
|||||||
console.log('deploy '+additional+': '+data);
|
console.log('deploy '+additional+': '+data);
|
||||||
if (data!="") {
|
if (data!="") {
|
||||||
jQuery("#"+additional).html(data);
|
jQuery("#"+additional).html(data);
|
||||||
|
jQuery("#popupText").html(data); // manage2
|
||||||
setTimeout(check_deployment, 1000, additional);
|
setTimeout(check_deployment, 1000, additional);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -360,6 +377,7 @@ function redeploy(additional) {
|
|||||||
console.log('redeploy '+additional+': '+data);
|
console.log('redeploy '+additional+': '+data);
|
||||||
if (data!="") {
|
if (data!="") {
|
||||||
jQuery("#"+additional).html(data);
|
jQuery("#"+additional).html(data);
|
||||||
|
jQuery("#popupText").html(data); // manage2
|
||||||
setTimeout(check_deployment, 1000, additional);
|
setTimeout(check_deployment, 1000, additional);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -433,8 +451,8 @@ function get_proxy_html() {
|
|||||||
<script>
|
<script>
|
||||||
jQuery('#vpn_save_btn').click(function() {
|
jQuery('#vpn_save_btn').click(function() {
|
||||||
console.log('vpn save');
|
console.log('vpn save');
|
||||||
jQuery('#vpn').html('Loading...');
|
|
||||||
save_vpn();
|
save_vpn();
|
||||||
|
jQuery('#vpn').html('VPN start process in progress. Please wait...');
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
`;
|
`;
|
||||||
@@ -465,6 +483,7 @@ function get_containers() {
|
|||||||
jQuery(document).ready(function(){
|
jQuery(document).ready(function(){
|
||||||
|
|
||||||
get_repositories();
|
get_repositories();
|
||||||
|
get_deployments();
|
||||||
get_system();
|
get_system();
|
||||||
check_vpn();
|
check_vpn();
|
||||||
|
|
||||||
|
6
img/apps1.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11.9998 13.2999C11.8698 13.2999 11.7398 13.2699 11.6198 13.1999L2.78985 8.0899C2.42985 7.8799 2.30983 7.41987 2.51983 7.05987C2.72983 6.69987 3.17983 6.57985 3.54983 6.78985L11.9998 11.6799L20.3998 6.81988C20.7598 6.60988 21.2198 6.7399 21.4298 7.0899C21.6398 7.4499 21.5098 7.90987 21.1598 8.11987L12.3899 13.1999C12.2599 13.2599 12.1298 13.2999 11.9998 13.2999Z" fill="#7C7D81"/>
|
||||||
|
<path d="M12 22.36C11.59 22.36 11.25 22.02 11.25 21.61V12.54C11.25 12.13 11.59 11.79 12 11.79C12.41 11.79 12.75 12.13 12.75 12.54V21.61C12.75 22.02 12.41 22.36 12 22.36Z" fill="#7C7D81"/>
|
||||||
|
<path d="M12.0001 22.75C11.1201 22.75 10.2501 22.56 9.56012 22.18L4.22012 19.21C2.77012 18.41 1.64014 16.48 1.64014 14.82V9.16998C1.64014 7.50998 2.77012 5.59002 4.22012 4.78002L9.56012 1.82C10.9301 1.06 13.0701 1.06 14.4401 1.82L19.7801 4.78997C21.2301 5.58997 22.3601 7.51999 22.3601 9.17999V14.83C22.3601 16.49 21.2301 18.41 19.7801 19.22L14.4401 22.18C13.7501 22.56 12.8801 22.75 12.0001 22.75ZM12.0001 2.74999C11.3701 2.74999 10.7501 2.88 10.2901 3.13L4.95013 6.09997C3.99013 6.63997 3.14014 8.06999 3.14014 9.17999V14.83C3.14014 15.93 3.99013 17.37 4.95013 17.91L10.2901 20.88C11.2001 21.39 12.8001 21.39 13.7101 20.88L19.0501 17.91C20.0101 17.37 20.8601 15.94 20.8601 14.83V9.17999C20.8601 8.07999 20.0101 6.63997 19.0501 6.09997L13.7101 3.13C13.2501 2.88 12.6301 2.74999 12.0001 2.74999Z" fill="#7C7D81"/>
|
||||||
|
<path d="M17.0002 13.9905C16.5902 13.9905 16.2502 13.6505 16.2502 13.2405V10.0206L7.13018 4.76055C6.77018 4.55055 6.65016 4.09054 6.86016 3.74054C7.07016 3.38054 7.52018 3.26052 7.88018 3.47052L17.3702 8.95056C17.6002 9.08056 17.7502 9.33052 17.7502 9.60052V13.2606C17.7502 13.6506 17.4102 13.9905 17.0002 13.9905Z" fill="#7C7D81"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
6
img/apps2.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11.9998 13.2999C11.8698 13.2999 11.7398 13.2699 11.6198 13.1999L2.78985 8.0899C2.42985 7.8799 2.30983 7.41987 2.51983 7.05987C2.72983 6.69987 3.17983 6.57985 3.54983 6.78985L11.9998 11.6799L20.3998 6.81988C20.7598 6.60988 21.2198 6.7399 21.4298 7.0899C21.6398 7.4499 21.5098 7.90987 21.1598 8.11987L12.3899 13.1999C12.2599 13.2599 12.1298 13.2999 11.9998 13.2999Z" fill="#101010"/>
|
||||||
|
<path d="M12 22.36C11.59 22.36 11.25 22.02 11.25 21.61V12.54C11.25 12.13 11.59 11.79 12 11.79C12.41 11.79 12.75 12.13 12.75 12.54V21.61C12.75 22.02 12.41 22.36 12 22.36Z" fill="#101010"/>
|
||||||
|
<path d="M12.0001 22.75C11.1201 22.75 10.2501 22.56 9.56012 22.18L4.22012 19.21C2.77012 18.41 1.64014 16.48 1.64014 14.82V9.16998C1.64014 7.50998 2.77012 5.59002 4.22012 4.78002L9.56012 1.82C10.9301 1.06 13.0701 1.06 14.4401 1.82L19.7801 4.78997C21.2301 5.58997 22.3601 7.51999 22.3601 9.17999V14.83C22.3601 16.49 21.2301 18.41 19.7801 19.22L14.4401 22.18C13.7501 22.56 12.8801 22.75 12.0001 22.75ZM12.0001 2.74999C11.3701 2.74999 10.7501 2.88 10.2901 3.13L4.95013 6.09997C3.99013 6.63997 3.14014 8.06999 3.14014 9.17999V14.83C3.14014 15.93 3.99013 17.37 4.95013 17.91L10.2901 20.88C11.2001 21.39 12.8001 21.39 13.7101 20.88L19.0501 17.91C20.0101 17.37 20.8601 15.94 20.8601 14.83V9.17999C20.8601 8.07999 20.0101 6.63997 19.0501 6.09997L13.7101 3.13C13.2501 2.88 12.6301 2.74999 12.0001 2.74999Z" fill="#101010"/>
|
||||||
|
<path d="M17.0002 13.9905C16.5902 13.9905 16.2502 13.6505 16.2502 13.2405V10.0206L7.13018 4.76055C6.77018 4.55055 6.65016 4.09054 6.86016 3.74054C7.07016 3.38054 7.52018 3.26052 7.88018 3.47052L17.3702 8.95056C17.6002 9.08056 17.7502 9.33052 17.7502 9.60052V13.2606C17.7502 13.6506 17.4102 13.9905 17.0002 13.9905Z" fill="#101010"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
4
img/backup1.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.32 12.7504H15C12.51 12.7504 11.25 11.3404 11.25 8.55045V5.68045C11.25 4.66045 11.37 3.20045 12.43 2.40045C13.32 1.74045 14.6 1.69045 16.49 2.24045C18.97 2.96045 21.04 5.03045 21.76 7.51045C22.31 9.39045 22.26 10.6804 21.6 11.5604C20.8 12.6304 19.34 12.7504 18.32 12.7504ZM14.28 3.36045C13.87 3.36045 13.55 3.44045 13.34 3.60045C12.95 3.89045 12.76 4.57045 12.76 5.68045V8.56045C12.76 10.8004 13.62 11.2604 15.01 11.2604H18.33C19.43 11.2604 20.11 11.0704 20.41 10.6804C20.76 10.2204 20.73 9.30045 20.34 7.95045C19.76 5.98045 18.06 4.27045 16.09 3.70045C15.35 3.47045 14.75 3.36045 14.28 3.36045Z" fill="#7C7D81"/>
|
||||||
|
<path d="M11.0699 22.7503C10.5399 22.7503 9.99988 22.7103 9.45988 22.6203C5.36988 21.9603 2.03988 18.6403 1.37988 14.5503C0.529883 9.29032 3.91988 4.33032 9.10988 3.27032C9.51988 3.19032 9.90988 3.45032 9.99988 3.85032C10.0799 4.26032 9.81988 4.65032 9.41988 4.74032C5.02988 5.64032 2.14988 9.84032 2.87988 14.3103C3.43988 17.7703 6.24988 20.5803 9.70988 21.1403C14.1999 21.8603 18.3899 18.9703 19.2799 14.5603C19.3599 14.1503 19.7599 13.8903 20.1599 13.9703C20.5699 14.0503 20.8299 14.4503 20.7499 14.8503C19.7999 19.5203 15.7199 22.7503 11.0699 22.7503Z" fill="#7C7D81"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
4
img/backup2.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M1.05105 10.4495C1.05105 15.5708 5.03278 19.5654 10.0865 19.6166C15.1913 19.6166 19.2241 15.6732 19.2241 10.5519C19.2241 5.43059 15.2423 1.38477 10.1886 1.38477C5.13487 1.38477 1.05105 5.32816 1 10.5007L1.05105 10.4495Z" stroke="#101010" stroke-width="1.5" stroke-miterlimit="10"/>
|
||||||
|
<path d="M12.0262 6.45442C11.5158 7.1714 11.4647 7.99081 12.0262 8.50293C12.5367 9.06628 13.3535 9.06628 14.1702 8.50293C14.936 9.78326 14.8849 12.3951 12.9451 13.9315C11.2095 15.3143 8.55498 15.1606 6.97249 13.6242C5.39001 12.0366 5.23687 9.42477 6.61516 7.63231C8.14659 5.68622 10.75 5.68622 12.0262 6.4032V6.45442Z" fill="#101010"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 730 B |
4
img/disk1.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.32 12.7504H15C12.51 12.7504 11.25 11.3404 11.25 8.55045V5.68045C11.25 4.66045 11.37 3.20045 12.43 2.40045C13.32 1.74045 14.6 1.69045 16.49 2.24045C18.97 2.96045 21.04 5.03045 21.76 7.51045C22.31 9.39045 22.26 10.6804 21.6 11.5604C20.8 12.6304 19.34 12.7504 18.32 12.7504ZM14.28 3.36045C13.87 3.36045 13.55 3.44045 13.34 3.60045C12.95 3.89045 12.76 4.57045 12.76 5.68045V8.56045C12.76 10.8004 13.62 11.2604 15.01 11.2604H18.33C19.43 11.2604 20.11 11.0704 20.41 10.6804C20.76 10.2204 20.73 9.30045 20.34 7.95045C19.76 5.98045 18.06 4.27045 16.09 3.70045C15.35 3.47045 14.75 3.36045 14.28 3.36045Z" fill="#7C7D81"/>
|
||||||
|
<path d="M11.0699 22.7503C10.5399 22.7503 9.99988 22.7103 9.45988 22.6203C5.36988 21.9603 2.03988 18.6403 1.37988 14.5503C0.529883 9.29032 3.91988 4.33032 9.10988 3.27032C9.51988 3.19032 9.90988 3.45032 9.99988 3.85032C10.0799 4.26032 9.81988 4.65032 9.41988 4.74032C5.02988 5.64032 2.14988 9.84032 2.87988 14.3103C3.43988 17.7703 6.24988 20.5803 9.70988 21.1403C14.1999 21.8603 18.3899 18.9703 19.2799 14.5603C19.3599 14.1503 19.7599 13.8903 20.1599 13.9703C20.5699 14.0503 20.8299 14.4503 20.7499 14.8503C19.7999 19.5203 15.7199 22.7503 11.0699 22.7503Z" fill="#7C7D81"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
4
img/disk2.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.32 12.7504H15C12.51 12.7504 11.25 11.3404 11.25 8.55045V5.68045C11.25 4.66045 11.37 3.20045 12.43 2.40045C13.32 1.74045 14.6 1.69045 16.49 2.24045C18.97 2.96045 21.04 5.03045 21.76 7.51045C22.31 9.39045 22.26 10.6804 21.6 11.5604C20.8 12.6304 19.34 12.7504 18.32 12.7504ZM14.28 3.36045C13.87 3.36045 13.55 3.44045 13.34 3.60045C12.95 3.89045 12.76 4.57045 12.76 5.68045V8.56045C12.76 10.8004 13.62 11.2604 15.01 11.2604H18.33C19.43 11.2604 20.11 11.0704 20.41 10.6804C20.76 10.2204 20.73 9.30045 20.34 7.95045C19.76 5.98045 18.06 4.27045 16.09 3.70045C15.35 3.47045 14.75 3.36045 14.28 3.36045Z" fill="#101010"/>
|
||||||
|
<path d="M11.0699 22.7503C10.5399 22.7503 9.99988 22.7103 9.45988 22.6203C5.36988 21.9603 2.03988 18.6403 1.37988 14.5503C0.529883 9.29032 3.91988 4.33032 9.10988 3.27032C9.51988 3.19032 9.90988 3.45032 9.99988 3.85032C10.0799 4.26032 9.81988 4.65032 9.41988 4.74032C5.02988 5.64032 2.14988 9.84032 2.87988 14.3103C3.43988 17.7703 6.24988 20.5803 9.70988 21.1403C14.1999 21.8603 18.3899 18.9703 19.2799 14.5603C19.3599 14.1503 19.7599 13.8903 20.1599 13.9703C20.5699 14.0503 20.8299 14.4503 20.7499 14.8503C19.7999 19.5203 15.7199 22.7503 11.0699 22.7503Z" fill="#101010"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
4
img/monitor1.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M1.05105 10.4495C1.05105 15.5708 5.03278 19.5654 10.0865 19.6166C15.1913 19.6166 19.2241 15.6732 19.2241 10.5519C19.2241 5.43059 15.2423 1.38477 10.1886 1.38477C5.13487 1.38477 1.05105 5.32816 1 10.5007L1.05105 10.4495Z" stroke="#7C7D81" stroke-width="1.5" stroke-miterlimit="10"/>
|
||||||
|
<path d="M12.0262 6.45442C11.5158 7.1714 11.4647 7.99081 12.0262 8.50293C12.5367 9.06628 13.3535 9.06628 14.1702 8.50293C14.936 9.78326 14.8849 12.3951 12.9451 13.9315C11.2095 15.3143 8.55498 15.1606 6.97249 13.6242C5.39001 12.0366 5.23687 9.42477 6.61516 7.63231C8.14659 5.68622 10.75 5.68622 12.0262 6.4032V6.45442Z" fill="#7C7D81"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 730 B |
4
img/monitor2.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M1.05105 10.4495C1.05105 15.5708 5.03278 19.5654 10.0865 19.6166C15.1913 19.6166 19.2241 15.6732 19.2241 10.5519C19.2241 5.43059 15.2423 1.38477 10.1886 1.38477C5.13487 1.38477 1.05105 5.32816 1 10.5007L1.05105 10.4495Z" stroke="#101010" stroke-width="1.5" stroke-miterlimit="10"/>
|
||||||
|
<path d="M12.0262 6.45442C11.5158 7.1714 11.4647 7.99081 12.0262 8.50293C12.5367 9.06628 13.3535 9.06628 14.1702 8.50293C14.936 9.78326 14.8849 12.3951 12.9451 13.9315C11.2095 15.3143 8.55498 15.1606 6.97249 13.6242C5.39001 12.0366 5.23687 9.42477 6.61516 7.63231C8.14659 5.68622 10.75 5.68622 12.0262 6.4032V6.45442Z" fill="#101010"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 730 B |
4
img/settings1.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="19" height="21" viewBox="0 0 19 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.0632 10.6142C18.0632 11.7655 18.0632 12.8209 18.0632 13.9722C18.0632 15.4113 17.5238 16.4667 16.3551 17.1383C14.5571 18.2896 12.6693 19.4409 10.8713 20.4963C9.70261 21.1679 8.53391 21.1679 7.36523 20.4963C5.56726 19.345 3.76928 18.2896 1.97131 17.1383C0.80263 16.3708 0.17334 15.3154 0.17334 13.8763C0.17334 11.6696 0.17334 9.46292 0.17334 7.16031C0.17334 5.72118 0.80263 4.66579 1.97131 3.89825C3.76928 2.74694 5.56726 1.69158 7.36523 0.540273C8.53391 -0.131322 9.70261 -0.227264 10.8713 0.540273C12.6693 1.69158 14.5571 2.74694 16.3551 3.89825C17.5238 4.56985 18.0632 5.72118 18.0632 7.16031C18.0632 8.31162 18.0632 9.36698 18.0632 10.5183V10.6142ZM16.7147 10.6142C16.7147 9.4629 16.7147 8.31159 16.7147 7.25623C16.7147 6.39275 16.3551 5.72115 15.7258 5.33738C13.9279 4.18608 12.0399 3.03479 10.1521 1.88349C9.43288 1.49972 8.80365 1.49972 8.08446 1.88349C6.28649 3.03479 4.48843 4.09016 2.60056 5.24147C1.88137 5.72118 1.52182 6.39275 1.52182 7.25623C1.52182 9.4629 1.52182 11.7655 1.52182 13.9722C1.52182 14.8357 1.88137 15.5072 2.60056 15.9869C4.39853 17.1383 6.19659 18.1936 8.08446 19.3449C8.80365 19.8246 9.52275 19.7287 10.2419 19.3449C12.0399 18.1936 13.838 17.1383 15.7258 15.9869C16.445 15.5072 16.8046 14.9316 16.8046 14.0681C16.8046 12.9168 16.8046 11.8614 16.8046 10.7101L16.7147 10.6142Z" fill="#7C7D81"/>
|
||||||
|
<path d="M9.16305 14.7404C7.00548 14.7404 5.29736 12.9174 5.29736 10.6148C5.29736 8.31221 7.00548 6.48926 9.16305 6.48926C11.3206 6.48926 13.0287 8.31221 13.0287 10.6148C13.0287 12.9174 11.3206 14.7404 9.16305 14.7404ZM11.6803 10.6148C11.6803 9.17569 10.6014 7.92839 9.16305 7.92839C7.81457 7.92839 6.64584 9.07974 6.64584 10.6148C6.64584 12.054 7.72467 13.3012 9.16305 13.3012C10.5115 13.3012 11.6803 12.1499 11.6803 10.6148Z" fill="#7C7D81"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
4
img/settings2.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="19" height="21" viewBox="0 0 19 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.0632 10.6142C18.0632 11.7655 18.0632 12.8209 18.0632 13.9722C18.0632 15.4113 17.5238 16.4667 16.3551 17.1383C14.5571 18.2896 12.6693 19.4409 10.8713 20.4963C9.70261 21.1679 8.53391 21.1679 7.36523 20.4963C5.56726 19.345 3.76928 18.2896 1.97131 17.1383C0.80263 16.3708 0.17334 15.3154 0.17334 13.8763C0.17334 11.6696 0.17334 9.46292 0.17334 7.16031C0.17334 5.72118 0.80263 4.66579 1.97131 3.89825C3.76928 2.74694 5.56726 1.69158 7.36523 0.540273C8.53391 -0.131322 9.70261 -0.227264 10.8713 0.540273C12.6693 1.69158 14.5571 2.74694 16.3551 3.89825C17.5238 4.56985 18.0632 5.72118 18.0632 7.16031C18.0632 8.31162 18.0632 9.36698 18.0632 10.5183V10.6142ZM16.7147 10.6142C16.7147 9.4629 16.7147 8.31159 16.7147 7.25623C16.7147 6.39275 16.3551 5.72115 15.7258 5.33738C13.9279 4.18608 12.0399 3.03479 10.1521 1.88349C9.43288 1.49972 8.80365 1.49972 8.08446 1.88349C6.28649 3.03479 4.48843 4.09016 2.60056 5.24147C1.88137 5.72118 1.52182 6.39275 1.52182 7.25623C1.52182 9.4629 1.52182 11.7655 1.52182 13.9722C1.52182 14.8357 1.88137 15.5072 2.60056 15.9869C4.39853 17.1383 6.19659 18.1936 8.08446 19.3449C8.80365 19.8246 9.52275 19.7287 10.2419 19.3449C12.0399 18.1936 13.838 17.1383 15.7258 15.9869C16.445 15.5072 16.8046 14.9316 16.8046 14.0681C16.8046 12.9168 16.8046 11.8614 16.8046 10.7101L16.7147 10.6142Z" fill="#101010"/>
|
||||||
|
<path d="M9.16305 14.7404C7.00548 14.7404 5.29736 12.9174 5.29736 10.6148C5.29736 8.31221 7.00548 6.48926 9.16305 6.48926C11.3206 6.48926 13.0287 8.31221 13.0287 10.6148C13.0287 12.9174 11.3206 14.7404 9.16305 14.7404ZM11.6803 10.6148C11.6803 9.17569 10.6014 7.92839 9.16305 7.92839C7.81457 7.92839 6.64584 9.07974 6.64584 10.6148C6.64584 12.054 7.72467 13.3012 9.16305 13.3012C10.5115 13.3012 11.6803 12.1499 11.6803 10.6148Z" fill="#101010"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
236
install.html
@@ -1,175 +1,167 @@
|
|||||||
<!doctype html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="hu">
|
||||||
<head>
|
<head>
|
||||||
<!-- Required meta tags -->
|
<meta charset="UTF-8" />
|
||||||
<meta charset="utf-8">
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<title>Safebox - INSTALLER TOOL</title>
|
||||||
<title>INSTALLER TOOL</title>
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/>
|
||||||
<!-- Bootstrap CSS -->
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
|
<link rel="stylesheet" href="style.css?t=1" />
|
||||||
<!-- Custom styles for this template -->
|
|
||||||
<link href="installer.css?t=3" rel="stylesheet">
|
|
||||||
</head>
|
</head>
|
||||||
<body id="installer" class="text-center">
|
<body id="installer">
|
||||||
<div class="container-fluid">
|
<div class="main" >
|
||||||
<div class="col-md-12">
|
<div id="myAppsContainer">
|
||||||
|
<div class="logo">
|
||||||
|
<img src="/img/logo.png" alt="Safebox"/>
|
||||||
|
<span>Safebox</span>
|
||||||
|
</div>
|
||||||
|
<h3 style="text-align:center">No any previous deployed environment has found</h3>
|
||||||
|
<div class="main-header">
|
||||||
|
<h1>Base settings</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
<form class="form-install" action="install.php" method="post">
|
<form class="form-install" action="install.php" method="post">
|
||||||
|
<!-- base settings -->
|
||||||
<h1>No any previous deployed environment found</h1>
|
<div class="input-row">
|
||||||
|
<label for="user_auth">User auth (homeguard) enable?</label>
|
||||||
<fieldset>
|
<div class="input-container">
|
||||||
<legend>Base settings</legend>
|
|
||||||
<div class="row">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="user_auth">User auth (homeguard) enable?</label>
|
|
||||||
<select class="custom-select d-block w-100" name="USER_AUTH" id="user_auth">
|
<select class="custom-select d-block w-100" name="USER_AUTH" id="user_auth">
|
||||||
<option value="yes">Yes</option>
|
<option value="yes">Yes</option>
|
||||||
<option value="no" selected>No</option>
|
<option value="no" selected>No</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="div_user_auth" class="hidden">
|
<div id="div_user_auth" class="hidden">
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
|
||||||
<label for="auth_username">Username:</label>
|
<label for="auth_username">Username:</label>
|
||||||
|
<div class="input-container">
|
||||||
<input type="text" class="form-control" name="AUTH_USERNAME" id="auth_username" value="" maxlength="20" size="20">
|
<input type="text" class="form-control" name="AUTH_USERNAME" id="auth_username" value="" maxlength="20" size="20">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
|
||||||
<label for="auth_password">Password:</label>
|
<label for="auth_password">Password:</label>
|
||||||
|
<div class="input-container">
|
||||||
<input type="text" class="form-control" name="AUTH_PASSWORD" id="auth_password" value="" maxlength="20" size="20">
|
<input type="text" class="form-control" name="AUTH_PASSWORD" id="auth_password" value="" maxlength="20" size="20">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
|
||||||
<label for="auth_role">Role:</label>
|
<label for="auth_role">Role:</label>
|
||||||
|
<div class="input-container">
|
||||||
<select class="custom-select d-block w-100" name="AUTH_ROLE" id="auth_role">
|
<select class="custom-select d-block w-100" name="AUTH_ROLE" id="auth_role">
|
||||||
<option value="admin">Admin</option>
|
<option value="admin">Admin</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
<label for="vpn">Proxy enable?</label>
|
||||||
<label for="vpn">Proxy enable?</label>
|
<div class="input-container">
|
||||||
<select class="custom-select d-block w-100" name="VPN_PROXY" id="vpn">
|
<select class="custom-select d-block w-100" name="VPN_PROXY" id="vpn">
|
||||||
<option value="yes">Yes</option>
|
<option value="yes">Yes</option>
|
||||||
<option value="no" selected>No</option>
|
<option value="no" selected>No</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="div_vpn" class="hidden">
|
<div id="div_vpn" class="hidden">
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
<label for="vpn_domain">Please add domain url to download the VPN hash from:</label>
|
||||||
<label for="vpn_domain">Please add domain url to download the VPN hash from (default: https://portal.safebox.network):</label>
|
<div class="input-container">
|
||||||
<input type="text" class="form-control" name="VPN_DOMAIN" id="vpn_domain" value="https://portal.safebox.network">
|
<input type="text" class="form-control" name="VPN_DOMAIN" id="vpn_domain" value="https://portal.safebox.network" placeholder="https://portal.safebox.network" size="40">
|
||||||
<div class="invalid-feedback">
|
</div>
|
||||||
Please enter a valid domain.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
<label for="vpn_pass">Please type in the generated VPN passkey (8 digits):</label>
|
||||||
<label for="vpn_pass">Please type in the generated VPN passkey (8 digits):</label>
|
<div class="input-container">
|
||||||
<input type="text" class="form-control" name="VPN_PASS" id="vpn_pass" value="" maxlength="8" size="10">
|
<input type="text" class="form-control" name="VPN_PASS" id="vpn_pass" value="" maxlength="8" size="10">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
<label for="letsencrypt_mail">Please add the letsencrypt mail address:</label>
|
||||||
<label for="letsencrypt_mail">Please add the letsencrypt mail address:</label>
|
<div class="input-container">
|
||||||
<input type="email" class="form-control" name="LETSENCRYPT_MAIL" id="letsencrypt_mail" value="">
|
<input type="email" class="form-control" name="LETSENCRYPT_MAIL" id="letsencrypt_mail" value="">
|
||||||
<div class="invalid-feedback">
|
</div>
|
||||||
Please enter a valid email.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
<label for="letsencrypt_servername">Please add letsencrypt server name (default is letsencrypt but you can add zerossl too):</label>
|
||||||
<label for="letsencrypt_servername">Please add letsencrypt server name (default is letsencrypt but you can add zerossl too):</label>
|
<div class="input-container">
|
||||||
<input type="text" class="form-control" name="LETSENCRYPT_SERVERNAME" id="letsencrypt_servername" value="letsencrypt">
|
<input type="text" class="form-control" name="LETSENCRYPT_SERVERNAME" id="letsencrypt_servername" value="letsencrypt" placeholder="letsencrypt">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
<label for="diagnostic">Diagnostic mode enable?</label>
|
||||||
<label for="diagnostic">Diagnostic mode enable?</label>
|
<div class="input-container">
|
||||||
<select class="custom-select d-block w-100" name="DIAGNOSTIC" id="diagnostic">
|
<select class="custom-select d-block w-100" name="DIAGNOSTIC" id="diagnostic">
|
||||||
<option value="yes">Yes</option>
|
<option value="yes">Yes</option>
|
||||||
<option value="no" selected>No</option>
|
<option value="no" selected>No</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
<!-- base settings end -->
|
||||||
|
<br>
|
||||||
<fieldset>
|
<br>
|
||||||
<legend><a href="javascript:void()" id="advanced">Advanced settings</a></legend>
|
<div class="main-header">
|
||||||
|
<h1 id="advanced" style="cursor:pointer">Advanced settings</h1>
|
||||||
|
</div>
|
||||||
|
<!-- advanced settings -->
|
||||||
<div id="advanced_div" style="display:none">
|
<div id="advanced_div" style="display:none">
|
||||||
<div class="row">
|
<div class="input-row">
|
||||||
<div class="mb-3">
|
|
||||||
<label for="registry">Please fill in the docker registry name (default:safebox):</label>
|
<label for="registry">Please fill in the docker registry name (default:safebox):</label>
|
||||||
<input type="registry" class="form-control" name="DOCKER_REGISTRY_URL" id="registry" value="safebox" required>
|
<div class="input-container">
|
||||||
<div class="invalid-feedback">
|
<input type="registry" class="form-control" name="DOCKER_REGISTRY_URL" id="registry" value="safebox" placeholder="safebox" required>
|
||||||
Please enter a valid registry url.
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="input-row">
|
||||||
<div class="row">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="smarthost">Smarthost proxy?</label>
|
<label for="smarthost">Smarthost proxy?</label>
|
||||||
<select class="custom-select d-block w-100" name="SMARTHOST_PROXY" id="smarthost">
|
<div class="input-container">
|
||||||
<option value="yes" selected>Yes</option>
|
<select class="custom-select d-block w-100" name="SMARTHOST_PROXY" id="smarthost">
|
||||||
<option value="no">No</option>
|
<option value="yes" selected>Yes</option>
|
||||||
</select>
|
<option value="no">No</option>
|
||||||
</div>
|
</select>
|
||||||
</div>
|
|
||||||
<div id="div_smarthost">
|
|
||||||
<div class="row">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="domain">Please fill in the domain name</label>
|
|
||||||
<input type="domain" class="form-control" name="DOMAIN" id="domain" value="localhost">
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
Please enter a valid domain.
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div id="div_smarthost">
|
||||||
<div class="mb-3">
|
<div class="input-row">
|
||||||
<label for="local_backend">Would you like to run local backend?</label>
|
<label for="domain">Please fill in the domain name</label>
|
||||||
<select class="custom-select d-block w-100" name="LOCAL_BACKEND" id="local_backend">
|
<div class="input-container">
|
||||||
<option value="yes">Yes</option>
|
<input type="domain" class="form-control" name="DOMAIN" id="domain" value="localhost">
|
||||||
<option value="no" selected>No</option>
|
</div>
|
||||||
</select>
|
</div>
|
||||||
</div>
|
<div class="input-row">
|
||||||
|
<label for="local_backend">Would you like to run local backend?</label>
|
||||||
|
<div class="input-container">
|
||||||
|
<select class="custom-select d-block w-100" name="LOCAL_BACKEND" id="local_backend">
|
||||||
|
<option value="yes">Yes</option>
|
||||||
|
<option value="no" selected>No</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="input-row">
|
||||||
<div class="row">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="localproxy">Local proxy?</label>
|
<label for="localproxy">Local proxy?</label>
|
||||||
<select class="custom-select d-block w-100" name="LOCAL_PROXY" id="localproxy">
|
<div class="input-container">
|
||||||
<option value="yes" selected>Yes</option>
|
<select class="custom-select d-block w-100" name="LOCAL_PROXY" id="localproxy">
|
||||||
<option value="no">No</option>
|
<option value="yes" selected>Yes</option>
|
||||||
</select>
|
<option value="no">No</option>
|
||||||
</div>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
</div>
|
||||||
<div class="mb-3">
|
<div class="input-row">
|
||||||
<label for="cron">Cron?</label>
|
<label for="cron">Cron?</label>
|
||||||
<select class="custom-select d-block w-100" name="CRON" id="cron">
|
<div class="input-container">
|
||||||
<option value="yes">Yes</option>
|
<select class="custom-select d-block w-100" name="CRON" id="cron">
|
||||||
<option value="no">No</option>
|
<option value="yes">Yes</option>
|
||||||
</select>
|
<option value="no">No</option>
|
||||||
</div>
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<!-- advanced settings end -->
|
||||||
</fieldset>
|
<button class="save-button" type="submit">Start install</button>
|
||||||
<br>
|
|
||||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Start install</button>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<!-- Optional JavaScript -->
|
<!-- Optional JavaScript -->
|
||||||
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
||||||
|
174
install.js
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
|
||||||
|
function updateProgress(percentage) {
|
||||||
|
// Clamp percentage between 0 and 99.9 (never reach 100)
|
||||||
|
percentage = Math.max(0, Math.min(99.9, percentage));
|
||||||
|
|
||||||
|
progressBar.style.width = percentage + '%';
|
||||||
|
progressText.textContent = Math.round(percentage) + '%';
|
||||||
|
currentProgress = percentage;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setProgress(percentage) {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
updateProgress(percentage);
|
||||||
|
startProgress();
|
||||||
|
}
|
||||||
|
|
||||||
|
function startProgress() {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
const duration = 60000; // 60 seconds
|
||||||
|
const startTime = Date.now() - (currentProgress / 100) * duration;
|
||||||
|
|
||||||
|
progressInterval = setInterval(() => {
|
||||||
|
const elapsed = Date.now() - startTime;
|
||||||
|
// Use exponential approach to 100% - gets slower as it approaches
|
||||||
|
let progress = (1 - Math.exp(-4 * elapsed / duration)) * 100;
|
||||||
|
|
||||||
|
// Ensure it never reaches 100%
|
||||||
|
progress = Math.min(progress, 99.9);
|
||||||
|
|
||||||
|
updateProgress(progress);
|
||||||
|
|
||||||
|
// Stop when we've been running for 60+ seconds
|
||||||
|
if (elapsed >= duration) {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
}
|
||||||
|
}, 100); // Update every 100ms
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetProgress() {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
updateProgress(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Example: Simulate loading with custom speeds
|
||||||
|
function simulateLoading(duration = 3000) {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
const startTime = Date.now();
|
||||||
|
|
||||||
|
progressInterval = setInterval(() => {
|
||||||
|
const elapsed = Date.now() - startTime;
|
||||||
|
const progress = Math.min((elapsed / duration) * 100, 99.9);
|
||||||
|
|
||||||
|
updateProgress(progress);
|
||||||
|
|
||||||
|
if (elapsed >= duration) {
|
||||||
|
clearInterval(progressInterval);
|
||||||
|
}
|
||||||
|
}, 16); // ~60fps
|
||||||
|
}
|
||||||
|
|
||||||
|
function redirectToInstall() {
|
||||||
|
setProgress(100);
|
||||||
|
window.location.href = 'install.html';
|
||||||
|
}
|
||||||
|
|
||||||
|
function redirectToManage() {
|
||||||
|
setProgress(100);
|
||||||
|
// window.location.href = 'manage.html';
|
||||||
|
}
|
||||||
|
|
||||||
|
function start_system() {
|
||||||
|
var url = 'scan.php?op=system';
|
||||||
|
$.get(url, function(data){
|
||||||
|
console.log('start_system: '+data);
|
||||||
|
if (data=='OK') {
|
||||||
|
$("#info").html('Scanning for previous install. Please wait...');
|
||||||
|
check_system();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#info").html('Scanning for previous install has aborted...');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_system() {
|
||||||
|
var url = 'scan.php?op=check_system';
|
||||||
|
$.get(url, function(data){
|
||||||
|
console.log('check_system: '+data);
|
||||||
|
if (data=='NEW') {
|
||||||
|
$("#info").html('No previous install has found...');
|
||||||
|
setTimeout(redirectToInstall, 3000);
|
||||||
|
}
|
||||||
|
else if (data=='EXISTS') {
|
||||||
|
$("#info").html('Previous install has found...');
|
||||||
|
setProgress(80);
|
||||||
|
setTimeout(redirectToManage, 3000);
|
||||||
|
}
|
||||||
|
else if (data=='WAIT') {
|
||||||
|
setTimeout(check_system, 1000);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// UNEXPECTED ERROR
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_redis() {
|
||||||
|
|
||||||
|
var url = 'scan.php?op=redis';
|
||||||
|
$.get(url, function(data){
|
||||||
|
console.log('check_redis: '+data);
|
||||||
|
if (data=='OK') {
|
||||||
|
$("#info").html('Redis server - OK');
|
||||||
|
check_install();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#info").html('Redis server is not available...');
|
||||||
|
setTimeout(check_redis, 1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_directory() {
|
||||||
|
|
||||||
|
var url = 'scan.php?op=directory';
|
||||||
|
$.get(url, function(data){
|
||||||
|
console.log('check_directory: '+data);
|
||||||
|
if (data=='OK') {
|
||||||
|
$("#info").html('Connection is ready - OK');
|
||||||
|
check_install();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#info").html('Shared directory is not available...');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_interface() {
|
||||||
|
|
||||||
|
var url = 'scan.php?op=get_interface';
|
||||||
|
$.get(url, function(data){
|
||||||
|
console.log('check_interface: '+data);
|
||||||
|
if (data=='redis') {
|
||||||
|
check_redis();
|
||||||
|
}
|
||||||
|
else if (data=='directory') {
|
||||||
|
check_directory();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#info").html('Invalid interface definition...');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_install() {
|
||||||
|
|
||||||
|
console.log('install: '+install);
|
||||||
|
if (install==1) {
|
||||||
|
var url = 'scan.php?op=check_install&key=<?php echo $key;?>';
|
||||||
|
$.get(url, function(data){
|
||||||
|
console.log('check_install:'+data+' counter: '+counter);
|
||||||
|
if (data=='INSTALLED') {
|
||||||
|
redirectToManage();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
counter+=1
|
||||||
|
$("#info").html('Please wait ... ' + counter);
|
||||||
|
setTimeout(check_install, 1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else start_system(); // scan
|
||||||
|
}
|
||||||
|
|
124
install.php
@@ -61,106 +61,54 @@ echo "<pre>".$output."</pre>";
|
|||||||
//echo $output;
|
//echo $output;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
?>
|
?><!DOCTYPE html>
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- Required meta tags -->
|
<meta charset="UTF-8" />
|
||||||
<meta charset="utf-8">
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<title>Safebox - INSTALLER TOOL</title>
|
||||||
<title>INSTALLER TOOL</title>
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/>
|
||||||
<!-- Bootstrap CSS -->
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
|
<link rel="stylesheet" href="style.css?t=4" />
|
||||||
<!-- Custom styles for this template -->
|
|
||||||
<link href="installer.css?t=1" rel="stylesheet">
|
|
||||||
</head>
|
</head>
|
||||||
<body id="install" class="text-center">
|
<body id="install" class="text-center">
|
||||||
<div class="container-fluid">
|
<div class="main">
|
||||||
<div class="col-md-12">
|
<div id="myAppsContainer">
|
||||||
<h1><?php echo $header_text?></h1>
|
<div class="logo" style="margin-top:100px">
|
||||||
<div id="redis"></div>
|
<img src="/img/logo.png" alt="Safebox"/>
|
||||||
<div id="response"></div>
|
<span>Safebox</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="progress-box">
|
||||||
|
<div class="progress-title"><?php echo $header_text?></div>
|
||||||
|
<div class="progress-description" id="info"></div>
|
||||||
|
<div class="progress-container-shadow">
|
||||||
|
</div>
|
||||||
|
<div class="progress-container">
|
||||||
|
<div class="progress-bar" id="progressBar"></div>
|
||||||
|
<div class="progress-text" id="progressText">0%</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<!-- Optional JavaScript -->
|
<!-- Optional JavaScript -->
|
||||||
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
|
||||||
|
<script src="install.js?t=6"></script>
|
||||||
<script>
|
<script>
|
||||||
$(function() {
|
const progressBar = document.getElementById('progressBar');
|
||||||
|
const progressText = document.getElementById('progressText');
|
||||||
|
let currentProgress = 0;
|
||||||
|
let progressInterval;
|
||||||
|
let install = 1;
|
||||||
|
|
||||||
function redirectToManage() {
|
// Initialize
|
||||||
window.location.href = 'manage.html';
|
updateProgress(0);
|
||||||
}
|
startProgress();
|
||||||
|
|
||||||
function check_install() {
|
check_interface();
|
||||||
|
counter=0;
|
||||||
var url = 'scan.php?op=check_install&key=<?php echo $key;?>';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_install:'+data+' counter: '+counter);
|
|
||||||
if (data=='INSTALLED') {
|
|
||||||
redirectToManage();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
counter+=1
|
|
||||||
$("#response").html('Please wait... ' + counter);
|
|
||||||
setTimeout(check_install, 1000);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_redis() {
|
|
||||||
|
|
||||||
var url = 'scan.php?op=redis';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_redis: '+data);
|
|
||||||
if (data=='OK') {
|
|
||||||
$("#redis").html('Redis server - OK');
|
|
||||||
check_install();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#redis").html('Redis server is not available...');
|
|
||||||
setTimeout(check_redis, 1000);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_directory() {
|
|
||||||
|
|
||||||
var url = 'scan.php?op=directory';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_directory: '+data);
|
|
||||||
if (data=='OK') {
|
|
||||||
$("#redis").html('Connection is ready - OK');
|
|
||||||
check_install();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#redis").html('Shared directory is not available...');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_interface() {
|
|
||||||
|
|
||||||
var url = 'scan.php?op=get_interface';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_interface: '+data);
|
|
||||||
if (data=='redis') {
|
|
||||||
check_redis();
|
|
||||||
}
|
|
||||||
else if (data=='directory') {
|
|
||||||
check_directory();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#redis").html('Invalid interface definition...');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
check_interface();
|
|
||||||
counter=0;
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
684
manage.html
@@ -4,630 +4,9 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<title>Safebox</title>
|
<title>Safebox</title>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/>
|
||||||
<style>
|
|
||||||
:root {
|
|
||||||
--highlight-color: #F9DB54;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
font-family: 'Switzer', sans-serif;
|
|
||||||
font-weight: 500;
|
|
||||||
font-size: 16px;
|
|
||||||
background-color: #000;
|
|
||||||
color: white;
|
|
||||||
display: flex;
|
|
||||||
height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {border: 1px solid var(--highlight-color); width:100%;}
|
|
||||||
table th {padding-left: 20px; text-align: left; color: var(--highlight-color); width: 25%;}
|
|
||||||
table td {padding-left: 20px; text-align:left; width: 25%;}
|
|
||||||
|
|
||||||
.sidebar {
|
|
||||||
width: 250px;
|
|
||||||
background-color: #101214;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 20px 0;
|
|
||||||
margin: 20px;
|
|
||||||
border-radius: 20px;
|
|
||||||
transition: width 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 40px;
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: bold;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo img {
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 5px;
|
|
||||||
padding: 0 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vpn-item {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 10px;
|
|
||||||
padding: 10px 20px;
|
|
||||||
cursor: pointer;
|
|
||||||
color: white;
|
|
||||||
transition: color 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 10px;
|
|
||||||
padding: 10px 20px;
|
|
||||||
cursor: pointer;
|
|
||||||
color: white;
|
|
||||||
transition: color 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item:hover {
|
|
||||||
color: var(--highlight-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item i {
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item span {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item img {
|
|
||||||
width: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item.active {
|
|
||||||
background-color: var(--highlight-color);
|
|
||||||
color: black;
|
|
||||||
border-radius: 10px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item.active:hover {
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Switch container */
|
|
||||||
.switch {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
width: 60px;
|
|
||||||
height: 26px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hide native checkbox */
|
|
||||||
.switch input {
|
|
||||||
opacity: 0;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Slider background */
|
|
||||||
.slider-text {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
background-color: #ccc;
|
|
||||||
border-radius: 26px;
|
|
||||||
transition: background-color 0.3s;
|
|
||||||
display: flex !important;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-end; /* default: OFF on the right */
|
|
||||||
padding: 0 8px;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Circle */
|
|
||||||
.slider-text::before {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
height: 22px;
|
|
||||||
width: 22px;
|
|
||||||
left: 2px;
|
|
||||||
top: 2px;
|
|
||||||
background-color: white;
|
|
||||||
border-radius: 50%;
|
|
||||||
transition: transform 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Checked: move dot, change background and text alignment */
|
|
||||||
.switch input:checked + .slider-text {
|
|
||||||
background-color: #4CAF50;
|
|
||||||
justify-content: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dot animation */
|
|
||||||
.switch input:checked + .slider-text::before {
|
|
||||||
transform: translateX(34px);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Status label */
|
|
||||||
.status-label {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #888;
|
|
||||||
min-width: 28px;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.details {
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.yellow-row {
|
|
||||||
max-width:250px;
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin: 0px;
|
|
||||||
width: 100%;
|
|
||||||
padding: 0 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.yellow-box {
|
|
||||||
background-color: var(--highlight-color);
|
|
||||||
color: black;
|
|
||||||
text-align: left;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 10px 18px;
|
|
||||||
border-radius: 20px 20px 0px 20px;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.yellow-corner {
|
|
||||||
padding:0px;
|
|
||||||
border: 0px;
|
|
||||||
display: flex;
|
|
||||||
margin: 0px;
|
|
||||||
margin-top: auto;
|
|
||||||
align-items: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main {
|
|
||||||
flex: 1;
|
|
||||||
padding: 30px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
#appsContainer {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 16px;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app {
|
|
||||||
border: 1px solid #41464f;
|
|
||||||
border-radius: 15px;
|
|
||||||
text-align: left;
|
|
||||||
padding: 20px;
|
|
||||||
width: 130px;
|
|
||||||
min-height: 200px;
|
|
||||||
text-align: left;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-img {
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app img {
|
|
||||||
border-radius: 15px;
|
|
||||||
background-color: #101214;
|
|
||||||
width: 70px;
|
|
||||||
height: 70px;
|
|
||||||
object-fit: contain;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
padding: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-label {
|
|
||||||
font-size: 10px;
|
|
||||||
color: #cccccc;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
align-items: left;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-name {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.more-btn {
|
|
||||||
background-color: inherit;
|
|
||||||
color: #cccccc;
|
|
||||||
border: 1px solid #cccccc;
|
|
||||||
border-radius: 15px;
|
|
||||||
padding: 18px;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 400;
|
|
||||||
cursor: pointer;
|
|
||||||
width: 100%;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.more-btn:hover {
|
|
||||||
color: var(--highlight-color);
|
|
||||||
border: 1px solid var(--highlight-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-details {
|
|
||||||
padding: 0px 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-fields {
|
|
||||||
border: 1px solid #41464f;
|
|
||||||
border-radius: 15px;
|
|
||||||
text-align: left;
|
|
||||||
padding: 20px;
|
|
||||||
margin: 30px 0px 10px 0px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-fields .row {
|
|
||||||
display: block;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
padding: 5px 20px;
|
|
||||||
border-radius: 10px;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#letsencrypt {
|
|
||||||
padding-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-block {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-start;
|
|
||||||
padding: 20px 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-and-text {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
gap: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.applogo img {
|
|
||||||
border-radius: 15px;
|
|
||||||
background-color: #101214;
|
|
||||||
width: 70px;
|
|
||||||
height: 70px;
|
|
||||||
object-fit: contain;
|
|
||||||
padding: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 26px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.subtitle {
|
|
||||||
font-size: 16px;
|
|
||||||
margin: 4px 0;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description {
|
|
||||||
font-size: 14px;
|
|
||||||
margin: 20px 0 0;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification-btn {
|
|
||||||
background-color: var(--highlight-color);
|
|
||||||
color: black;
|
|
||||||
border: none;
|
|
||||||
padding: 10px 20px;
|
|
||||||
border-radius: 10px;
|
|
||||||
cursor: pointer;
|
|
||||||
font-weight: bold;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-header h1 {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-header button {
|
|
||||||
background-color: var(--highlight-color);
|
|
||||||
color: black;
|
|
||||||
border: none;
|
|
||||||
padding: 10px 20px;
|
|
||||||
border-radius: 10px;
|
|
||||||
cursor: pointer;
|
|
||||||
font-weight: bold;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-row, .input-group {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
border: 1px solid #41464f;
|
|
||||||
padding: 15px 20px;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
border-radius: 10px;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-container {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 5px;
|
|
||||||
flex: 1;
|
|
||||||
justify-content: flex-end;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-row input,
|
|
||||||
.input-row select,
|
|
||||||
.row input,
|
|
||||||
.row select {
|
|
||||||
background: transparent;
|
|
||||||
border: 1px solid #41464f;
|
|
||||||
padding: 8px 30px 8px 8px;
|
|
||||||
border-radius: 10px;
|
|
||||||
color: white;
|
|
||||||
transition: color 0.2s;
|
|
||||||
max-width: 40%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.row input,
|
|
||||||
.row select {
|
|
||||||
padding: 12px 30px 12px 12px;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-row input:focus,
|
|
||||||
.input-row select:focus,
|
|
||||||
.row input,
|
|
||||||
.row select {
|
|
||||||
outline: none;
|
|
||||||
background-color: black;
|
|
||||||
color: var(--highlight-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-row select,
|
|
||||||
.row select {
|
|
||||||
appearance: none;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
-moz-appearance: none;
|
|
||||||
background-image: url('data:image/svg+xml;utf8,<svg fill="white" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7 10l5-5 5 5zM7 14l5 5 5-5z"/></svg>');
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: right 8px center;
|
|
||||||
background-size: 16px;
|
|
||||||
padding-right: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-container {
|
|
||||||
position: relative;
|
|
||||||
left: -18px;
|
|
||||||
top: -22px;
|
|
||||||
display: inline-block;
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
margin: 0px;
|
|
||||||
width: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-icon {
|
|
||||||
background-color: var(--highlight-color);
|
|
||||||
color: black;
|
|
||||||
border-radius: 50%;
|
|
||||||
padding: 1px 4px;
|
|
||||||
cursor: pointer;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 10px;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 1;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltip {
|
|
||||||
visibility: hidden;
|
|
||||||
background-color: #333;
|
|
||||||
border-radius: 5px;
|
|
||||||
padding: 4px 8px;
|
|
||||||
position: absolute;
|
|
||||||
z-index: 1;
|
|
||||||
bottom: 100%; /* above the icon */
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-78%);
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity 0.3s;
|
|
||||||
/*white-space: nowrap;*/
|
|
||||||
text-align: right;
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltip::after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
top: 100%; /* bottom of tooltip */
|
|
||||||
left: 80%;
|
|
||||||
margin-left: -5px;
|
|
||||||
border-width: 5px;
|
|
||||||
border-style: solid;
|
|
||||||
border-color: #333 transparent transparent transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-container:hover .tooltip {
|
|
||||||
visibility: visible;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clear-btn {
|
|
||||||
position: absolute;
|
|
||||||
right: 8px;
|
|
||||||
background: transparent;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: 16px;
|
|
||||||
padding: 0;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
text-align: center;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.save-button {
|
|
||||||
background-color: var(--highlight-color);
|
|
||||||
color: black;
|
|
||||||
border: none;
|
|
||||||
padding: 15px 30px;
|
|
||||||
font-size: 16px;
|
|
||||||
border-radius: 10px;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-top: 30px;
|
|
||||||
align-self: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.save-button:hover {
|
|
||||||
background-color: #f5c300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons .btn {
|
|
||||||
background-color: black;
|
|
||||||
border: 1px solid #999;
|
|
||||||
color: #999;
|
|
||||||
padding: 10px 15px;
|
|
||||||
font-size: 14px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-top: 10px;
|
|
||||||
align-self: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons .btn:hover {
|
|
||||||
border: 1px solid #f5c300;
|
|
||||||
color: #f5c300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hidden {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup-content {
|
|
||||||
width: 100%;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
#popup .row {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
.sidebar {
|
|
||||||
width: 80px;
|
|
||||||
padding: 20px 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
font-size: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo span {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item {
|
|
||||||
justify-content: center;
|
|
||||||
gap: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-item span {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.yellow-box {
|
|
||||||
font-size: 0;
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-row {
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-container {
|
|
||||||
width: 100%;
|
|
||||||
justify-content: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-row input,
|
|
||||||
.input-row select {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/>
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/>
|
||||||
|
<link rel="stylesheet" href="style.css?t=1" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
@@ -654,11 +33,16 @@
|
|||||||
<div class="menu-item"><i class="fas fa-chart-line"></i><span>Monitor</span></div>
|
<div class="menu-item"><i class="fas fa-chart-line"></i><span>Monitor</span></div>
|
||||||
<div class="menu-item active"><i class="fas fa-cog"></i><span>Settings</span></div>
|
<div class="menu-item active"><i class="fas fa-cog"></i><span>Settings</span></div>
|
||||||
-->
|
-->
|
||||||
<div class="menu-item" id="installAppsBtn"><img src="/img/app.png" data-src="/img/app.png" data-hover="/img/app2.png" alt="Applications" /><span>Applications</span></div>
|
<div class="menu-item" id="installAppsBtn"><img src="/img/apps1.svg" data-src="/img/apps1.svg" data-hover="/img/apps2.svg" alt="Applications" /><span>Applications</span></div>
|
||||||
<div class="menu-item" id="backupBtn"><img src="/img/disk.png" data-src="/img/disk.png" data-hover="/img/disk2.png" alt="Backup" /><span>Backup</span></div>
|
<div class="menu-item" id="backupBtn"><img src="/img/backup1.svg" data-src="/img/backup1.svg" data-hover="/img/backup2.svg" alt="Backup" /><span>Backup</span></div>
|
||||||
<div class="menu-item" id="diskBtn"><img src="/img/disk.png" data-src="/img/disk.png" data-hover="/img/disk2.png" alt="Disk Management" /><span>Disk Management</span></div>
|
<div class="menu-item" id="diskBtn"><img src="/img/disk1.svg" data-src="/img/disk1.svg" data-hover="/img/disk2.svg" alt="Disk Management" /><span>Disk Management</span></div>
|
||||||
<div class="menu-item" id="monitorBtn"><img src="/img/monitor.png" data-src="/img/monitor.png" data-hover="/img/monitor2.png" alt="Monitor" /><span>Monitor</span></div>
|
<div class="menu-item" id="monitorBtn"><img src="/img/monitor1.svg" data-src="/img/monitor1.svg" data-hover="/img/monitor2.svg" alt="Monitor" /><span>Monitor</span></div>
|
||||||
<div class="menu-item" id="settingsBtn"><img src="/img/settings.png" data-src="/img/settings.png" data-hover="/img/settings2.png" alt="Settings" /><span>Settings</span></div>
|
<div class="menu-item has-submenu" id="settingsBtn"><img src="/img/settings1.svg" data-src="/img/settings1.svg" data-hover="/img/settings2.svg" alt="Settings" /><span>Settings</span><span class="arrow">▾</span></div>
|
||||||
|
<div class="submenu" id="settingsSubmenu">
|
||||||
|
<div id="servicesBtn" class="submenu-item">Services</div>
|
||||||
|
<div id="repositoriesBtn" class="submenu-item">Repositories</div>
|
||||||
|
<div id="systemservicesBtn" class="submenu-item">System services</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="yellow-row">
|
<div class="yellow-row">
|
||||||
@@ -684,6 +68,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="main" >
|
<div class="main" >
|
||||||
<div id="myAppsContainer">
|
<div id="myAppsContainer">
|
||||||
|
Loading applications. Please wait...
|
||||||
</div>
|
</div>
|
||||||
<div id="popup" class="popup hidden">
|
<div id="popup" class="popup hidden">
|
||||||
<div class="popup-content">
|
<div class="popup-content">
|
||||||
@@ -698,18 +83,7 @@
|
|||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
document.querySelectorAll('.menu-item.active').forEach(item => {
|
updateActive();
|
||||||
const img = item.querySelector('img');
|
|
||||||
img.src = img.dataset.hover;
|
|
||||||
/*
|
|
||||||
item.addEventListener('mouseenter', () => {
|
|
||||||
img.src = img.dataset.hover;
|
|
||||||
});
|
|
||||||
item.addEventListener('mouseleave', () => {
|
|
||||||
img.src = img.dataset.src;
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
});
|
|
||||||
|
|
||||||
const myAppsBtn = document.getElementById('myAppsBtn');
|
const myAppsBtn = document.getElementById('myAppsBtn');
|
||||||
const installAppsBtn = document.getElementById('installAppsBtn');
|
const installAppsBtn = document.getElementById('installAppsBtn');
|
||||||
@@ -725,6 +99,18 @@
|
|||||||
const popupText = document.getElementById('popupText');
|
const popupText = document.getElementById('popupText');
|
||||||
const closeBtn = document.querySelector('.close');
|
const closeBtn = document.querySelector('.close');
|
||||||
|
|
||||||
|
|
||||||
|
function updateActive() {
|
||||||
|
document.querySelectorAll('.menu-item').forEach(item => {
|
||||||
|
const img = item.querySelector('img');
|
||||||
|
img.src = img.dataset.src;
|
||||||
|
});
|
||||||
|
document.querySelectorAll('.menu-item.active').forEach(item => {
|
||||||
|
const img = item.querySelector('img');
|
||||||
|
img.src = img.dataset.hover;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//Appok betöltése
|
//Appok betöltése
|
||||||
function renderApps(all) {
|
function renderApps(all) {
|
||||||
myAppsContainer.classList.remove('hidden');
|
myAppsContainer.classList.remove('hidden');
|
||||||
@@ -743,7 +129,7 @@
|
|||||||
else more = 'More';
|
else more = 'More';
|
||||||
appDiv.innerHTML = `
|
appDiv.innerHTML = `
|
||||||
<div class="app-img"><img src="${app.image}" alt="${app.name}" title="${app.orig_name} ${app.version}"></div>
|
<div class="app-img"><img src="${app.image}" alt="${app.name}" title="${app.orig_name} ${app.version}"></div>
|
||||||
<div class="app-label">${app.name} ${app.version}</div>
|
<div class="app-label">${app.subtitle}</div>
|
||||||
<div class="app-name">${app.orig_name}</div>
|
<div class="app-name">${app.orig_name}</div>
|
||||||
<button class="more-btn">${more}</button>
|
<button class="more-btn">${more}</button>
|
||||||
`;
|
`;
|
||||||
@@ -842,6 +228,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function renderSettings() {
|
function renderSettings() {
|
||||||
|
|
||||||
|
const submenu = document.getElementById("settingsSubmenu");
|
||||||
|
const isVisible = submenu.style.display === "flex";
|
||||||
|
|
||||||
|
submenu.style.display = isVisible ? "none" : "flex";
|
||||||
|
settingsBtn.classList.toggle("open", !isVisible);
|
||||||
|
|
||||||
myAppsContainer.classList.remove('hidden');
|
myAppsContainer.classList.remove('hidden');
|
||||||
popup.classList.add('hidden');
|
popup.classList.add('hidden');
|
||||||
|
|
||||||
@@ -850,11 +243,6 @@
|
|||||||
<h1>Settings</h1>
|
<h1>Settings</h1>
|
||||||
<button id="updatesBtn"><i class="fas fa-bell"></i> Notification</button>
|
<button id="updatesBtn"><i class="fas fa-bell"></i> Notification</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-row">
|
|
||||||
<button id="servicesBtn" class="save-button">Services</button>
|
|
||||||
<button id="repositoriesBtn" class="save-button">Repositories</button>
|
|
||||||
<button id="systemservicesBtn" class="save-button">System services</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="input-row">
|
<div class="input-row">
|
||||||
<label>Docker registry name</label>
|
<label>Docker registry name</label>
|
||||||
@@ -940,6 +328,8 @@
|
|||||||
monitorBtn.classList.remove('active');
|
monitorBtn.classList.remove('active');
|
||||||
settingsBtn.classList.remove('active');
|
settingsBtn.classList.remove('active');
|
||||||
btn.classList.add('active');
|
btn.classList.add('active');
|
||||||
|
|
||||||
|
updateActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
//myAppsBtn.addEventListener('click', () => {renderApps(false); activate(myAppsBtn);});
|
//myAppsBtn.addEventListener('click', () => {renderApps(false); activate(myAppsBtn);});
|
||||||
@@ -973,7 +363,7 @@
|
|||||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
|
||||||
<script src="common.js?t=12"></script>
|
<script src="common.js?t=30"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
219
scan.html
@@ -1,198 +1,53 @@
|
|||||||
<!doctype html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- Required meta tags -->
|
<meta charset="UTF-8" />
|
||||||
<meta charset="utf-8">
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<title>Safebox - INSTALLER TOOL</title>
|
||||||
<title>INSTALLER TOOL</title>
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/>
|
||||||
<!-- Bootstrap CSS -->
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
|
<link rel="stylesheet" href="style.css?t=4" />
|
||||||
<!-- Custom styles for this template -->
|
|
||||||
<link href="installer.css?t=1" rel="stylesheet">
|
|
||||||
</head>
|
</head>
|
||||||
<body id="scan" class="text-center">
|
<body id="scan" class="text-center">
|
||||||
<div class="container-fluid">
|
<div class="main">
|
||||||
<div class="col-md-12">
|
<div id="myAppsContainer">
|
||||||
<h1>Scanning your device for any previous installed versions</h1>
|
<div class="logo" style="margin-top:100px">
|
||||||
<div class="row d-flex justify-content-center mt-100">
|
<img src="/img/logo.png" alt="Safebox"/>
|
||||||
<div class="progress blue" data-value="100">
|
<span>Safebox</span>
|
||||||
<span class="progress-left">
|
|
||||||
<span class="progress-bar"></span>
|
|
||||||
</span>
|
|
||||||
<span class="progress-right">
|
|
||||||
<span class="progress-bar"></span>
|
|
||||||
</span>
|
|
||||||
<div class="progress-value"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div><a href="install.html" class="stop">STOP AND START INSTALL</a></div>
|
<div class="progress-box">
|
||||||
<br>
|
<div class="progress-title">Scanning your device</div>
|
||||||
<br>
|
<div class="progress-description" id="info">Looking for any previously installed version</div>
|
||||||
<div id="redis"></div>
|
<div class="progress-container-shadow">
|
||||||
<div id="previous"></div>
|
</div>
|
||||||
</div>
|
<div class="progress-container">
|
||||||
</div>
|
<div class="progress-bar" id="progressBar"></div>
|
||||||
|
<div class="progress-text" id="progressText">0%</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="controls">
|
||||||
|
<button onclick="document.location='install.html'" class="save-button">STOP AND START INSTALL</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<!-- Optional JavaScript -->
|
<!-- Optional JavaScript -->
|
||||||
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
|
||||||
|
<script src="install.js?t=6"></script>
|
||||||
<script>
|
<script>
|
||||||
$(function() {
|
const progressBar = document.getElementById('progressBar');
|
||||||
|
const progressText = document.getElementById('progressText');
|
||||||
|
let currentProgress = 0;
|
||||||
|
let progressInterval;
|
||||||
|
let install = 0; // scan
|
||||||
|
|
||||||
function redirectToInstall() {
|
// Initialize
|
||||||
window.location.href = 'install.html';
|
updateProgress(0);
|
||||||
}
|
startProgress();
|
||||||
|
|
||||||
function redirectToManage() {
|
check_interface();
|
||||||
window.location.href = 'manage.html';
|
|
||||||
}
|
|
||||||
|
|
||||||
function start_system() {
|
|
||||||
var url = 'scan.php?op=system';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('start_system: '+data);
|
|
||||||
if (data=='OK') {
|
|
||||||
$("#previous").html('Scanning for previous install. Please wait...');
|
|
||||||
check_system();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#previous").html('Scanning for previous install has aborted...');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_system() {
|
|
||||||
var url = 'scan.php?op=check_system';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_system: '+data);
|
|
||||||
if (data=='NEW') {
|
|
||||||
$("#previous").html('No previous install has found...');
|
|
||||||
setTimeout(redirectToInstall, 3000);
|
|
||||||
}
|
|
||||||
else if (data=='EXISTS') {
|
|
||||||
$("#previous").html('Previous install has found...');
|
|
||||||
setTimeout(redirectToManage, 3000);
|
|
||||||
}
|
|
||||||
else if (data=='WAIT') {
|
|
||||||
setTimeout(check_system, 1000);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// UNEXPECTED ERROR
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_redis() {
|
|
||||||
|
|
||||||
var url = 'scan.php?op=redis';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_redis: '+data);
|
|
||||||
if (data=='OK') {
|
|
||||||
$("#redis").html('Redis server - OK');
|
|
||||||
start_system();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#redis").html('Redis server is not available...');
|
|
||||||
setTimeout(check_redis, 1000);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_directory() {
|
|
||||||
|
|
||||||
var url = 'scan.php?op=directory';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_directory: '+data);
|
|
||||||
if (data=='OK') {
|
|
||||||
$("#redis").html('Connection is ready - OK');
|
|
||||||
start_system();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#redis").html('Shared directory is not available...');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_interface() {
|
|
||||||
|
|
||||||
var url = 'scan.php?op=get_interface';
|
|
||||||
$.get(url, function(data){
|
|
||||||
console.log('check_interface: '+data);
|
|
||||||
if (data=='redis') {
|
|
||||||
check_redis();
|
|
||||||
}
|
|
||||||
else if (data=='directory') {
|
|
||||||
check_directory();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#redis").html('Invalid interface definition...');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
check_interface();
|
|
||||||
|
|
||||||
//setTimeout(redirectToManage, 10000);
|
|
||||||
|
|
||||||
$(".progress").each(function() {
|
|
||||||
|
|
||||||
var value = $(this).attr('data-value');
|
|
||||||
var left = $(this).find('.progress-left .progress-bar');
|
|
||||||
var right = $(this).find('.progress-right .progress-bar');
|
|
||||||
|
|
||||||
if (value > 0) {
|
|
||||||
/*
|
|
||||||
angle1 = getRotationDegrees(right);
|
|
||||||
angle2 = getRotationDegrees(left);
|
|
||||||
console.log(angle1);
|
|
||||||
console.log(angle2);
|
|
||||||
idx=1
|
|
||||||
while (idx < 50) {
|
|
||||||
angle1 = getRotationDegrees(right);
|
|
||||||
angle2 = getRotationDegrees(left);
|
|
||||||
console.log(angle1);
|
|
||||||
console.log(angle2);
|
|
||||||
$('div.progress-value').html(angle2);
|
|
||||||
idx++;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
if (value <= 50) {
|
|
||||||
right.css('transform', 'rotate(' + percentageToDegrees(value) + 'deg)')
|
|
||||||
} else {
|
|
||||||
right.css('transform', 'rotate(180deg)')
|
|
||||||
left.css('transform', 'rotate(' + percentageToDegrees(value - 50) + 'deg)')
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
function percentageToDegrees(percentage) {
|
|
||||||
return percentage / 100 * 360
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns rotation in degrees when obtaining transform-styles using javascript
|
|
||||||
* http://stackoverflow.com/questions/8270612/get-element-moz-transformrotate-value-in-jquery
|
|
||||||
*/
|
|
||||||
function getRotationDegrees(obj) {
|
|
||||||
var matrix = obj.css("-webkit-transform") ||
|
|
||||||
obj.css("-moz-transform") ||
|
|
||||||
obj.css("-ms-transform") ||
|
|
||||||
obj.css("-o-transform") ||
|
|
||||||
obj.css("transform");
|
|
||||||
if(matrix !== 'none') {
|
|
||||||
var values = matrix.split('(')[1].split(')')[0].split(',');
|
|
||||||
var a = values[0];
|
|
||||||
var b = values[1];
|
|
||||||
var angle = Math.round(Math.atan2(b, a) * (180/Math.PI));
|
|
||||||
} else { var angle = 0; }
|
|
||||||
return angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
69
scan.php
@@ -146,12 +146,14 @@ switch ($_GET["op"]) {
|
|||||||
$orig_service_name = $service_name;
|
$orig_service_name = $service_name;
|
||||||
$service_name = strtolower($service_name);
|
$service_name = strtolower($service_name);
|
||||||
$version = $content["version"];
|
$version = $content["version"];
|
||||||
|
$subtitle = $content["subtitle"];
|
||||||
|
if (empty($subtitle) || $subtitle == "null") $subtitle = "";
|
||||||
$icon = $content["icon"];
|
$icon = $content["icon"];
|
||||||
if (empty($icon) || $icon == "null") $icon = "img/default_logo.png"; // default icon image
|
if (empty($icon) || $icon == "null") $icon = "img/default_logo.png"; // default icon image
|
||||||
if (array_key_exists($service_name,$data["INSTALLED_SERVICES"])) $installed = "true";
|
if (array_key_exists($service_name,$data["INSTALLED_SERVICES"])) $installed = "true";
|
||||||
else $installed = "false";
|
else $installed = "false";
|
||||||
if (!empty($deployments)) $deployments .= ", ";
|
if (!empty($deployments)) $deployments .= ", ";
|
||||||
$deployments .= '{"name": "'.$service_name.'", "orig_name": "'.$orig_service_name.'", "image": "'.$icon.'", "version": "'.$version.'", "installed": "'.$installed.'"}';
|
$deployments .= '{"name": "'.$service_name.'", "orig_name": "'.$orig_service_name.'", "image": "'.$icon.'", "version": "'.$version.'", "subtitle": "'.$subtitle.'", "installed": "'.$installed.'"}';
|
||||||
}
|
}
|
||||||
if (!empty($deployments)) $deployments = "[{$deployments}]";
|
if (!empty($deployments)) $deployments = "[{$deployments}]";
|
||||||
}
|
}
|
||||||
@@ -180,6 +182,7 @@ switch ($_GET["op"]) {
|
|||||||
if ($key=="deployment") {
|
if ($key=="deployment") {
|
||||||
if ($data["STATUS"]=="0") { // ask
|
if ($data["STATUS"]=="0") { // ask
|
||||||
$template = json_decode(base64_decode($data["TEMPLATE"]));
|
$template = json_decode(base64_decode($data["TEMPLATE"]));
|
||||||
|
$template->name = strtolower($template->name);
|
||||||
|
|
||||||
echo '
|
echo '
|
||||||
<div class="app-details">
|
<div class="app-details">
|
||||||
@@ -189,8 +192,8 @@ switch ($_GET["op"]) {
|
|||||||
<img src="'.$template->icon.'">
|
<img src="'.$template->icon.'">
|
||||||
</div>
|
</div>
|
||||||
<div class="text-content">
|
<div class="text-content">
|
||||||
<h1 class="title">'.$template->name.'</h1>
|
<h1 class="title">'.$template->title.'</h1>
|
||||||
<h2 class="subtitle">'.$template->title.'</h2>
|
<h2 class="subtitle">'.$template->subtitle.'</h2>
|
||||||
<p class="description">'.$template->description.'</p>
|
<p class="description">'.$template->description.'</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -201,7 +204,7 @@ switch ($_GET["op"]) {
|
|||||||
echo '<div id="letsencrypt">';
|
echo '<div id="letsencrypt">';
|
||||||
//var_dump($template);
|
//var_dump($template);
|
||||||
$letsencrypt = check_letsencrypt();
|
$letsencrypt = check_letsencrypt();
|
||||||
if (empty($letsencrypt)) echo "LETSENCRYPT file doesn't exists...<br><br>";
|
if (empty($letsencrypt)) echo ""; //echo "LETSENCRYPT file doesn't exists...<br><br>";
|
||||||
elseif ($letsencrypt=="ERROR") echo "LETSENCRYPT file: read JSON error...<br><br>";
|
elseif ($letsencrypt=="ERROR") echo "LETSENCRYPT file: read JSON error...<br><br>";
|
||||||
else {
|
else {
|
||||||
$domain = "";
|
$domain = "";
|
||||||
@@ -212,9 +215,11 @@ switch ($_GET["op"]) {
|
|||||||
}
|
}
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
}
|
}
|
||||||
|
$more = 0;
|
||||||
echo "<form action=\"#\" method=\"post\" id=\"deploy_{$template->name}_form\">";
|
echo "<form action=\"#\" method=\"post\" id=\"deploy_{$template->name}_form\">";
|
||||||
echo "<div class=\"app-fields\">";
|
echo "<div class=\"app-fields\">";
|
||||||
foreach ($template->fields as $field) {
|
foreach ($template->fields as $field) {
|
||||||
|
if ($field->advanced) $more = 1;
|
||||||
echo "<div class=\"app-field ".($field->advanced ? "advanced" : "")."\">";
|
echo "<div class=\"app-field ".($field->advanced ? "advanced" : "")."\">";
|
||||||
if (!empty($field->title)) echo "<div class=\"row\"><h3>".$field->title."</h3></div>";
|
if (!empty($field->title)) echo "<div class=\"row\"><h3>".$field->title."</h3></div>";
|
||||||
if (isset($field->generated)) {
|
if (isset($field->generated)) {
|
||||||
@@ -239,27 +244,29 @@ switch ($_GET["op"]) {
|
|||||||
echo "</div>";
|
echo "</div>";
|
||||||
|
|
||||||
echo "<div class=\"row buttons\">";
|
echo "<div class=\"row buttons\">";
|
||||||
echo "
|
if ($more) {
|
||||||
<div class=\"mb-3\">
|
echo "
|
||||||
<button class=\"btn btn-lg btn-primary btn-block\" type=\"button\" id=\"more_{$template->name}_btn\">More</button>
|
<div class=\"mb-3\" style=\"margin-right:30px;\">
|
||||||
</div>";
|
<button class=\"btn btn-lg btn-primary btn-block\" type=\"button\" id=\"more_{$template->name}_btn\">More</button>
|
||||||
|
</div>";
|
||||||
|
}
|
||||||
if ($reinstall) {
|
if ($reinstall) {
|
||||||
echo "
|
echo "
|
||||||
<div class=\"mb-3\" style=\"margin-left:30px;\">
|
<div class=\"mb-3\" style=\"margin-right:30px;\">
|
||||||
<button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\" id=\"update_{$template->name}_btn\" onclick=\"update_deployment('{$template->name}')\">Update</button>
|
<button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\" id=\"update_{$template->name}_btn\" onclick=\"update_deployment('{$template->name}')\">Update</button>
|
||||||
</div>";
|
</div>";
|
||||||
}
|
}
|
||||||
echo "
|
echo "
|
||||||
<div class=\"mb-3\" style=\"margin-left:30px;\">
|
<div class=\"mb-3\" style=\"margin-right:30px;\">
|
||||||
<button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\" id=\"deploy_{$template->name}_btn\">".($reinstall ? "Reinstall" : "Install")."</button>
|
<button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\" id=\"deploy_{$template->name}_btn\">".($reinstall ? "Reinstall" : "Install")."</button>
|
||||||
</div>";
|
</div>";
|
||||||
if ($reinstall) {
|
if ($reinstall) {
|
||||||
echo "
|
echo "
|
||||||
<div class=\"mb-3\" style=\"margin-left:30px;\">
|
<div class=\"mb-3\" style=\"margin-right:30px;\">
|
||||||
<button class=\"btn btn-lg btn-primary btn-block\" type=\"button\" id=\"uninstall_{$template->name}_btn\" onclick=\"uninstall('{$template->name}')\">Uninstall</button>
|
<button class=\"btn btn-lg btn-primary btn-block\" type=\"button\" id=\"uninstall_{$template->name}_btn\" onclick=\"uninstall('{$template->name}')\">Uninstall</button>
|
||||||
</div>";
|
</div>";
|
||||||
}
|
}
|
||||||
echo "<div class=\"mb-3\" style=\"margin-left:230px;float:\">
|
echo "<div class=\"mb-3\" style=\"margin-left:200px;float:\">
|
||||||
<button class=\"btn btn-lg btn-primary btn-block\" type=\"button\" id=\"cancel_{$template->name}_btn\">Cancel</button>
|
<button class=\"btn btn-lg btn-primary btn-block\" type=\"button\" id=\"cancel_{$template->name}_btn\">Cancel</button>
|
||||||
</div>"; // buttons
|
</div>"; // buttons
|
||||||
echo "
|
echo "
|
||||||
@@ -271,6 +278,8 @@ switch ($_GET["op"]) {
|
|||||||
jQuery(this).hide();
|
jQuery(this).hide();
|
||||||
});
|
});
|
||||||
jQuery('#more_{$template->name}_btn').click(function() {
|
jQuery('#more_{$template->name}_btn').click(function() {
|
||||||
|
currentText = jQuery(this).text();
|
||||||
|
jQuery(this).text(currentText === 'More' ? 'Less' : 'More');
|
||||||
jQuery('.advanced').each(function() {
|
jQuery('.advanced').each(function() {
|
||||||
jQuery(this).toggle();
|
jQuery(this).toggle();
|
||||||
});
|
});
|
||||||
@@ -326,7 +335,7 @@ switch ($_GET["op"]) {
|
|||||||
case "check_letsencrypt":
|
case "check_letsencrypt":
|
||||||
$domain = $_GET["domain"];
|
$domain = $_GET["domain"];
|
||||||
$letsencrypt = check_letsencrypt();
|
$letsencrypt = check_letsencrypt();
|
||||||
if (empty($letsencrypt)) echo "LETSENCRYPT file doesn't exists...";
|
if (empty($letsencrypt)) echo ""; //echo "LETSENCRYPT file doesn't exists...";
|
||||||
elseif ($letsencrypt=="ERROR") echo "LETSENCRYPT file: read JSON error...";
|
elseif ($letsencrypt=="ERROR") echo "LETSENCRYPT file: read JSON error...";
|
||||||
else {
|
else {
|
||||||
show_letsencrypt($letsencrypt, $domain);
|
show_letsencrypt($letsencrypt, $domain);
|
||||||
@@ -517,21 +526,29 @@ switch ($_GET["op"]) {
|
|||||||
else echo "ERROR";
|
else echo "ERROR";
|
||||||
break;
|
break;
|
||||||
case "check_vpn":
|
case "check_vpn":
|
||||||
$key = "check_vpn";
|
$arr = check_response("save_vpn");
|
||||||
$arr = array("STATUS" => 0);
|
if (!empty($arr)) {
|
||||||
$json = json_encode($arr, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);
|
$data = $arr["save_vpn"];
|
||||||
set_output($key,$json);
|
echo $data["STATUS"];
|
||||||
sleep(1);
|
if ($data["STATUS"]=="1") remove_response("save_vpn"); // vpn start has finished
|
||||||
$arr = check_response($key);
|
}
|
||||||
if (!empty($arr)) {
|
else {
|
||||||
$data = $arr[$key];
|
$key = "check_vpn";
|
||||||
echo $data["STATUS"];
|
$arr = array("STATUS" => 0);
|
||||||
remove_response("$key");
|
$json = json_encode($arr, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);
|
||||||
}
|
set_output($key,$json);
|
||||||
else echo "NO";
|
sleep(1);
|
||||||
|
$arr = check_response($key);
|
||||||
|
if (!empty($arr)) {
|
||||||
|
$data = $arr[$key];
|
||||||
|
echo $data["STATUS"];
|
||||||
|
remove_response("$key");
|
||||||
|
}
|
||||||
|
else echo "NO";
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "save_vpn":
|
case "save_vpn":
|
||||||
remove_response("save_repository");
|
//remove_response("save_repository"); // ???
|
||||||
|
|
||||||
$arr = array(
|
$arr = array(
|
||||||
"VPN_DOMAIN" => $_GET["vpn_domain"],
|
"VPN_DOMAIN" => $_GET["vpn_domain"],
|
||||||
|
723
style.css
Normal file
@@ -0,0 +1,723 @@
|
|||||||
|
:root {
|
||||||
|
--highlight-color: #F9DB54;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: 'Switzer', sans-serif;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 16px;
|
||||||
|
background-color: #000;
|
||||||
|
color: white;
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {border: 1px solid var(--highlight-color); width:100%;}
|
||||||
|
table th {padding-left: 20px; text-align: left; color: var(--highlight-color); width: 25%;}
|
||||||
|
table td {padding-left: 20px; text-align:left; width: 25%;}
|
||||||
|
|
||||||
|
.progress-box {
|
||||||
|
max-width: 300px;
|
||||||
|
margin: auto;
|
||||||
|
text-align: center;
|
||||||
|
align-items: center;
|
||||||
|
border: 2px solid #41464f;
|
||||||
|
padding: 30px 30px 0px 30px;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
.progress-container-shadow {
|
||||||
|
width: 300px;
|
||||||
|
height: 40px;
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
margin: 40px auto 0px auto;
|
||||||
|
}
|
||||||
|
.progress-container-shadow::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.progress-container {
|
||||||
|
width: 300px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
margin: 0px;
|
||||||
|
top:-45px;
|
||||||
|
left:5px;
|
||||||
|
}
|
||||||
|
.progress-bar {
|
||||||
|
height: 100%;
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
width: 0%;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.progress-text {
|
||||||
|
font-size: 20px;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
font-weight: bold;
|
||||||
|
color: #000000;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
.progress-title {
|
||||||
|
text-align: left;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.progress-description {
|
||||||
|
text-align: left;
|
||||||
|
font-size: 16px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
color: #999;
|
||||||
|
min-height: 40px;
|
||||||
|
}
|
||||||
|
.controls {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
width: 250px;
|
||||||
|
background-color: #101214;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 20px 0;
|
||||||
|
margin: 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
transition: width 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo img {
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 5px;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vpn-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
color: white;
|
||||||
|
transition: color 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
color: white;
|
||||||
|
transition: color 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item:hover {
|
||||||
|
color: var(--highlight-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item i {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item span {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item img {
|
||||||
|
width: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item.active {
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
color: black;
|
||||||
|
border-radius: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item.active:hover {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item span.arrow {
|
||||||
|
margin-left: auto;
|
||||||
|
color: gray;
|
||||||
|
font-size: 20px;
|
||||||
|
transition: transform 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item.open .arrow {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu {
|
||||||
|
display: none;
|
||||||
|
margin-left: 40px;
|
||||||
|
flex-direction: column;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu-item {
|
||||||
|
padding: 5px 14px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #ffffff;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu-item:hover {
|
||||||
|
color: #000000;
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Switch container */
|
||||||
|
.switch {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 60px;
|
||||||
|
height: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide native checkbox */
|
||||||
|
.switch input {
|
||||||
|
opacity: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slider background */
|
||||||
|
.slider-text {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #ccc;
|
||||||
|
border-radius: 26px;
|
||||||
|
transition: background-color 0.3s;
|
||||||
|
display: flex !important;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end; /* default: OFF on the right */
|
||||||
|
padding: 0 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Circle */
|
||||||
|
.slider-text::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
height: 22px;
|
||||||
|
width: 22px;
|
||||||
|
left: 2px;
|
||||||
|
top: 2px;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
transition: transform 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checked: move dot, change background and text alignment */
|
||||||
|
.switch input:checked + .slider-text {
|
||||||
|
background-color: #4CAF50;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dot animation */
|
||||||
|
.switch input:checked + .slider-text::before {
|
||||||
|
transform: translateX(34px);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Status label */
|
||||||
|
.status-label {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #888;
|
||||||
|
min-width: 28px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details {
|
||||||
|
color: white;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.yellow-row {
|
||||||
|
max-width:250px;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0px;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.yellow-box {
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
color: black;
|
||||||
|
text-align: left;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 10px 18px;
|
||||||
|
border-radius: 20px 20px 0px 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.yellow-corner {
|
||||||
|
padding:0px;
|
||||||
|
border: 0px;
|
||||||
|
display: flex;
|
||||||
|
margin: 0px;
|
||||||
|
margin-top: auto;
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
flex: 1;
|
||||||
|
padding: 30px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#appsContainer {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 16px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app {
|
||||||
|
border: 1px solid #41464f;
|
||||||
|
border-radius: 15px;
|
||||||
|
text-align: left;
|
||||||
|
padding: 20px;
|
||||||
|
width: 130px;
|
||||||
|
min-height: 200px;
|
||||||
|
text-align: left;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-img {
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app img {
|
||||||
|
border-radius: 15px;
|
||||||
|
background-color: #101214;
|
||||||
|
width: 70px;
|
||||||
|
height: 70px;
|
||||||
|
object-fit: contain;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-label {
|
||||||
|
font-size: 10px;
|
||||||
|
color: #cccccc;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
align-items: left;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-name {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more-btn {
|
||||||
|
background-color: inherit;
|
||||||
|
color: #cccccc;
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
border-radius: 15px;
|
||||||
|
padding: 18px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 400;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100%;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more-btn:hover {
|
||||||
|
color: var(--highlight-color);
|
||||||
|
border: 1px solid var(--highlight-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-details {
|
||||||
|
padding: 0px 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-fields {
|
||||||
|
border: 1px solid #41464f;
|
||||||
|
border-radius: 15px;
|
||||||
|
text-align: left;
|
||||||
|
padding: 20px;
|
||||||
|
margin: 30px 0px 10px 0px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-fields .row {
|
||||||
|
display: block;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 5px 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#letsencrypt {
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-block {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
padding: 20px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-and-text {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.applogo img {
|
||||||
|
border-radius: 15px;
|
||||||
|
background-color: #101214;
|
||||||
|
width: 70px;
|
||||||
|
height: 70px;
|
||||||
|
object-fit: contain;
|
||||||
|
padding: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
font-size: 18px;
|
||||||
|
margin: 4px 0;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 20px 0 0;
|
||||||
|
color: #999;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-btn {
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
color: black;
|
||||||
|
border: none;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-header h1 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-header button {
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
color: black;
|
||||||
|
border: none;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-row, .input-group {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid #41464f;
|
||||||
|
padding: 15px 20px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
border-radius: 10px;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
flex: 1;
|
||||||
|
justify-content: flex-end;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-row input,
|
||||||
|
.input-row select,
|
||||||
|
.row input,
|
||||||
|
.row select {
|
||||||
|
background: transparent;
|
||||||
|
border: 1px solid #41464f;
|
||||||
|
padding: 8px 30px 8px 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
color: white;
|
||||||
|
transition: color 0.2s;
|
||||||
|
max-width: 40%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row input,
|
||||||
|
.row select {
|
||||||
|
padding: 12px 30px 12px 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-row input:focus,
|
||||||
|
.input-row select:focus,
|
||||||
|
.row input,
|
||||||
|
.row select {
|
||||||
|
outline: none;
|
||||||
|
background-color: black;
|
||||||
|
color: var(--highlight-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-row select,
|
||||||
|
.row select {
|
||||||
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
background-image: url('data:image/svg+xml;utf8,<svg fill="white" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7 10l5-5 5 5zM7 14l5 5 5-5z"/></svg>');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right 8px center;
|
||||||
|
background-size: 16px;
|
||||||
|
padding-right: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-container {
|
||||||
|
position: relative;
|
||||||
|
left: -18px;
|
||||||
|
top: -22px;
|
||||||
|
display: inline-block;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
margin: 0px;
|
||||||
|
width: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-icon {
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
color: black;
|
||||||
|
border-radius: 50%;
|
||||||
|
padding: 1px 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 10px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip {
|
||||||
|
visibility: hidden;
|
||||||
|
background-color: #333;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
bottom: 100%; /* above the icon */
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-78%);
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s;
|
||||||
|
/*white-space: nowrap;*/
|
||||||
|
text-align: right;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 100%; /* bottom of tooltip */
|
||||||
|
left: 80%;
|
||||||
|
margin-left: -5px;
|
||||||
|
border-width: 5px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: #333 transparent transparent transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-container:hover .tooltip {
|
||||||
|
visibility: visible;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clear-btn {
|
||||||
|
position: absolute;
|
||||||
|
right: 8px;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
color: white;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 16px;
|
||||||
|
padding: 0;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
text-align: center;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.save-button {
|
||||||
|
background-color: var(--highlight-color);
|
||||||
|
color: black;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 30px;
|
||||||
|
font-size: 16px;
|
||||||
|
border-radius: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-top: 30px;
|
||||||
|
align-self: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.save-button:hover {
|
||||||
|
background-color: #f5c300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons .btn {
|
||||||
|
background-color: black;
|
||||||
|
border: 1px solid #999;
|
||||||
|
color: #999;
|
||||||
|
padding: 10px 15px;
|
||||||
|
font-size: 14px;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-top: 10px;
|
||||||
|
align-self: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons .btn:hover {
|
||||||
|
border: 1px solid #f5c300;
|
||||||
|
color: #f5c300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup-content {
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#popup .row {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.sidebar {
|
||||||
|
width: 80px;
|
||||||
|
padding: 20px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-size: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo span {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item {
|
||||||
|
justify-content: center;
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-item span {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.yellow-box {
|
||||||
|
font-size: 0;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-row {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-container {
|
||||||
|
width: 100%;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-row input,
|
||||||
|
.input-row select {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|