feat(v4.3.0): 新增/编辑弹框中添加文件夹选择
- 新增数据时可选择所属文件夹 - 编辑数据时可更改所属文件夹 - 切换类型时自动更新文件夹列表
This commit is contained in:
@@ -1509,6 +1509,12 @@ INDEX_TEMPLATE = '''
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">所属文件夹</label>
|
||||||
|
<select id="addFolder" class="form-select">
|
||||||
|
<option value="">未分类(根目录)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
@@ -1623,6 +1629,12 @@ INDEX_TEMPLATE = '''
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">所属文件夹</label>
|
||||||
|
<select id="editFolder" class="form-select">
|
||||||
|
<option value="">未分类(根目录)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
@@ -2213,6 +2225,8 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||||||
// 编辑时类型切换
|
// 编辑时类型切换
|
||||||
document.getElementById('editType').addEventListener('change', (e) => {
|
document.getElementById('editType').addEventListener('change', (e) => {
|
||||||
updateEditFieldsByType(e.target.value);
|
updateEditFieldsByType(e.target.value);
|
||||||
|
// 切换类型时更新文件夹列表
|
||||||
|
loadFolderSelect(e.target.value, 'editFolder');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 搜索 - 直接绑定,不用 debounce
|
// 搜索 - 直接绑定,不用 debounce
|
||||||
@@ -2716,6 +2730,9 @@ function showAddModal(type) {
|
|||||||
// 打开弹窗
|
// 打开弹窗
|
||||||
new bootstrap.Modal(document.getElementById('addModal')).show();
|
new bootstrap.Modal(document.getElementById('addModal')).show();
|
||||||
|
|
||||||
|
// 加载该类型下的文件夹列表
|
||||||
|
loadFolderSelect(type, 'addFolder', currentAddFolderId);
|
||||||
|
|
||||||
// 启动自动保存
|
// 启动自动保存
|
||||||
startAutoSave();
|
startAutoSave();
|
||||||
|
|
||||||
@@ -2744,7 +2761,7 @@ async function addItem() {
|
|||||||
note: document.getElementById('addNote').value,
|
note: document.getElementById('addNote').value,
|
||||||
tags: document.getElementById('addTags').value.split(',').map(t => t.trim()).filter(t => t),
|
tags: document.getElementById('addTags').value.split(',').map(t => t.trim()).filter(t => t),
|
||||||
is_starred: document.getElementById('addStarred').checked,
|
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`, {
|
const res = await fetch(`${API_BASE}/items`, {
|
||||||
@@ -3307,6 +3324,9 @@ async function openEditModal(id) {
|
|||||||
// 设置重点关注状态
|
// 设置重点关注状态
|
||||||
document.getElementById('editStarred').checked = item.is_starred === 1;
|
document.getElementById('editStarred').checked = item.is_starred === 1;
|
||||||
|
|
||||||
|
// 加载文件夹列表并设置当前文件夹
|
||||||
|
await loadFolderSelect(type, 'editFolder', item.folder_id);
|
||||||
|
|
||||||
// 保存原始数据用于比较
|
// 保存原始数据用于比较
|
||||||
window.editOriginalData = {
|
window.editOriginalData = {
|
||||||
type,
|
type,
|
||||||
@@ -3395,7 +3415,8 @@ async function saveEdit() {
|
|||||||
due_date: type === 'todo' ? document.getElementById('editDueDate').value : null,
|
due_date: type === 'todo' ? document.getElementById('editDueDate').value : null,
|
||||||
note: document.getElementById('editNote').value,
|
note: document.getElementById('editNote').value,
|
||||||
tags: document.getElementById('editTags').value.split(',').map(t => t.trim()).filter(t => t),
|
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 {
|
try {
|
||||||
@@ -4391,6 +4412,9 @@ function showAddToFolderModal(type, folderId) {
|
|||||||
// 打开弹窗
|
// 打开弹窗
|
||||||
new bootstrap.Modal(document.getElementById('addModal')).show();
|
new bootstrap.Modal(document.getElementById('addModal')).show();
|
||||||
|
|
||||||
|
// 加载该类型下的文件夹列表,并选中指定文件夹
|
||||||
|
loadFolderSelect(type, 'addFolder', folderId);
|
||||||
|
|
||||||
// 启动自动保存
|
// 启动自动保存
|
||||||
startAutoSave();
|
startAutoSave();
|
||||||
|
|
||||||
@@ -4404,6 +4428,24 @@ function showAddToFolderModal(type, folderId) {
|
|||||||
// 当前新增时的文件夹ID
|
// 当前新增时的文件夹ID
|
||||||
let currentAddFolderId = null;
|
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) {
|
function filterByFolder(type, folderId) {
|
||||||
// 更新侧边栏选中状态
|
// 更新侧边栏选中状态
|
||||||
document.querySelectorAll('.sidebar a').forEach(a => a.classList.remove('active'));
|
document.querySelectorAll('.sidebar a').forEach(a => a.classList.remove('active'));
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ class Database:
|
|||||||
|
|
||||||
def update_item(self, item_id: int, **kwargs) -> bool:
|
def update_item(self, item_id: int, **kwargs) -> bool:
|
||||||
"""更新条目"""
|
"""更新条目"""
|
||||||
allowed_fields = ['type', 'title', 'content', 'url', 'source', 'status', 'priority', 'due_date', 'note', 'is_starred']
|
allowed_fields = ['type', 'title', 'content', 'url', 'source', 'status', 'priority', 'due_date', 'note', 'is_starred', 'folder_id']
|
||||||
update_fields = {k: v for k, v in kwargs.items() if k in allowed_fields}
|
update_fields = {k: v for k, v in kwargs.items() if k in allowed_fields}
|
||||||
|
|
||||||
# 只有 tags 变化也算有效更新
|
# 只有 tags 变化也算有效更新
|
||||||
|
|||||||
Reference in New Issue
Block a user