diff --git a/app.py b/app.py index 19dcfdd..24b522b 100644 --- a/app.py +++ b/app.py @@ -40,7 +40,7 @@ CREATE TABLE IF NOT EXISTS installs ( """) conn.commit() -# Проверяем/создаем папку "Несортированные" +# Проверяем/создаем папку "Несортированные" и получаем её ID cursor.execute("SELECT id FROM folders WHERE name = 'Несортированные'") unsorted_folder = cursor.fetchone() if not unsorted_folder: @@ -98,6 +98,12 @@ def update_folder(folder_id: int, folder: FolderUpdate): @app.delete("/api/folders/{folder_id}") 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,)) conn.commit() if cursor.rowcount == 0: diff --git a/templates/index.html b/templates/index.html index 6f0d87b..700f34e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -92,48 +92,64 @@ }; $(document).ready(function () { - $('#folder-tree').jstree({ - 'core': { - 'data': function (node, cb) { - $.getJSON(`${API_URL}/folders`, function (data) { - const treeData = [ - { id: "root", text: "Корень", parent: "#" } - ].concat(data.map(folder => ({ - id: folder.id, - text: `${folder.name} ` + - `` + - ``, - parent: folder.parent_id ? folder.parent_id : "root" - }))); - cb(treeData); - }); + // Получаем ID папки "Несортированные" перед инициализацией дерева + $.getJSON(`${API_URL}/folders`, function (folders) { + const unsortedFolder = folders.find(f => f.name === 'Несортированные'); + const unsortedFolderId = unsortedFolder ? unsortedFolder.id : null; + + // Инициализация дерева папок + $('#folder-tree').jstree({ + 'core': { + 'data': function (node, cb) { + $.getJSON(`${API_URL}/folders`, function (data) { + const treeData = [ + { id: "root", text: "Корень", parent: "#" } + ].concat(data.map(folder => ({ + id: folder.id, + text: `${folder.name} ` + + `` + + ``, + 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) { - selectedFolderId = data.node.id === "root" ? null : data.node.id; - loadInstalls(selectedFolderId); - }); + 'plugins': ['dnd', 'html_data'] + }).on('select_node.jstree', function (e, data) { + 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')); - }); - - $('#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); + // Автоматически выбираем "Несортированные" при загрузке + if (unsortedFolderId) { + setTimeout(() => { + $('#folder-tree').jstree('select_node', unsortedFolderId); + loadInstalls(unsortedFolderId); + }, 100); // Небольшая задержка, чтобы дерево инициализировалось + } else { + loadInstalls(null); + $('#folder-tree').jstree('select_node', 'root'); } - }); - loadInstalls(null); - $('#folder-tree').jstree('select_node', 'root'); + // 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(); + }).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) { @@ -249,6 +265,13 @@ }); $('#folder-tree').jstree(true).refresh(); loadInstalls(selectedFolderId); + }, + error: function (xhr, status, error) { + if (xhr.status === 403) { + alert("Нельзя удалить папку 'Несортированные'."); + } else { + console.error("Ошибка удаления:", status, error); + } } }); }