main
Satur@it-depot.ru 2025-03-05 10:41:12 +03:00
parent e26ffa1953
commit 30ae8b76b6
2 changed files with 68 additions and 39 deletions

8
app.py
View File

@ -40,7 +40,7 @@ CREATE TABLE IF NOT EXISTS installs (
""") """)
conn.commit() conn.commit()
# Проверяем/создаем папку "Несортированные" # Проверяем/создаем папку "Несортированные" и получаем её ID
cursor.execute("SELECT id FROM folders WHERE name = 'Несортированные'") cursor.execute("SELECT id FROM folders WHERE name = 'Несортированные'")
unsorted_folder = cursor.fetchone() unsorted_folder = cursor.fetchone()
if not unsorted_folder: if not unsorted_folder:
@ -98,6 +98,12 @@ def update_folder(folder_id: int, folder: FolderUpdate):
@app.delete("/api/folders/{folder_id}") @app.delete("/api/folders/{folder_id}")
def delete_folder(folder_id: int): def delete_folder(folder_id: int):
# Проверяем, не является ли папка "Несортированные"
cursor.execute("SELECT name FROM folders WHERE id = ?", (folder_id,))
folder_name = cursor.fetchone()
if folder_name and folder_name[0] == 'Несортированные':
raise HTTPException(status_code=403, detail="Папка 'Несортированные' не может быть удалена")
cursor.execute("DELETE FROM folders WHERE id = ?", (folder_id,)) cursor.execute("DELETE FROM folders WHERE id = ?", (folder_id,))
conn.commit() conn.commit()
if cursor.rowcount == 0: if cursor.rowcount == 0:

View File

@ -92,48 +92,64 @@
}; };
$(document).ready(function () { $(document).ready(function () {
$('#folder-tree').jstree({ // Получаем ID папки "Несортированные" перед инициализацией дерева
'core': { $.getJSON(`${API_URL}/folders`, function (folders) {
'data': function (node, cb) { const unsortedFolder = folders.find(f => f.name === 'Несортированные');
$.getJSON(`${API_URL}/folders`, function (data) { const unsortedFolderId = unsortedFolder ? unsortedFolder.id : null;
const treeData = [
{ id: "root", text: "Корень", parent: "#" } // Инициализация дерева папок
].concat(data.map(folder => ({ $('#folder-tree').jstree({
id: folder.id, 'core': {
text: `${folder.name} <span class="folder-actions">` + 'data': function (node, cb) {
`<button onclick="editFolder(${folder.id}, '${folder.name}')">✏️</button>` + $.getJSON(`${API_URL}/folders`, function (data) {
`<button onclick="deleteFolder(${folder.id})">🗑️</button></span>`, const treeData = [
parent: folder.parent_id ? folder.parent_id : "root" { id: "root", text: "Корень", parent: "#" }
}))); ].concat(data.map(folder => ({
cb(treeData); 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 : "root"
})));
cb(treeData);
});
},
'check_callback': true
}, },
'check_callback': true 'plugins': ['dnd', 'html_data']
}, }).on('select_node.jstree', function (e, data) {
'plugins': ['dnd', 'html_data'] selectedFolderId = data.node.id === "root" ? null : data.node.id;
}).on('select_node.jstree', function (e, data) { loadInstalls(selectedFolderId);
selectedFolderId = data.node.id === "root" ? null : data.node.id; });
loadInstalls(selectedFolderId);
});
$('#installs-list').on('dragstart', '.install-item', function (e) { // Автоматически выбираем "Несортированные" при загрузке
e.originalEvent.dataTransfer.setData('text/plain', $(this).data('id')); if (unsortedFolderId) {
}); setTimeout(() => {
$('#folder-tree').jstree('select_node', unsortedFolderId);
$('#folder-tree').on('dragover', function (e) { loadInstalls(unsortedFolderId);
e.preventDefault(); }, 100); // Небольшая задержка, чтобы дерево инициализировалось
}).on('drop', function (e) { } else {
e.preventDefault(); loadInstalls(null);
const installId = e.originalEvent.dataTransfer.getData('text'); $('#folder-tree').jstree('select_node', 'root');
let targetFolderId = $(e.target).closest('.jstree-node').attr('id');
if (installId && targetFolderId) {
targetFolderId = targetFolderId === "root" ? null : targetFolderId;
moveInstallToFolder(installId, targetFolderId);
} }
});
loadInstalls(null); // Drag-and-drop для записей
$('#folder-tree').jstree('select_node', 'root'); $('#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();
}).on('drop', function (e) {
e.preventDefault();
const installId = e.originalEvent.dataTransfer.getData('text');
let targetFolderId = $(e.target).closest('.jstree-node').attr('id');
if (installId && targetFolderId) {
targetFolderId = targetFolderId === "root" ? null : targetFolderId;
moveInstallToFolder(installId, targetFolderId);
}
});
});
}); });
function loadInstalls(folderId) { function loadInstalls(folderId) {
@ -249,6 +265,13 @@
}); });
$('#folder-tree').jstree(true).refresh(); $('#folder-tree').jstree(true).refresh();
loadInstalls(selectedFolderId); loadInstalls(selectedFolderId);
},
error: function (xhr, status, error) {
if (xhr.status === 403) {
alert("Нельзя удалить папку 'Несортированные'.");
} else {
console.error("Ошибка удаления:", status, error);
}
} }
}); });
} }