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);
+ }
}
});
}