unsorted
parent
e26ffa1953
commit
30ae8b76b6
8
app.py
8
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:
|
||||
|
|
|
|||
|
|
@ -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} <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);
|
||||
});
|
||||
// Получаем 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} <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) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue