(afterItemId?: string)
| 40 | |
| 41 | // 计算新项目的插入位置和 order,并更新同级项目的 order |
| 42 | async function prepareInsertPosition(afterItemId?: string): Promise<{ |
| 43 | parentFolderId: string | undefined |
| 44 | order: number |
| 45 | }> { |
| 46 | const { page, folder, tab } = stores |
| 47 | |
| 48 | // 查找参考项目 |
| 49 | let referenceItem: PageRecord | PageFolder | null = null |
| 50 | if (afterItemId) { |
| 51 | referenceItem = page.getById(afterItemId) || folder.getById(afterItemId) || null |
| 52 | } |
| 53 | if (!referenceItem) { |
| 54 | const activeTab = tab.tabs.find((t) => t.id === tab.activeTabId) |
| 55 | referenceItem = activeTab?.dataId ? page.getById(activeTab.dataId) || null : null |
| 56 | } |
| 57 | |
| 58 | let parentFolderId: string | undefined |
| 59 | let newOrder: number |
| 60 | |
| 61 | if (referenceItem) { |
| 62 | parentFolderId = referenceItem.parentFolderId |
| 63 | newOrder = (referenceItem.order ?? 0) + 1 |
| 64 | } else { |
| 65 | parentFolderId = undefined |
| 66 | newOrder = 0 |
| 67 | } |
| 68 | |
| 69 | // 批量更新同级中 order >= newOrder 的项目 |
| 70 | const pagesToUpdate = page.pages.filter( |
| 71 | (p) => p.parentFolderId === parentFolderId && (p.order ?? 0) >= newOrder |
| 72 | ) |
| 73 | const foldersToUpdate = folder.folders.filter( |
| 74 | (f) => f.parentFolderId === parentFolderId && (f.order ?? 0) >= newOrder |
| 75 | ) |
| 76 | |
| 77 | // 使用批量更新,避免 N 次 DB 写入和渲染 |
| 78 | if (pagesToUpdate.length > 0) { |
| 79 | await page.updateMany( |
| 80 | pagesToUpdate.map((p) => ({ id: p.id, changes: { order: (p.order ?? 0) + 1 } })) |
| 81 | ) |
| 82 | } |
| 83 | if (foldersToUpdate.length > 0) { |
| 84 | await folder.updateMany( |
| 85 | foldersToUpdate.map((f) => ({ id: f.id, changes: { order: (f.order ?? 0) + 1 } })) |
| 86 | ) |
| 87 | } |
| 88 | |
| 89 | return { parentFolderId, order: newOrder } |
| 90 | } |
| 91 | |
| 92 | // 创建新页面 |
| 93 | export async function createPage( |
no test coverage detected