2024-04-20 22:15:06 +00:00
{% extends ../base.html %}
{% block meta %}
{% end %}
{% block title %}Crafty Controller - {{ translate('serverDetails', 'serverDetails', data['lang']) }}{% end %}
{% block content %}
< div class = "content-wrapper" >
<!-- Page Title Header Starts -->
< div class = "row page-title-header" >
< div class = "col-12" >
< div class = "page-header" >
< h4 class = "page-title" >
{{ translate('serverDetails', 'serverDetails', data['lang']) }} - {{
data['server_stats']['server_id']['server_name'] }}
< br / >
< small > UUID: {{ data['server_stats']['server_id']['server_id'] }}< / small >
< / h4 >
< / div >
< / div >
< / div >
<!-- Page Title Header Ends -->
{% include "parts/details_stats.html %}
< div class = "row" >
< div class = "col-sm-12 grid-margin" >
< div class = "card" >
< div class = "card-body pt-0" >
< span class = "d-none d-sm-block" >
{% include "parts/server_controls_list.html %}
< / span >
< span class = "d-block d-sm-none" >
{% include "parts/m_server_controls_list.html %}
< / span >
< div class = "row" >
< div class = "col-md-6 col-sm-12" >
< br >
< br >
2024-07-28 16:51:12 +00:00
< div id = "{{data['backup_config'].get('backup_id', None)}}_status" class = "progress" style = "height: 15px; display: none;" >
2024-04-20 22:15:06 +00:00
< / div >
2024-05-26 17:59:08 +00:00
{% if data['backing_up'] %}
2024-07-28 16:51:12 +00:00
< p > Backing up < i class = "fas fa-spin fa-spinner" > < / i > < span id = "total_files" > {{data['server_stats']['world_size']}}< / span > < / p >
2024-04-20 22:15:06 +00:00
{% end %}
< br >
{% if not data['backing_up'] %}
< div id = "backup_button" class = "form-group" >
< button class = "btn btn-primary" id = "backup_now_button" > {{ translate('serverBackups', 'backupNow',
data['lang']) }}< / button >
< / div >
{% end %}
< form id = "backup-form" class = "forms-sample" >
< div class = "form-group" >
2024-05-26 17:45:13 +00:00
< label for = "backup_name" > {{ translate('serverBackups', 'name', data['lang']) }}
2024-05-26 21:10:20 +00:00
{% if data["backup_config"].get("default", None) %}
2024-05-26 17:45:13 +00:00
< span class = "badge-pill badge-outline-warning" > {{ translate('serverBackups', 'default',
2024-07-28 16:51:12 +00:00
data['lang']) }}< / span > < small > < button class = "badge-pill badge-outline-info backup-explain" data-explain = "{{ translate('serverBackups', 'defaultExplain', data['lang'])}}" > < i class = "fa-solid fa-question" > < / i > < / button > < / small >
2024-05-26 17:45:13 +00:00
{% end %}
< / label >
2024-05-26 02:10:35 +00:00
{% if data["backup_config"].get("backup_id", None) %}
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control" name = "backup_name" id = "backup_name" value = "{{ data['backup_config']['backup_name'] }}" >
2024-05-26 02:10:35 +00:00
{% else %}
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control" name = "backup_name" id = "backup_name" placeholder = "{{ translate('serverBackups', 'myBackup', data['lang']) }}" >
2024-05-26 02:10:35 +00:00
{% end %}
< br >
< br >
2024-04-20 22:15:06 +00:00
{% if data['super_user'] %}
2024-07-28 16:51:12 +00:00
< label for = "server_name" > {{ translate('serverBackups', 'storageLocation', data['lang']) }} < small class = "text-muted ml-1" > - {{ translate('serverBackups', 'storageLocationDesc', data['lang'])
2024-04-20 22:15:06 +00:00
}}< / small > < / label >
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control" name = "backup_location" id = "backup_location" value = "{{ data['backup_config']['backup_location'] }}" placeholder = "{{ translate('serverBackups', 'storageLocation', data['lang']) }}" >
2024-04-20 22:15:06 +00:00
{% end %}
< / div >
< div class = "form-group" >
2024-07-28 16:51:12 +00:00
< label for = "server_path" > {{ translate('serverBackups', 'maxBackups', data['lang']) }} < small class = "text-muted ml-1" > - {{ translate('serverBackups', 'maxBackupsDesc', data['lang'])
2024-04-20 22:15:06 +00:00
}}< / small > < / label >
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control" name = "max_backups" id = "max_backups" value = "{{ data['backup_config']['max_backups'] }}" placeholder = "{{ translate('serverBackups', 'maxBackups', data['lang']) }}" >
2024-04-20 22:15:06 +00:00
< / div >
< div class = "form-group" >
2024-06-24 00:17:34 +00:00
< div class = "custom-control custom-switch" >
{% if data['backup_config']['compress'] %}
2024-07-28 16:51:12 +00:00
< input type = "checkbox" class = "custom-control-input" id = "compress" name = "compress" checked = "" value = "True" >
2024-06-24 00:17:34 +00:00
{% else %}
< input type = "checkbox" class = "custom-control-input" id = "compress" name = "compress" value = "True" >
{% end %}
< label for = "compress" class = "custom-control-label" > {{ translate('serverBackups', 'compress',
data['lang']) }}< / label >
< / div >
2024-04-20 22:15:06 +00:00
< / div >
< div class = "form-group" >
2024-06-24 00:17:34 +00:00
< div class = "custom-control custom-switch" >
{% if data['backup_config']['shutdown']%}
2024-07-28 16:51:12 +00:00
< input type = "checkbox" class = "custom-control-input" id = "shutdown" name = "shutdown" checked = "" value = "True" >
2024-06-24 00:17:34 +00:00
{% else %}
< input type = "checkbox" class = "custom-control-input" id = "shutdown" name = "shutdown" value = "True" >
{% end %}
< label for = "shutdown" class = "custom-control-label" > {{ translate('serverBackups', 'shutdown',
data['lang']) }}< / label >
< / div >
2024-04-20 22:15:06 +00:00
< / div >
< div class = "form-group" >
2024-06-24 00:17:34 +00:00
< div class = "custom-control custom-switch" >
{% if data['backup_config']['before'] %}
< input type = "checkbox" class = "custom-control-input" id = "before-check" name = "before-check" checked >
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control hidden-input" name = "before" id = "backup_before" value = "{{ data['backup_config']['before'] }}" placeholder = "We enter the / for you" style = "display: inline-block;" >
2024-06-24 00:17:34 +00:00
{% else %}
< input type = "checkbox" class = "custom-control-input" id = "before-check" name = "before-check" >
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control hidden-input" name = "before" id = "backup_before" value = "" placeholder = "We enter the / for you." style = "display: none;" >
2024-06-24 00:17:34 +00:00
{% end %}
< label for = "before-check" class = "custom-control-label" > {{
translate('serverBackups', 'before', data['lang']) }}< / label >
< / div >
2024-04-20 22:15:06 +00:00
< / div >
< div class = "form-group" >
2024-06-24 00:17:34 +00:00
< div class = "custom-control custom-switch" >
{% if data['backup_config']['after'] %}
< input type = "checkbox" class = "custom-control-input" id = "after-check" name = "after-check" checked >
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control hidden-input" name = "after" id = "backup_after" value = "{{ data['backup_config']['after'] }}" placeholder = "We enter the / for you" style = "display: inline-block;" >
2024-06-24 00:17:34 +00:00
< br >
{% else %}
< input type = "checkbox" class = "custom-control-input" id = "after-check" name = "after-check" >
2024-07-28 16:51:12 +00:00
< input type = "text" class = "form-control hidden-input" name = "after" id = "backup_after" value = "" placeholder = "We enter the / for you." style = "display: none;" >
2024-06-24 00:17:34 +00:00
{% end %}
< label for = "after-check" class = "custom-control-label" > {{
translate('serverBackups', 'after', data['lang']) }}< / label >
< / div >
2024-04-20 22:15:06 +00:00
< / div >
< div class = "form-group" >
< label for = "server" > {{ translate('serverBackups', 'exclusionsTitle', data['lang']) }} < small > - {{
translate('serverBackups', 'excludedChoose', data['lang']) }}< / small > < / label >
< br >
2024-07-28 16:51:12 +00:00
< button class = "btn btn-primary mr-2" id = "root_files_button" data-server_path = "{{ data['server_stats']['server_id']['path']}}" type = "button" > {{
2024-04-20 22:15:06 +00:00
translate('serverBackups', 'clickExclude', data['lang']) }}< / button >
< / div >
2024-06-24 00:26:24 +00:00
< div class = "modal fade" id = "dir_select" tabindex = "-1" aria-labelledby = "dir_select" aria-hidden = "true" >
< div class = "modal-dialog" >
2024-04-20 22:15:06 +00:00
< div class = "modal-content" >
< div class = "modal-header" >
< h5 class = "modal-title" id = "exampleModalLongTitle" > {{ translate('serverBackups',
'excludedChoose', data['lang']) }}< / h5 >
< button type = "button" class = "close" data-dismiss = "modal" aria-label = "Close" >
< span aria-hidden = "true" > × < / span >
< / button >
< / div >
< div class = "modal-body" >
2024-07-28 16:51:12 +00:00
< div class = "tree-ctx-item" id = "main-tree-div" data-path = "" style = "overflow: scroll; max-height:75%;" >
2024-04-20 22:15:06 +00:00
< input type = "checkbox" id = "main-tree-input" name = "root_path" value = "" disabled >
< span id = "main-tree" class = "files-tree-title tree-caret-down root-dir" data-path = "" >
< i class = "far fa-folder" > < / i >
< i class = "far fa-folder-open" > < / i >
{{ translate('serverFiles', 'files', data['lang']) }}
< / span >
< / input >
< / div >
< / div >
< div class = "modal-footer" >
2024-07-28 16:51:12 +00:00
< button type = "button" id = "modal-cancel" class = "btn btn-secondary" data-dismiss = "modal" > < i class = "fa-solid fa-xmark" > < / i > < / button >
< button type = "button" id = "modal-okay" data-dismiss = "modal" class = "btn btn-primary" > < i class = "fa-solid fa-thumbs-up" > < / i > < / button >
2024-04-20 22:15:06 +00:00
< / div >
< / div >
< / div >
< / div >
< button type = "submit" class = "btn btn-success mr-2" > {{ translate('serverBackups', 'save', data['lang'])
}}< / button >
2024-05-26 17:45:13 +00:00
< button type = "reset" class = "btn btn-light cancel-button" > {{ translate('serverBackups', 'cancel',
data['lang'])
2024-04-20 22:15:06 +00:00
}}< / button >
< / form >
< / div >
< div class = "col-md-6 col-sm-12" >
< div class = "text-center" >
< table class = "table table-responsive dataTable" id = "backup_table" >
< h4 class = "card-title" > {{ translate('serverBackups', 'currentBackups', data['lang']) }}< / h4 >
< thead >
< tr >
2024-06-24 00:28:03 +00:00
< th > {{ translate('serverBackups', 'options', data['lang']) }}< / th >
2024-04-20 22:15:06 +00:00
< th > {{ translate('serverBackups', 'path', data['lang']) }}< / th >
2024-06-24 00:28:03 +00:00
< th > {{ translate('serverBackups', 'size', data['lang']) }}< / th >
2024-04-20 22:15:06 +00:00
< / tr >
< / thead >
< tbody >
{% for backup in data['backup_list'] %}
< tr >
< td >
2024-07-28 16:51:12 +00:00
< a href = "/panel/download_backup?file={{ backup['path'] }}&id={{ data['server_stats']['server_id']['server_id'] }}&backup_id={{ data['backup_config']['backup_id']}}" class = "btn btn-primary" >
2024-04-20 22:15:06 +00:00
< i class = "fas fa-download" aria-hidden = "true" > < / i >
{{ translate('serverBackups', 'download', data['lang']) }}
< / a >
< br >
< br >
2024-07-28 16:51:12 +00:00
< button data-file = "{{ backup['path'] }}" data-backup_location = "{{ data['backup_config']['backup_location'] }}" class = "btn btn-danger del_button" >
2024-04-20 22:15:06 +00:00
< i class = "fas fa-trash" aria-hidden = "true" > < / i >
{{ translate('serverBackups', 'delete', data['lang']) }}
< / button >
< button data-file = "{{ backup['path'] }}" class = "btn btn-warning restore_button" >
< i class = "fas fa-undo-alt" aria-hidden = "true" > < / i >
{{ translate('serverBackups', 'restore', data['lang']) }}
< / button >
< / td >
< td > {{ backup['path'] }}< / td >
< td > {{ backup['size'] }}< / td >
< / tr >
{% end %}
< / tbody >
< / table >
< / div >
< / div >
< / div >
< div class = "col-md-12 col-sm-12" >
< br >
< br >
< div class = "card-header header-sm d-flex justify-content-between align-items-center" >
< h4 class = "card-title" > < i class = "fas fa-server" > < / i > {{ translate('serverBackups', 'excludedBackups',
data['lang']) }} < small class = "text-muted ml-1" > < / small > < / h4 >
< / div >
< br >
< ul >
{% for item in data['exclusions'] %}
< li > {{item}}< / li >
< br >
{% end %}
< / ul >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< style >
/* Remove default bullets */
.tree-view,
.tree-nested {
list-style-type: none;
margin: 0;
padding: 0;
margin-left: 10px;
}
/* Style the items */
.tree-item,
.files-tree-title {
cursor: pointer;
user-select: none;
/* Prevent text selection */
}
/* Create the caret/arrow with a unicode, and style it */
.tree-caret .fa-folder {
display: inline-block;
}
.tree-caret .fa-folder-open {
display: none;
}
/* Rotate the caret/arrow icon when clicked on (using JavaScript) */
.tree-caret-down .fa-folder {
display: none;
}
.tree-caret-down .fa-folder-open {
display: inline-block;
}
/* Hide the nested list */
.tree-nested {
display: none;
}
< / style >
<!-- content - wrapper ends -->
{% end %}
{% block js %}
< script >
const server_id = new URLSearchParams(document.location.search).get('id')
2024-05-25 20:33:28 +00:00
const backup_id = new URLSearchParams(document.location.search).get('backup_id')
2024-04-20 22:15:06 +00:00
//used to get cookies from browser - this is part of tornados xsrf protection - it's for extra security
function getCookie(name) {
var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
return r ? r[1] : undefined;
}
async function backup_started() {
const token = getCookie("_xsrf")
2024-05-25 20:33:28 +00:00
let res = await fetch(`/api/v2/servers/${server_id}/action/backup_server/${backup_id}`, {
2024-04-21 15:26:16 +00:00
method: 'POST',
headers: {
'X-XSRFToken': token
}
});
let responseData = await res.json();
if (responseData.status === "ok") {
console.log(responseData);
2024-05-26 17:59:08 +00:00
$("#backup_button").prop('disabled', true)
2024-04-21 15:26:16 +00:00
} else {
2024-04-20 22:15:06 +00:00
2024-04-21 15:26:16 +00:00
bootbox.alert({
title: responseData.status,
message: responseData.error
});
}
2024-04-20 22:15:06 +00:00
return;
}
async function del_backup(filename, id) {
const token = getCookie("_xsrf")
2024-04-21 15:26:16 +00:00
let contents = JSON.stringify({ "filename": filename })
2024-05-26 02:10:35 +00:00
let res = await fetch(`/api/v2/servers/${server_id}/backups/backup/${backup_id}/files/`, {
2024-04-20 22:15:06 +00:00
method: 'DELETE',
headers: {
'token': token,
},
body: contents
});
let responseData = await res.json();
if (responseData.status === "ok") {
window.location.reload();
2024-04-21 15:26:16 +00:00
} else {
bootbox.alert({
"title": responseData.status,
"message": responseData.error
})
2024-04-20 22:15:06 +00:00
}
}
async function restore_backup(filename, id) {
const token = getCookie("_xsrf")
2024-04-21 15:26:16 +00:00
let contents = JSON.stringify({ "filename": filename })
2024-04-20 22:15:06 +00:00
var dialog = bootbox.dialog({
message: "< i class = 'fa fa-spin fa-spinner' > < / i > {{ translate('serverBackups', 'restoring', data['lang']) }}",
closeButton: false
});
2024-05-26 02:10:35 +00:00
let res = await fetch(`/api/v2/servers/${server_id}/backups/backup/${backup_id}/`, {
2024-04-20 22:15:06 +00:00
method: 'POST',
headers: {
'token': token,
},
body: contents
});
let responseData = await res.json();
if (responseData.status === "ok") {
window.location.href = "/panel/dashboard";
2024-04-21 15:26:16 +00:00
} else {
bootbox.alert({
"title": responseData.status,
"message": responseData.error
})
2024-04-20 22:15:06 +00:00
}
}
$("#before-check").on("click", function () {
if ($("#before-check:checked").val()) {
$("#backup_before").css("display", "inline-block");
} else {
$("#backup_before").css("display", "none");
$("#backup_before").val("");
}
});
$("#after-check").on("click", function () {
if ($("#after-check:checked").val()) {
$("#backup_after").css("display", "inline-block");
} else {
$("#backup_after").css("display", "none");
$("#backup_after").val("");
}
});
function replacer(key, value) {
2024-05-26 02:10:35 +00:00
if (key === "excluded_dirs") {
2024-05-25 20:33:28 +00:00
if (value == 0) {
return []
} else {
return value
}
}
if (key != "before" & & key != "after") {
2024-04-20 22:15:06 +00:00
if (typeof value == "boolean" || key === "executable_update_url") {
return value
} else {
return (isNaN(value) ? value : +value);
}
} else {
return value;
}
}
$(document).ready(function () {
2024-05-26 17:45:13 +00:00
$(".backup-explain").on("click", function (e) {
e.preventDefault();
bootbox.alert($(this).data("explain"));
});
$(".cancel-button").on("click", function () {
location.href = `/panel/server_detail?id=${server_id}& subpage=backup`
});
2024-05-26 17:59:08 +00:00
webSocket.on('backup_status', function (backup) {
text = ``;
$(`#${backup.backup_id}_status`).show();
if (backup.percent >= 100) {
$(`#${backup.backup_id}_status`).hide()
setTimeout(function () {
window.location.reload(1);
}, 5000);
} else {
text = `< div class = "progress-bar progress-bar-striped progress-bar-animated"
role="progressbar" style="width:${backup.percent}%;"
aria-valuenow="${backup.percent}" aria-valuemin="0" aria-valuemax="100">${backup.percent}%< / div > `
$(`#${backup.backup_id}_status`).html(text);
}
});
2024-04-20 22:15:06 +00:00
$("#backup-form").on("submit", async function (e) {
e.preventDefault();
const token = getCookie("_xsrf")
let backupForm = document.getElementById("backup-form");
let formData = new FormData(backupForm);
//Remove checks that we don't need in form data.
formData.delete("after-check");
formData.delete("before-check");
//Create an object from the form data entries
let formDataObject = Object.fromEntries(formData.entries());
//We need to make sure these are sent regardless of whether or not they're checked
formDataObject.compress = $("#compress").prop('checked');
formDataObject.shutdown = $("#shutdown").prop('checked');
2024-04-21 15:26:16 +00:00
if ($("#root_files_button").hasClass("clicked")) {
2024-05-26 02:10:35 +00:00
excluded = []
2024-05-25 20:33:28 +00:00
$('input.excluded:checkbox:checked').each(function () {
excluded.push($(this).val());
});
2024-05-26 02:10:35 +00:00
formDataObject.excluded_dirs = excluded;
2024-04-20 22:15:06 +00:00
}
delete formDataObject.root_path
console.log(formDataObject);
// Format the plain form data as JSON
let formDataJsonString = JSON.stringify(formDataObject, replacer);
console.log(formDataJsonString);
2024-05-26 02:10:35 +00:00
let url = `/api/v2/servers/${server_id}/backups/backup/${backup_id}/`
let method = "PATCH"
if (!backup_id) {
url = `/api/v2/servers/${server_id}/backups/`
method = "POST";
}
let res = await fetch(url, {
method: method,
2024-04-20 22:15:06 +00:00
headers: {
'X-XSRFToken': token
},
body: formDataJsonString,
});
let responseData = await res.json();
if (responseData.status === "ok") {
2024-05-26 02:10:35 +00:00
window.location.href = `/panel/server_detail?id=${server_id}&subpage=backup`;
2024-04-20 22:15:06 +00:00
} else {
bootbox.alert({
title: responseData.error,
message: responseData.error_data
});
}
});
try {
2024-05-25 20:33:28 +00:00
if ($('#backup_location').val() == '') {
2024-04-20 22:15:06 +00:00
console.log('true')
try {
document.getElementById('backup_now_button').disabled = true;
} catch {
}
} else {
document.getElementById('backup_now_button').disabled = false;
}
} catch {
try {
document.getElementById('backup_now_button').disabled = false;
} catch {
}
}
console.log("ready!");
$("#backup_config_box").hide();
$("#backup_save_note").hide();
$("#show_config").click(function () {
$("#backup_config_box").toggle();
$('#backup_button').hide();
$('#backup_save_note').show();
$('#backup_data').hide();
});
$('#backup_table').DataTable({
"order": [[1, "desc"]],
"paging": false,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": false,
"responsive": true,
});
$(".del_button").click(function () {
var file_to_del = $(this).data("file");
2024-05-25 20:33:28 +00:00
var backup_location = $(this).data('backup_location');
2024-04-20 22:15:06 +00:00
console.log("file to delete is" + file_to_del);
bootbox.confirm({
title: "{% raw translate('serverBackups', 'destroyBackup', data['lang']) %}",
message: "{{ translate('serverBackups', 'confirmDelete', data['lang']) }}",
buttons: {
cancel: {
label: '< i class = "fas fa-times" > < / i > {{ translate("serverBackups", "cancel", data['lang']) }}'
},
confirm: {
label: '< i class = "fas fa-check" > < / i > {{ translate("serverBackups", "confirm", data['lang']) }}'
}
},
callback: function (result) {
console.log(result);
if (result == true) {
2024-05-25 20:33:28 +00:00
var full_path = backup_location + '/' + file_to_del;
2024-04-20 22:15:06 +00:00
del_backup(file_to_del, server_id);
}
}
});
});
$(".restore_button").click(function () {
var file_to_restore = $(this).data("file");
bootbox.confirm({
title: "{{ translate('serverBackups', 'restore', data['lang']) }} " + file_to_restore,
message: "{{ translate('serverBackups', 'confirmRestore', data['lang']) }}",
buttons: {
cancel: {
label: '< i class = "fas fa-times" > < / i > {{ translate("serverBackups", "cancel", data['lang']) }}'
},
confirm: {
label: '< i class = "fas fa-check" > < / i > {{ translate("serverBackups", "restore", data['lang']) }}',
className: 'btn-outline-danger'
}
},
callback: function (result) {
console.log(result);
if (result == true) {
restore_backup(file_to_restore, server_id);
}
}
});
});
$("#backup_now_button").click(function () {
backup_started();
});
});
document.getElementById("modal-cancel").addEventListener("click", function () {
document.getElementById("root_files_button").classList.remove('clicked');
document.getElementById("main-tree-div").innerHTML = '< input type = "checkbox" id = "main-tree-input" name = "root_path" value = "" disabled > < span id = "main-tree" class = "files-tree-title tree-caret-down root-dir" data-path = "" > < i class = "far fa-folder" > < / i > < i class = "far fa-folder-open" > < / i > {{ translate("serverFiles", "files", data["lang"]) }}< / span > < / input > '
})
document.getElementById("root_files_button").addEventListener("click", function () {
if ($("#root_files_button").data('server_path') != "") {
if (document.getElementById('root_files_button').classList.contains('clicked')) {
show_file_tree();
return;
} else {
document.getElementById('root_files_button').classList.add('clicked');
}
path = $("#root_files_button").data('server_path')
console.log($("#root_files_button").data('server_path'))
const token = getCookie("_xsrf");
var dialog = bootbox.dialog({
message: '< p class = "text-center mb-0" > < i class = "fa fa-spin fa-cog" > < / i > Please wait while we gather your files...< / p > ',
closeButton: false
});
setTimeout(function () {
var x = document.querySelector('.bootbox');
if (x) {
x.remove()
}
var x = document.querySelector('.modal-backdrop');
if (x) {
x.remove()
}
document.getElementById('main-tree-input').setAttribute('value', path)
getTreeView(path);
show_file_tree();
}, 5000);
} else {
bootbox.alert("You must input a path before selecting this button");
}
});
2024-04-21 15:26:16 +00:00
function getDirView(event) {
2024-04-20 22:15:06 +00:00
let path = event.target.parentElement.getAttribute("data-path");
if (document.getElementById(path).classList.contains('clicked')) {
return;
2024-04-21 15:26:16 +00:00
} else {
2024-04-20 22:15:06 +00:00
getTreeView(path);
}
}
2024-04-21 15:26:16 +00:00
async function getTreeView(path) {
2024-04-20 22:15:06 +00:00
console.log(path)
const token = getCookie("_xsrf");
2024-05-26 02:10:35 +00:00
let url = `/api/v2/servers/${server_id}/files/${backup_id}`
if (!backup_id) {
url = `/api/v2/servers/${server_id}/files/`
console.log("NEW URL")
}
console.log(url);
let res = await fetch(url, {
2024-04-21 15:26:16 +00:00
method: 'POST',
headers: {
'X-XSRFToken': token
},
body: JSON.stringify({ "page": "backups", "path": path }),
});
let responseData = await res.json();
if (responseData.status === "ok") {
console.log(responseData);
process_tree_response(responseData);
2024-04-20 22:15:06 +00:00
2024-04-21 15:26:16 +00:00
} else {
2024-04-20 22:15:06 +00:00
2024-04-21 15:26:16 +00:00
bootbox.alert({
title: responseData.status,
message: responseData.error
});
}
2024-04-20 22:15:06 +00:00
}
function process_tree_response(response) {
let path = response.data.root_path.path;
let text = `< ul class = "tree-nested d-block" id = "${path}ul" > `;
2024-04-21 15:26:16 +00:00
Object.entries(response.data).forEach(([key, value]) => {
if (key === "root_path" || key === "db_stats") {
//continue is not valid in for each. Return acts as a continue.
return;
}
2024-04-20 22:15:06 +00:00
let checked = ""
let dpath = value.path;
let filename = key;
2024-04-21 15:26:16 +00:00
if (value.excluded) {
2024-04-20 22:15:06 +00:00
checked = "checked"
}
2024-04-21 15:26:16 +00:00
if (value.dir) {
2024-04-20 22:15:06 +00:00
text += `< li class = "tree-item" data-path = "${dpath}" >
\n< div id = "${dpath}" data-path = "${dpath}" data-name = "${filename}" class = "tree-caret tree-ctx-item tree-folder" >
< input type = "checkbox" class = "checkBoxClass excluded" value = "${dpath}" $ { checked } >
< span id = "${dpath}span" class = "files-tree-title" data-path = "${dpath}" data-name = "${filename}" onclick = "getDirView(event)" >
< i style = "color: var(--info);" class = "far fa-folder" > < / i >
< i style = "color: var(--info);" class = "far fa-folder-open" > < / i >
< strong > ${filename}< / strong >
< / span >
< / input > < / div > < li > `
2024-04-21 15:26:16 +00:00
} else {
2024-04-20 22:15:06 +00:00
text += `< li
class="d-block tree-ctx-item tree-file"
data-path="${dpath}"
data-name="${filename}"
onclick="">< input type = 'checkbox' class = "checkBoxClass excluded" name = 'root_path' value = "${dpath}" $ { checked } > < span style = "margin-right: 6px;" >
< i class = "far fa-file" > < / i > < / span > < / input > ${filename}< / li > `
}
});
text += `< / ul > `;
2024-04-21 15:26:16 +00:00
if (response.data.root_path.top) {
2024-04-20 22:15:06 +00:00
try {
2024-04-21 15:26:16 +00:00
document.getElementById('main-tree-div').innerHTML += text;
document.getElementById('main-tree').parentElement.classList.add("clicked");
} catch {
document.getElementById('files-tree').innerHTML = text;
}
} else {
2024-04-20 22:15:06 +00:00
try {
2024-04-21 15:26:16 +00:00
document.getElementById(path + "span").classList.add('tree-caret-down');
document.getElementById(path).innerHTML += text;
document.getElementById(path).classList.add("clicked");
} catch {
console.log("Bad")
}
2024-04-20 22:15:06 +00:00
2024-04-21 15:26:16 +00:00
var toggler = document.getElementById(path + "span");
2024-04-20 22:15:06 +00:00
2024-04-21 15:26:16 +00:00
if (toggler.classList.contains('files-tree-title')) {
document.getElementById(path + "span").addEventListener("click", function caretListener() {
document.getElementById(path + "ul").classList.toggle("d-block");
document.getElementById(path + "span").classList.toggle("tree-caret-down");
});
}
2024-04-20 22:15:06 +00:00
}
}
function getToggleMain(event) {
path = event.target.parentElement.getAttribute('data-path');
document.getElementById("files-tree").classList.toggle("d-block");
document.getElementById(path + "span").classList.toggle("tree-caret-down");
document.getElementById(path + "span").classList.toggle("tree-caret");
}
function show_file_tree() {
$("#dir_select").modal();
}
< / script >
{% end %}