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:
@@ -325,7 +325,7 @@ $myPerson = (int)\App\Auth::personId();
|
||||
|
||||
<?php /* ---- 页签 ① 信息 ---- */ ?>
|
||||
<div class="res-tabpage" data-res-page="info">
|
||||
<form method="post" action="<?= e(url('resources/update')) ?>">
|
||||
<form method="post" data-res-idform action="<?= e(url('resources/update')) ?>">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id" value="">
|
||||
<div class="res-pb">
|
||||
@@ -367,7 +367,7 @@ $myPerson = (int)\App\Auth::personId();
|
||||
<div class="rd-att-list" id="resAttNow"></div>
|
||||
</div>
|
||||
<form method="post" enctype="multipart/form-data"
|
||||
action="<?= e(url('resources/attach_add')) ?>" id="resAttForm">
|
||||
action="<?= e(url('resources/attach_add')) ?>" id="resAttForm" data-res-idform>
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id" value="">
|
||||
<h3 class="res-sub">添加附件</h3>
|
||||
@@ -387,7 +387,7 @@ $myPerson = (int)\App\Auth::personId();
|
||||
<?php /* ---- 页签 ③ 共享(原「共享」按钮那整套搬进来)---- */ ?>
|
||||
<div class="res-tabpage" data-res-page="share" hidden>
|
||||
<div class="res-pb">
|
||||
<form method="post" action="<?= e(url('resources/share')) ?>">
|
||||
<form method="post" action="<?= e(url('resources/share')) ?>" data-res-idform>
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id" value="">
|
||||
<div class="field">
|
||||
@@ -422,7 +422,7 @@ $myPerson = (int)\App\Auth::personId();
|
||||
</div>
|
||||
</div>
|
||||
<?php /* 取消共享:唯一的一份表单,脚本填两个隐藏字段后提交。 */ ?>
|
||||
<form method="post" action="<?= e(url('resources/unshare')) ?>" id="resUnshareForm" hidden>
|
||||
<form method="post" action="<?= e(url('resources/unshare')) ?>" id="resUnshareForm" data-res-idform hidden>
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id" value="">
|
||||
<input type="hidden" name="person_id" value="">
|
||||
@@ -430,7 +430,7 @@ $myPerson = (int)\App\Auth::personId();
|
||||
</div>
|
||||
|
||||
<?php /* 删附件:唯一的一份表单,脚本填 id 后提交。 */ ?>
|
||||
<form method="post" action="<?= e(url('resources/attach_del')) ?>" id="resAttDelForm" hidden>
|
||||
<form method="post" action="<?= e(url('resources/attach_del')) ?>" id="resAttDelForm" data-res-idform hidden>
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id" value="">
|
||||
</form>
|
||||
@@ -586,6 +586,33 @@ $myPerson = (int)\App\Auth::personId();
|
||||
var panel = panels[which];
|
||||
if (!panel) { return; }
|
||||
|
||||
/* 🔴 v32 第 1 条真根因(用户:「弹框中,点击共享给某个人后,弹框消失,
|
||||
但是并没有共享成功。」):
|
||||
编辑面板现在是**三个页签**,每个页签有**自己的** `<form>` 和
|
||||
**自己的** `<input name="id">`(info=resources/update、att=attach_add、
|
||||
share=resources/share),面板末尾还有两个"唯一表单"(#resUnshareForm /
|
||||
#resAttDelForm,也都带 name="id")。
|
||||
而 v28 把三者并成一个面板时,这里写的是:
|
||||
var idInp = panel.querySelector('input[name="id"]');
|
||||
idInp.value = id; // ← 只填了**第一个**
|
||||
`querySelector` 返回**文档序里第一个**(info 那个 / resources/update),
|
||||
于是 att 与 **share** 两个页签的表单 `id` **一直是空** ⇒ 提交 `id=0` ⇒
|
||||
后端 `Resource::find($familyId, 0, $me)` 返回 null ⇒ **静默不共享**
|
||||
(只在列表页闪一句"这条资源不能共享。",用户多半没注意)。
|
||||
⇒ 改成把 id 填进**这一屏里每一个会提交的表单**。
|
||||
⚠️ 别写成"只填当前页签那份":用户会在弹框里切页签,
|
||||
数据一次灌好、切页签就是纯显示切换(与上面注释同一取舍)。
|
||||
⚠️⚠️ 判据用**显式标记**(`[data-res-idform]`),**不要**按 action 匹配:
|
||||
`url()` 走 http_build_query,斜杠是 URL 编码的
|
||||
(实测 `action="index.php?r=resources%2Fupdate"`),
|
||||
写 `action*="resources/update"` 一条都匹配不上 —— 看着"改了",其实没改。 */
|
||||
Array.prototype.forEach.call(
|
||||
panel.querySelectorAll('form[data-res-idform]'),
|
||||
function (f) {
|
||||
var i = f.querySelector('input[name="id"]');
|
||||
if (i) { i.value = id; }
|
||||
});
|
||||
|
||||
// 每个面板都有的两样:标题回显 + 宿主 id
|
||||
var tt = panel.querySelector('.rd-title');
|
||||
if (tt) { tt.textContent = title; }
|
||||
|
||||
Reference in New Issue
Block a user