v32 第 32 批(4 条):资源共享弹框真落库 / 消息通知覆盖全部共享入口 / 浏览器通知(站内消息+日程到期提醒) / 首页任务随看板色
用户原话: ①「资源共享功能有问题,弹框中,点击共享给某个人后,弹框消失,但是并没有共享成功。」 ②「消息通知,在所有引用自己的地方,都通知,包括别人分享了日历本给自己, 分享了笔记给自己,分享了资源给自己等等。」 ③「当有消息通知时,还有日历中日程到期提醒时,比如一个日程,设置了10点开始, 提前十分钟提醒,则需要在 9:50 时浏览器中发提醒通知。」 ④「首页,近期任务,任务的文字和前面的圆点,颜色并没有跟看板颜色一致,这个需要修正。」 四条真根因: ① v28 把资源编辑改成三页签后,每个页签各有自己的 form 与 <input name=id>, 而设 id 的代码是 panel.querySelector() → 只命中文档序第一个(info 的 update), ⇒ share/att 表单的 id 恒空 ⇒ 提交 id=0 ⇒ Resource::find(familyId,0,me) 返回 null ⇒ 静默不共享。修:表单打 data-res-idform 标记 + querySelectorAll 逐个填。 ② v30 只在 saveAttendees 后调 syncForTarget,6 个共享入口一个都没接。 新增 Notification::syncShares(家庭,类型,宿主id,动作人) —— 照共享表现状重建差额 (写表后调用;漏调只会没通知,不会状态不一致)。SHARE_KINDS 抽常量。 ③ 完全没有浏览器通知。新增 Calendar::remindersBetween()(窗口留 -2 分钟防后台节流) + ?r=notifications/poll JSON 路由 + assets/js/notify.js(轮询 + Notification API + id@at 去重)+ 顶栏铃铛(权限只能用户点一下才要,自动申请会被 Chrome 静默拒绝)。 ④ v30 把用户那句和主题颜色一样理解成了**任务模块主题色**,用户要的是**看板色**。 新增 Task::boardColorById(家庭,看板id)(没设色按看板名派生稳定色),home.php 两处改 $tkColor。 验证:诊断探针 18/0、真机 25/0(真点共享→库里真的多一行;三类共享真发通知; 9:50 窗口真算出 10:00 那条;首页每条任务色 == 其看板色)、反向 5/0、 e2e 1502/0、升级 153/0、几何 428+680+92、城市 32/0。 部署脚本静态断言段本地空跑通过;线上站点自检 19 条全过,notifications/poll 未登录 302。
This commit is contained in:
@@ -90,6 +90,21 @@ $isLoggedIn = \App\Auth::check();
|
||||
<?php endforeach; ?>
|
||||
</nav>
|
||||
<div class="topbar-right">
|
||||
<?php /* 🔴 v32 第 3 条:浏览器提醒的**开关**(小铃铛)。
|
||||
用户原话:「…则需要在 9:50 时浏览器中发提醒通知。」
|
||||
⚠️ 浏览器**不会**允许"页面加载时自动申请通知权限"(Chrome 会直接静默拒绝,
|
||||
并把域名记进"滥用"名单),所以权限必须由用户**点一下**才要。
|
||||
⇒ 这里放一个按钮,由 assets/js/notify.js 绑定。
|
||||
⚠️ 已经授权时(或浏览器不支持 Notification 时)按钮自动隐藏 ——
|
||||
见 notify.js 的 paint()。所以未授权的人才会看到它。 */ ?>
|
||||
<button type="button" class="btn btn-ghost btn-icon fb-notify-enable" hidden
|
||||
title="开启浏览器提醒" aria-label="开启浏览器提醒">
|
||||
<svg viewBox="0 0 16 16" width="15" height="15" aria-hidden="true" fill="none"
|
||||
stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M4 7a4 4 0 0 1 8 0v3l1 2H3l1-2z"/>
|
||||
<path d="M6.5 12.5a1.6 1.6 0 0 0 3 0"/>
|
||||
</svg>
|
||||
</button>
|
||||
<?php /* 姓名 + 头像 = 一个下拉菜单,而不是「点名字改资料」+旁边两个裸链接。
|
||||
裸链接在窄屏只能靠 display:none 藏起来(一藏入口就没了),
|
||||
收进菜单之后同一个入口在手机上也点得到。
|
||||
@@ -161,6 +176,21 @@ $isLoggedIn = \App\Auth::check();
|
||||
</div>
|
||||
|
||||
<script src="<?= e(asset('/assets/js/app.js')) ?>"></script>
|
||||
<?php /* 🔴 v32 第 3 条:浏览器通知(站内消息 + 日程到期提醒)。
|
||||
⚠️ **只在已登录时加载** —— 登录页轮询会一直 302 去登录页,白跑。
|
||||
同理也不在"免登录的导航展示页"上跑(那页没有会话)。
|
||||
⚠️ 里面**不含**任何权限申请:权限必须由用户点小铃铛才要(见 notify.js 头部第 ①条)。 */ ?>
|
||||
<?php if (\App\Auth::check()): ?>
|
||||
<script>
|
||||
window.FB_NOTIFY = {
|
||||
poll: <?= json_encode(url('notifications/poll')) ?>,
|
||||
list: <?= json_encode(url('notifications')) ?>,
|
||||
icon: <?= json_encode(asset('/assets/icons/icon-96.png')) ?>,
|
||||
canPush: <?= json_encode(\App\Auth::canWrite()) ?>
|
||||
};
|
||||
</script>
|
||||
<script src="<?= e(asset('/assets/js/notify.js')) ?>" defer></script>
|
||||
<?php endif; ?>
|
||||
<?php /* v24 第 20 批:选人组件脚本改成**按需加载**(页面上真有 `.pp` 才拉)。
|
||||
⚠️ 理由与 Cropper.js 同一套:`person_picker.js` 只在放选人组件的页面才有用,
|
||||
而它并不小;每页都无条件带一份,等于让"没有选人组件"的页面白付流量。
|
||||
|
||||
Reference in New Issue
Block a user