unsorted
parent
e26ffa1953
commit
30ae8b76b6
8
app.py
8
app.py
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue