日程详情:只读日历不再给「编辑日程」入口 laoyang/FamilyBook#31

真机(DEL-AL20 / HarmonyOS 7.0.0.109)实测发现:只读共享本(如「工作学习」)
里的日程,首页详情卡仍显示「编辑日程」,用户改完点保存才被服务端拒:
「保存失败:这本日历你没有写权限。」

根因是 canEdit 写死 true,只判了 isEditableEvent(kind/id/calId),
没判这本日历能不能写。

- Types.ets 新增 isEventWritable(e, books):复用 FbCalBook.canWrite 口径
  (由 FbCalRepo.fetchBooks 依 /calendar/books 的 kind+perm 算出),
  不与写权限推导逻辑重复;books 缺失时判为不可编辑(宁可少给入口)
- FbHomePage:canEdit 由写死 true 改为按写权限判定;
  openEvent 里顺手预加载 calBooks(原本懒加载,进详情时还是空数组,
  会把本来能编辑的日程也误判成只读)
- FbCalendarPage:同步改用 isEventWritable,两处口径一致

真机复验:只读日程详情只剩「导航」;有权限的日程「编辑日程」正常,
改标题保存后杀进程重启仍在(确认真落库)。
This commit is contained in:
2026-10-29 20:39:52 +08:00
parent fd3ea53086
commit f90cae0dcc
3 changed files with 54 additions and 4 deletions
+30
View File
@@ -641,6 +641,36 @@ export function isEditableEvent(e: FbCalEvent): boolean {
return e.kind === 'custom' && e.id > 0 && e.calId > 0;
}
/**
* 这个日程**现在能不能真的改**(决定详情卡要不要给「编辑日程」入口)。
*
* 🔴 2026-10-29 真机实测发现的问题(工单 laoyang/FamilyBook#31):
* 首页只判了 `isEditableEvent()`(kind/id/calId),**没判写权限**,
* 于是「工作学习」这种只读共享本里的日程照样显示「编辑日程」,
* 用户改完点保存才被服务端拒:「保存失败:这本日历你没有写权限。」
* ⇒ 能做什么要在**入口处**就说清,不能让用户白改一遍。
*
* 写权限口径与 `FbCalRepo.fetchBooks()` 一致(它按 `/calendar/books` 的
* `kind` + `perm` 算出 `FbCalBook.canWrite`),这里直接复用那个布尔值,
* 不再自行推导,避免两处漂移。
*
* @param e 要判定的日程
* @param books 当前账号的日历本列表(拿不到时**判为不可编辑**,
* 宁可少给入口,也不让用户改完才报错)
*/
export function isEventWritable(e: FbCalEvent, books: FbCalBook[]): boolean {
if (!isEditableEvent(e)) {
return false;
}
for (const b of books) {
if (b.id === e.calId) {
return b.canWrite;
}
}
/* 找不到这本 ⇒ 不认(可能是权限被撤、本被删,或 books 还没加载完) */
return false;
}
/** 日历本(calendar/calendars) */
export interface FbCalBook {
id: number;