laoyang
|
17d7602d7d
|
重复日程:新增结束条件(到某天/共几次);修复仅这一次失效与标题被清空
新增能力:
- 新建重复日程时可设"结束条件":永不结束 / 重复到某天 / 共重复几次
(之前只能选重复频率,无法指定次数或截止日期)
- 编辑既有重复日程会**回显**服务器上已有的 COUNT / UNTIL 并可修改
修复三个真 bug:
1. ⭐ "仅这一次"失效(实际改了全部):重复日程在列表里展开后,所有次共用
主事件的 id,编辑页只拿到 id、拿不到"用户点的是哪一次" → occStartMs 被当成
主事件的第一次发生 → EXDATE 排除的是第一次、覆盖行写在第一次上,
用户当次既没排掉、系列属性又被动过,看起来就是"全改了"。
修法:Index 打开编辑页时用 pendingOccurrenceTs 传入被点那次的 startTime;
seriesBoundaries 再把该时刻"吸附"到真实发生(容差 12h),确保 EXDATE 能匹配。
2. ⭐ 已有标题被删空:original 快照漏拷贝 title/description/location/reminders,
restoreRowById 于是把主事件行还原成空标题。
修法:快照补全全部字段。
3. ⭐ setExdate/setRrule 被 restoreRowById 覆盖(顺序错误):
先写 EXDATE 再还原 → 快照里的旧 exdate 又把排除覆盖掉。
修法:一律"先还原主事件行、再写 EXDATE/截断 RRULE"。
其它:
- 编辑页现在显示"被点那一次"的实际时间(此前显示的是主事件第一次的时间)
- 'all' 分支改为把改动写到主事件行,整系列一起改
- 复用唯一底部弹层(新增 sheetMode='repeatEnd' 选截止日期),仍保持只挂 1 个 bindSheet
|
2026-10-10 07:05:32 +08:00 |
|
laoyang
|
cd2401242c
|
修复:编辑页挂了两个 bindSheet 导致时间选择框弹不出来
症状(用户反馈,本轮改动引入的回归):编辑/新建日程时点开始或结束时间,
白框一闪而过、日期时间选择器不出现。
根因:ArkUI 同一组件**只支持一个 bindSheet**,后挂的会覆盖先挂的。
上一轮新增"重复日程范围选择"弹层时,在同一根容器上挂了第二个 bindSheet,
于是它把原有的"时间选择"弹层顶掉了 —— 表现正是白框一闪即消失。
修法:合并为**唯一**一个 bindSheet,用 sheetMode 区分内容:
- sheetMode='picker' → 日期/时间选择(高度 380)
- sheetMode='scope' → 重复日程范围选择(高度 320)
新增 bottomSheet() builder 按模式分发;原 pickerShow/scopeConfirmShow
两个状态合并为 sheetShow + sheetMode。
|
2026-10-09 22:41:17 +08:00 |
|
laoyang
|
5e6f347fc6
|
修复:编辑重复日程缺范围选择;同步并发不再误报失败
问题1(用户反馈):删除重复日程有"仅这一次/此次及以后/全部"三选项,编辑却没有。
根因:save() 把 validate() 与 chosenBook() 检查放在 isSeriesOccurrence() **之前**,
任一不满足即提前 return,永远到不了范围选择弹层;delete 路径则是先判范围。
修法:
- save() 把"重复日程先选范围"提到最前(与删除路径一致),校验推迟到 doSave() 内
- chosenBook() 增加兜底:展开编辑时若该日程所属日历本不在"可写清单"里
(被标记只读/写权限探测失败),用该日程自己的 calKey/href 构造目标;
initPage 里还会用 CalendarDataBridge.lookupBook 把它补进选择列表(带真实名称/颜色)
- 新增 original 原始行快照:doSave 会就地改写 this.event 的 calKey/startTime,
而 EXDATE/UNTIL/拆系列必须依据原值 —— 否则范围计算用错系列
- applySeriesEdit 的 one/future 分支在改写当前行后,用 EventDb.restoreRowById 还原原行,
避免原系列残留幽灵行
- 加保存判定日志(脱敏)便于诊断
问题2(用户反馈):同步进行中再点手动同步/账号管理确定,提示"同步失败"造成误解。
根因:互斥锁抛的是普通 Error,三个调用点统一按"失败"提示。
修法:
- SyncEngine 新增 SyncBusyError 专用类型 + isSyncing/isAnySyncing 查询;
锁命中时抛 SyncBusyError,且 catch 不再把它包成普通 Error
- Index.syncSingle / AccountsPage.syncSingleAccount:命中→提示
"有同步任务正在进行中,请耐心等待",不显示失败
- Index.syncAll:命中记为 busySkipped(不算失败),全部被跳过时也只提示等待
|
2026-10-09 22:19:31 +08:00 |
|
laoyang
|
5c80c0b773
|
重复日程支持单次/后续/全部范围;时间轴刻度改为 8-18 固定
重复日程编辑与删除:
- 编辑或删除重复日程前先让用户选范围:仅这一次 / 此次及以后 / 全部
- 仅这一次:主事件加 EXDATE 排除该次,另插一条带 RECURRENCE-ID 的覆盖行
- 此次及以后:主事件 RRULE 加 UNTIL 截断,剩余部分拆成新 uid 的新系列
- 全部:删除/改写整个系列
- IcsUtil 新增 vevent / buildSeries / rruleWithUntil / fmtIcsTime:
同一个 .ics 资源内写主事件 + 全部覆盖实例(标准写法),
此前对覆盖实例直接跳过推送、导致单次改动无法上传服务器
- SyncEngine.pushSeries:按 uid 取全系列行重建整份 .ics 后一次性 PUT
- EventDb 新增 queryByUid / purgeByUid / purgeByUidFrom / reassignOverridesFrom /
setExdate / setRruleForUid
时间轴刻度(App + 4x4/6x6 卡片同口径):
- 8:00~18:00 恒定显示;仅当 8 点前 / 18 点后有日程时才向该侧扩展,
其余时刻不再出现'只有一条日程就只剩一小段刻度'的观感
|
2026-10-09 21:40:53 +08:00 |
|
laoyang
|
d5e5d54d35
|
账号页空状态的「+」可点击;版本号升至 0.0.5(versionCode 500)
- AccountsPage.emptyState 的「+」改为可点击按钮,直接进入添加 CalDAV 账号页
(此前只是静态图标,点了没反应);提示文案同步更新
- 版本号 0.0.4 → 0.0.5
|
2026-10-09 19:23:29 +08:00 |
|
laoyang
|
c76c78b8a6
|
删除 CalDAV 账号时一并清除其系统日历镜像本
问题:在 App 里删除一个 CalDAV 账号后,之前镜像进系统日历的日历本
(synccalendar.mirror.<accId>-<hash> 账户) 仍留在系统日历里,形成幽灵账户。
真机实测确认:账号 1789564608312 已删,其名下 13 个镜像账户仍在(KEEP)。
根因:
- AccountsPage.confirmDeleteAccount 只清账号配置+本地库+设置,完全不碰系统日历;
- 自动兜底也失效:SystemCalendarMirror.syncNow 在解析不到任何选中本时提前 return,
删完账号后正是此状态,purgeOrphans 永不执行。
修复:
- SystemCalendarMirror.removeByAccount(accId):按 'mirror.<accId>-' 前缀删除该账号全部
镜像账户(兼容历史 '<accId>_' 桶名),逐个独立 try/catch + 清空日程降级;
绝不按 displayName 匹配 —— 不同账号下的同名日历本不会误删;同步清快照与选中项设置。
- AccountsPage 删除账号时先 removeByAccount(必须在改账号配置前,否则 bookId 解析不出)。
- EditAccountPage 取消勾选日历本时删除其镜像账户(用 href 算稳定 bookId)。
- SettingsPage 账号库重置时 removeAll。
- syncNow 提前 return 前加 purgeOrphanAccountMirrors 兜底,带安全阀(账号列表为空即跳过,
防读失败误删全量)。
|
2026-10-09 08:47:50 +08:00 |
|
laoyang
|
32162b8f04
|
修复折叠屏合盖旋转不再切换布局的回归
上一版为满足"接近1:1屏幕横竖屏布局一致",把宽屏判据改成纯短边≥840vp,
导致长条形屏幕(普通手机、折叠屏合上后的外屏)旋转横屏也不出双栏。
现在两条判据满足其一即双栏:
① 短边≥840vp(展开态/平板)——旋转不变,维持商店合规要求;
② 横屏且宽高比≥1.5(长条形屏幕)——旋转正常切换,恢复 0.0.2 行为。
判据实现由 mediaquery 改为 windowSizeChange(px→vp),旋转/折叠展开均实时生效,
并记录窗口尺寸日志便于真机排查。
|
2026-09-29 09:09:06 +08:00 |
|
laoyang
|
b83ce83d43
|
版本号升至 0.0.4(versionCode 400)
|
2026-09-29 08:46:48 +08:00 |
|
laoyang
|
d0b8720c41
|
同步容错:服务器删除日历本后 404 不再导致整个账号同步失败
- DavClient 新增 DavHttpError(带 HTTP 状态码),REPORT/PUT/DELETE 统一抛出
- 同步引擎对单本 404 跳过并自动从账号移除(先按 href 清行再迁移序号),
全部日历本均 404 时保留账号配置并给出明确提示
- 推送阶段单条失败不再中断整个账号(401 凭据失效仍立即抛出)
- 编辑账号保存与自动移除都在序号迁移前先删被移除日历本的行,
修复行混入其它日历本 calKey 的老问题(实测「读书」988 行混进「轻舟」)
- applyRemote 刷新行的 href:日历本被删除重建后集合 URL 变化,
旧行不再残留死地址(编辑推送 404 / 永久卡待推送)
- pruneOrphanRows 追加 href 维度兜底清扫(跳过 dirty 行)
|
2026-09-29 08:46:01 +08:00 |
|
laoyang
|
8b5519bc31
|
更新 README:补充系统日历镜像、后台同步与备份、深色/沉浸式/大屏横竖屏与转场适配、设置项一览、隐私与权限策略、工程结构、构建说明、截图与相关链接;按现状修正视图与卡片描述
|
2026-09-28 15:23:54 +08:00 |
|
laoyang
|
2f4657ced3
|
上架自检两项整改:横竖屏布局一致性 + 页面转场改为淡入淡出(弹簧曲线)
一、横竖屏(意见 1:折叠屏展开态 / 平板需支持横竖屏切换;接近 1:1 的设备横竖屏布局需保持一致)
- 主界面布局判据由"是否横屏 (orientation: landscape)"改为"窗口短边是否达到大屏断点 840vp":
min(宽,高) >= 840vp 等价于 (width >= 840vp) && (height >= 840vp),用两条 mediaquery 合成。
- 短边在旋转时不变(宽高互换),因此横竖屏布局天然保持一致 —— 屏幕比例接近 1:1 的设备
(折叠屏展开态、平板)在旋转时不会再出现"单栏 ⇄ 双栏"的布局跳变。
- 不锁死屏幕方向(module.json5 仍为 auto_rotation_restricted),折叠屏展开态与平板
依旧可以自由横竖屏切换显示。
二、转场动效(意见 2:使用系统转场,淡入淡出,曲线优先弹簧曲线)
- 全部 7 个 @Entry 页面新增 pageTransition():只做 opacity 淡入淡出,
不调用 .slide() / .translate(),即不做左右平移 / 上下位移 / 单帧直接切换。
- 转场曲线使用 curves.springMotion() 弹簧曲线。
|
2026-09-28 14:20:14 +08:00 |
|
laoyang
|
76d82886e4
|
修复了进入日历没有日程卡片的bug。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-16 12:34:39 +08:00 |
|
laoyang
|
cc7523a8ec
|
修复了从卡片进入日历无法定位当前日期的bug。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-16 11:38:01 +08:00 |
|
laoyang
|
314ed4b75c
|
删除了设置页面中的功能引导选项。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-16 10:29:46 +08:00 |
|
laoyang
|
2173b06b43
|
新增了列表显示模式,用户可以在设置中进行选择。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-16 10:07:57 +08:00 |
|
laoyang
|
5ab9648b5a
|
修复了新增日历本颜色不对的问题。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-15 23:03:58 +08:00 |
|
laoyang
|
c53456a2e1
|
修复了添加账号时全选状态错误问题。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-15 16:28:02 +08:00 |
|
laoyang
|
7216024204
|
更改设置中软件特性和用户帮助为链接形式。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-15 16:09:34 +08:00 |
|
laoyang
|
7cf9203ec3
|
修改了用户协议等打开方式。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-15 15:07:42 +08:00 |
|
laoyang
|
297f76f00d
|
增加了几个截图,用来展示效果。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-15 12:52:22 +08:00 |
|
laoyang
|
5eaeeb0f4c
|
增强了安全配置。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-15 12:51:58 +08:00 |
|
laoyang
|
088f7b3773
|
增加了用户隐私协议等,增加了引导卡片。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-15 09:06:15 +08:00 |
|
laoyang
|
a7503a7a1f
|
更改了readme
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-14 22:02:03 +08:00 |
|
laoyang
|
64a58170ac
|
更改了几处交互逻辑。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-14 21:53:15 +08:00 |
|
laoyang
|
c04a9a28cf
|
更改了日程的样式显示,现在按照时间轴显示。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-14 21:28:51 +08:00 |
|
laoyang
|
df3928c099
|
更改了2x4卡片的样式。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-14 11:09:15 +08:00 |
|
laoyang
|
fa152415cd
|
为日程列表增加了一条当前时间的横线,用来表示当前进度。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-14 10:18:31 +08:00 |
|
laoyang
|
3c9b4dcfdd
|
1.修改了2x2的卡片样式。
2.为卡片增加了添加按钮,可以通过卡片直接添加日程。
Signed-off-by: Yang Yongquan <i@yangyq.net>
|
2026-09-14 09:07:47 +08:00 |
|
laoyang
|
d1252ed2b7
|
1.修改了设置页面的展示顺序。
2.在设置页面新增了软件特性和使用帮助。
3.设置页面中,静音和只读合并。
|
2026-09-14 08:24:36 +08:00 |
|
laoyang
|
5b6be08d9a
|
完成了用户账户加密,更改了只读日程的显示样式;日程中的地址,可以通过高德地图导航了。
|
2026-09-14 07:55:52 +08:00 |
|
laoyang
|
6899a5074b
|
修改了通知相关的功能,能够正常通知了。
|
2026-09-13 23:35:52 +08:00 |
|
laoyang
|
e62416e5ce
|
为了持续同步,申请了常驻通知栏权限,在设置中开启后,可以常驻通知栏,进行后台同步。如果不需要,可以在设置中关闭。
|
2026-09-13 22:02:08 +08:00 |
|
laoyang
|
d9c212785d
|
新增了提醒静音功能,可以在设置中关闭某个日历本的提醒。
|
2026-09-13 21:56:51 +08:00 |
|
laoyang
|
0fef40c7f3
|
修复了部分日程没有提醒时间的问题。
|
2026-09-13 21:50:28 +08:00 |
|
laoyang
|
04fdf3d386
|
1.增加了重力感应,也就是横屏响应式布局。
2.修改了沉浸式布局。
3.修改了添加日程和编辑日程页面,增加了重复、提醒等功能。
4.修改了权限问题,如果日历本是只读,则有删除线做标识。同时,对于只读的日程,点击后将不再进入编辑页面,而是展示详情。
5.系统日历的处理。给用户两个选择,第一个选择就是只显示系统日历。第二种选择,用户可以选择一个caldav账户中的某一个日历本,把系统日历中的日程,包括日历日程和应用创建的日程,都读取出来,然后加入到这个日历本下,最后同步到caldav的服务器上,这样的好处是,手机丢失了,或者换了手机品牌型号,手机上的日程仍然在自己的caldav服务器上有一个备份。当然,系统日历中的caldav日历,就不会再读取了。
|
2026-09-13 20:25:18 +08:00 |
|
laoyang
|
61bd6fc75f
|
修复了重复日历第一次不显示的问题。
|
2026-09-13 17:48:39 +08:00 |
|
laoyang
|
e0c6aa46d0
|
删除了日视图,感觉跟列表视图差不多,有点鸡肋。周视图改为和月视图一样,左右滑动进行切换。
|
2026-09-13 16:44:33 +08:00 |
|
laoyang
|
e27c8c36d7
|
添加了后台同步功能,应用置于后台,仍然可以进行同步。
|
2026-09-13 16:33:53 +08:00 |
|
laoyang
|
0a204b6754
|
修复了卡片显示bug。如果有跨多天的日程,卡片会从多天日程的开始那一天开始显示,已经修复了。
|
2026-09-13 16:18:56 +08:00 |
|
laoyang
|
7091cc9535
|
增加了readme文档。
|
2026-09-13 16:12:19 +08:00 |
|
laoyang
|
2af19637b6
|
在日历首页上,将按钮进行合并收拢,放在一个设置按钮下。
|
2026-09-13 16:08:03 +08:00 |
|
laoyang
|
c1543a0e33
|
add LICENSE.
Signed-off-by: 老杨 <i@yangyq.net>
|
2026-09-13 08:02:50 +00:00 |
|
laoyang
|
bbb3ec5334
|
首次提交:SyncCalendar 项目
|
2026-09-13 15:50:37 +08:00 |
|