New
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Органайзер RustDesk</title>
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/jstree.min.js"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/themes/default/style.min.css">
|
||||
<style>
|
||||
body { display: flex; font-family: Arial, sans-serif; }
|
||||
#tree-container { width: 30%; padding: 10px; border-right: 1px solid #ccc; }
|
||||
#installs-container { width: 70%; padding: 10px; }
|
||||
.install-item { padding: 5px; margin: 2px; border: 1px solid #ddd; cursor: move; }
|
||||
.form-container { margin-bottom: 20px; }
|
||||
.jstree-node { position: relative; }
|
||||
.folder-actions { display: inline; margin-left: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tree-container">
|
||||
<h2>Папки</h2>
|
||||
<div id="folder-tree"></div>
|
||||
<button onclick="addFolder()">Добавить папку</button>
|
||||
</div>
|
||||
<div id="installs-container">
|
||||
<h1>Органайзер RustDesk</h1>
|
||||
<div class="form-container">
|
||||
<h2>Добавить запись</h2>
|
||||
<input type="text" id="rustId" placeholder="Rust ID" required>
|
||||
<input type="text" id="computerName" placeholder="Имя компьютера" required>
|
||||
<input type="text" id="installTime" placeholder="Время (опционально)">
|
||||
<button onclick="addInstall()">Добавить</button>
|
||||
</div>
|
||||
<div id="installs-list"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const API_URL = "/api";
|
||||
let selectedFolderId = null;
|
||||
|
||||
$(document).ready(function () {
|
||||
// Инициализация дерева папок
|
||||
$('#folder-tree').jstree({
|
||||
'core': {
|
||||
'data': function (node, cb) {
|
||||
$.getJSON(`${API_URL}/folders`, function (data) {
|
||||
const treeData = data.map(folder => ({
|
||||
id: folder.id,
|
||||
text: `${folder.name} <span class="folder-actions">` +
|
||||
`<button onclick="editFolder(${folder.id}, '${folder.name}')">✏️</button>` +
|
||||
`<button onclick="deleteFolder(${folder.id})">🗑️</button></span>`,
|
||||
parent: folder.parent_id ? folder.parent_id : '#'
|
||||
}));
|
||||
cb(treeData);
|
||||
});
|
||||
},
|
||||
'check_callback': true
|
||||
},
|
||||
'plugins': ['dnd', 'html_data']
|
||||
}).on('select_node.jstree', function (e, data) {
|
||||
selectedFolderId = data.node.id;
|
||||
loadInstalls(selectedFolderId);
|
||||
});
|
||||
|
||||
// Drag-and-drop для записей
|
||||
$('#installs-list').on('dragstart', '.install-item', function (e) {
|
||||
e.originalEvent.dataTransfer.setData('text/plain', $(this).data('id'));
|
||||
});
|
||||
|
||||
$('#folder-tree').on('dragover', function (e) {
|
||||
e.preventDefault(); // Разрешаем drop
|
||||
}).on('drop', function (e) {
|
||||
e.preventDefault();
|
||||
const installId = e.originalEvent.dataTransfer.getData('text');
|
||||
const folderId = $(e.target).closest('.jstree-node').attr('id');
|
||||
if (installId && folderId) {
|
||||
updateInstallFolder(installId, folderId);
|
||||
}
|
||||
});
|
||||
|
||||
// Загрузка записей без выбранной папки
|
||||
loadInstalls(null);
|
||||
});
|
||||
|
||||
function loadInstalls(folderId) {
|
||||
$.getJSON(`${API_URL}/installs`, function (data) {
|
||||
const filtered = folderId ? data.filter(i => i.folder_id == folderId) : data;
|
||||
$('#installs-list').html(filtered.map(item => `
|
||||
<div class="install-item" data-id="${item.id}" draggable="true">
|
||||
<a href="rustdesk://${item.rust_id}" onclick="openRustDesk('${item.rust_id}'); return false;">${item.rust_id}</a>
|
||||
- ${item.computer_name} (${item.install_time})
|
||||
<button onclick="editInstall(${item.id}, '${item.rust_id}', '${item.computer_name}', '${item.install_time}')">Редактировать</button>
|
||||
<button onclick="deleteInstall(${item.id})">Удалить</button>
|
||||
</div>
|
||||
`).join(''));
|
||||
});
|
||||
}
|
||||
|
||||
function addFolder() {
|
||||
const name = prompt("Введите имя папки:");
|
||||
if (name) {
|
||||
$.ajax({
|
||||
url: `${API_URL}/folders`,
|
||||
type: 'POST',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify({ name, parent_id: selectedFolderId }),
|
||||
success: function () {
|
||||
$('#folder-tree').jstree(true).refresh();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function editFolder(folderId, currentName) {
|
||||
const newName = prompt("Введите новое имя папки:", currentName);
|
||||
if (newName) {
|
||||
$.ajax({
|
||||
url: `${API_URL}/folders/${folderId}`,
|
||||
type: 'PUT',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify({ name: newName }),
|
||||
success: function () {
|
||||
$('#folder-tree').jstree(true).refresh();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function deleteFolder(folderId) {
|
||||
if (confirm("Удалить папку? Все записи будут перемещены в корень.")) {
|
||||
$.ajax({
|
||||
url: `${API_URL}/folders/${folderId}`,
|
||||
type: 'DELETE',
|
||||
success: function () {
|
||||
// Перемещаем записи в корень (folder_id = null)
|
||||
$.getJSON(`${API_URL}/installs`, function (data) {
|
||||
const folderInstalls = data.filter(i => i.folder_id == folderId);
|
||||
folderInstalls.forEach(item => {
|
||||
updateInstallFolder(item.id, null);
|
||||
});
|
||||
});
|
||||
$('#folder-tree').jstree(true).refresh();
|
||||
loadInstalls(selectedFolderId);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function addInstall() {
|
||||
const rustId = $('#rustId').val();
|
||||
const computerName = $('#computerName').val();
|
||||
const installTime = $('#installTime').val() || new Date().toISOString();
|
||||
$.ajax({
|
||||
url: `${API_URL}/install`,
|
||||
type: 'POST',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify({ rust_id: rustId, computer_name: computerName, install_time: installTime, folder_id: selectedFolderId }),
|
||||
success: function () {
|
||||
loadInstalls(selectedFolderId);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function editInstall(id, rustId, computerName, installTime) {
|
||||
const newRustId = prompt("Rust ID:", rustId);
|
||||
const newComputerName = prompt("Имя компьютера:", computerName);
|
||||
const newInstallTime = prompt("Время установки:", installTime);
|
||||
if (newRustId && newComputerName) {
|
||||
$.ajax({
|
||||
url: `${API_URL}/install/${id}`,
|
||||
type: 'PUT',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify({ rust_id: newRustId, computer_name: newComputerName, install_time: newInstallTime, folder_id: selectedFolderId }),
|
||||
success: function () {
|
||||
loadInstalls(selectedFolderId);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function deleteInstall(id) {
|
||||
if (confirm("Удалить запись?")) {
|
||||
$.ajax({
|
||||
url: `${API_URL}/install/${id}`,
|
||||
type: 'DELETE',
|
||||
success: function () {
|
||||
loadInstalls(selectedFolderId);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function updateInstallFolder(installId, folderId) {
|
||||
$.ajax({
|
||||
url: `${API_URL}/install/${installId}`,
|
||||
type: 'PUT',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify({ folder_id: folderId === 'undefined' ? null : folderId }),
|
||||
success: function () {
|
||||
loadInstalls(selectedFolderId); // Обновляем список после переноса
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
console.error("Ошибка переноса:", status, error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function openRustDesk(rustId) {
|
||||
if (confirm("Подключиться к " + rustId + "?")) {
|
||||
window.location.href = `rustdesk://${rustId}`;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user