@@ -1509,6 +1509,12 @@ INDEX_TEMPLATE = '''
</label>
</div>
</div>
<div class= " mb-3 " >
<label class= " form-label " >所属文件夹</label>
<select id= " addFolder " class= " form-select " >
<option value= " " >未分类(根目录)</option>
</select>
</div>
</form>
</div>
<div class= " modal-footer " >
@@ -1623,6 +1629,12 @@ INDEX_TEMPLATE = '''
</label>
</div>
</div>
<div class= " mb-3 " >
<label class= " form-label " >所属文件夹</label>
<select id= " editFolder " class= " form-select " >
<option value= " " >未分类(根目录)</option>
</select>
</div>
</form>
</div>
<div class= " modal-footer " >
@@ -2213,6 +2225,8 @@ document.addEventListener('DOMContentLoaded', async () => {
// 编辑时类型切换
document.getElementById( ' editType ' ).addEventListener( ' change ' , (e) => {
updateEditFieldsByType(e.target.value);
// 切换类型时更新文件夹列表
loadFolderSelect(e.target.value, ' editFolder ' );
});
// 搜索 - 直接绑定,不用 debounce
@@ -2716,6 +2730,9 @@ function showAddModal(type) {
// 打开弹窗
new bootstrap.Modal(document.getElementById( ' addModal ' )).show();
// 加载该类型下的文件夹列表
loadFolderSelect(type, ' addFolder ' , currentAddFolderId);
// 启动自动保存
startAutoSave();
@@ -2744,7 +2761,7 @@ async function addItem() {
note: document.getElementById( ' addNote ' ).value,
tags: document.getElementById( ' addTags ' ).value.split( ' , ' ).map(t => t.trim()).filter(t => t),
is_starred: document.getElementById( ' addStarred ' ).checked,
folder_id: currentAddFolderId // 如果从文件夹添加, 带上文件夹ID
folder_id: document.getElementById( ' addFolder ' ).value ? parseInt(document.getElementById( ' addFolder ' ).value) : currentAddFolderId
};
const res = await fetch(`$ {API_BASE} /items`, {
@@ -3307,6 +3324,9 @@ async function openEditModal(id) {
// 设置重点关注状态
document.getElementById( ' editStarred ' ).checked = item.is_starred === 1;
// 加载文件夹列表并设置当前文件夹
await loadFolderSelect(type, ' editFolder ' , item.folder_id);
// 保存原始数据用于比较
window.editOriginalData = {
type,
@@ -3395,7 +3415,8 @@ async function saveEdit() {
due_date: type === ' todo ' ? document.getElementById( ' editDueDate ' ).value : null,
note: document.getElementById( ' editNote ' ).value,
tags: document.getElementById( ' editTags ' ).value.split( ' , ' ).map(t => t.trim()).filter(t => t),
is_starred: document.getElementById( ' editStarred ' ).checked ? 1 : 0
is_starred: document.getElementById( ' editStarred ' ).checked ? 1 : 0,
folder_id: document.getElementById( ' editFolder ' ).value ? parseInt(document.getElementById( ' editFolder ' ).value) : null
};
try {
@@ -4391,6 +4412,9 @@ function showAddToFolderModal(type, folderId) {
// 打开弹窗
new bootstrap.Modal(document.getElementById( ' addModal ' )).show();
// 加载该类型下的文件夹列表,并选中指定文件夹
loadFolderSelect(type, ' addFolder ' , folderId);
// 启动自动保存
startAutoSave();
@@ -4404,6 +4428,24 @@ function showAddToFolderModal(type, folderId) {
// 当前新增时的文件夹ID
let currentAddFolderId = null;
// 加载文件夹选择列表
async function loadFolderSelect(type, selectId, selectedFolderId = null) {
const res = await fetch(`$ {API_BASE} /folders?type=$ {type} `);
const data = await res.json();
const select = document.getElementById(selectId);
if (!select) return;
select.innerHTML = ' <option value= " " >未分类(根目录)</option> ' ;
if (data.success && data.data.length > 0) {
data.data.forEach(f => {
const selected = f.id == selectedFolderId ? ' selected ' : ' ' ;
select.innerHTML += `<option value= " $ {f.id} " $ {selected} >$ {f.name} </option>`;
});
}
}
function filterByFolder(type, folderId) {
// 更新侧边栏选中状态
document.querySelectorAll( ' .sidebar a ' ).forEach(a => a.classList.remove( ' active ' ));