v71c:首页「通知消息」改成正规卡片,样式直接复用通知页
用户 2026-10-21:
「先把web端的首页修一下,通知消息这个,也是首页的卡片,可以调整顺序和大小。
另外,这个样式也不好看,我看个人头像点击后,通知消息那个页面的样式就不错,
直接复用就可以了。」
① 卡片化(HomeCards 注册表 + 默认布局 + 取数)
· TYPES 新增 'notif'(w4/h4,route=notifications,more=全部通知)
· DEFAULT_LAYOUT 钉在 brief 之后,与 days 并一行(宽 4)——
若插在 brief 与 agenda 之间,agenda/tasks 会被挤成一上一下(实测 C13 顶边 407 vs 751)
· data() 加 case 'notif' → 新增 notifData():最新 10 条 + 未读数,
与原来的取数口径一字不差;关掉卡片就不查这两条 SQL
· templates/home.php 删掉网格前那块写死区块(v30 第 5 条「必须在往年的今天前面」
这条约束作废 —— 那时还没有卡片体系);index.php 不再单独传 notifs/notifUnread
② 样式复用 templates/notifications/index.php
· 结构与通知页完全一致:头像在前 → 正文 → kind 图标在右(带 ntf-kind-{kind})
(旧首页那块是"图标在前、头像第二",正是用户说不好看的那一版)
· 新增 .hc-ntf 作用域只补"卡片比整页小"的三条差异:正文允许折两行(宽 2 时
单行省略会把正文全吃掉)、时间挪到正文下一行、未读数做小注脚
· 不带每条右侧「删除」按钮(4×4 的卡里塞两个按钮会把正文挤成两三个字),
删除在通知页做,卡片右上角有「全部通知」
③ 顺带修掉 v63 A1 抓住的一处:'notif' 的 mod 给 'home' 而不是空串
(通知不在 Module::LIST,但它是首页自己的卡片;空串会让「全部通知」成为
一排同色模块按钮里唯一白底 ghost 的那个)
⇒ TYPES docstring 立规矩:route 非空就必须有 mod,认不出归哪个模块就归 home
验证(familybook_push.sh 第 6 轮全绿,PUSH_RC=0,2h11m)
v62 首页卡片 56/0 · v62 反向验证 14/0(新增 M8–M12 五条注入)
b30 通知 16/0 · b30 反向验证 18/0
v63 40/0 · v63 反向验证 51/0 · e2e 1523/0 · 部署静态断言空跑 RC=0
同批带上上一轮 v70/v71 的日历修复(已单独验过,本轮流水线一并回归):
· v70 日历导入后条目不显示:+N 条从纯文本 span 改成真按钮,点开是当天全部
条目浮层;AJAX 新建后就地插入与服务端同形(回 entry,不让前端自己拼)
· v71 ICS 导入顺序:主事件 → 覆盖行 → EXDATE 由 Calendar::importIcs() 统一保证
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/**
|
||||
* 首页卡片 · 通知消息(v71c 用户 2026-10-21 从 templates/home.php 搬进来)。
|
||||
*
|
||||
* 用户原话:「先把 web 端的首页修一下,通知消息这个,也是首页的卡片,可以调整顺序
|
||||
* 和大小。另外,这个样式也不好看,我看个人头像点击后,通知消息那个页面的
|
||||
* 样式就不错,直接复用就可以了。」
|
||||
*
|
||||
* ⇒ 两件事一起做了:
|
||||
* ① **卡片化**:不再是网格外那块写死区块,位置/宽高都由 `home_cards` 决定;
|
||||
* ② **样式复用**:结构与 `templates/notifications/index.php` **一模一样** ——
|
||||
* 头像在最前、正文在中间、kind 图标在右(带 `ntf-kind-{kind}` 修饰)。
|
||||
* 旧版首页那块是"图标在最前、头像在第二位",正是用户说"不好看"的那一版。
|
||||
*
|
||||
* ⚠️ 三处与通知页**故意不同**(都是"卡片比整页小"带来的):
|
||||
* · 不带每条右侧的「删除」按钮 —— 4 宽 × 4 高的卡片里塞两个按钮,正文会被挤成
|
||||
* 两三个字(用户抱怨的正是"不好看")。删除在通知页做,卡片右上角有「全部通知」。
|
||||
* · 标题不加旧首页那块用的 `ntf-list` home 修饰类 —— 那一类会把行距压到 6px,
|
||||
* 是给"网格外那条细长清单"用的;卡片里沿用通知页的行距,才叫"样式直接复用"。
|
||||
* · 正文允许折两行(`.hc-ntf` 作用域,见 app.css):卡片宽度可能只有 2 格,
|
||||
* 单行省略会把「有人把你加进了观影「…」」全吃掉,只剩一个名字。
|
||||
*
|
||||
* ⚠️ 没有通知时**整张卡片都不渲染**(返回空串是做不到的 —— 卡片外壳由 home.php 拼)。
|
||||
* 这里给一个空提示,与其它卡片(观影/读书/纪念日)的空态同一套写法。
|
||||
* 真正"不想要它"的人,去「首页卡片」里把它关掉(那张卡片会从网格里消失)。
|
||||
*
|
||||
* @var array $cardData['notif'] ['rows' => 通知行(最新在前), 'unread' => 未读数]
|
||||
*/
|
||||
$ntfRows = (array)($cardData['notif']['rows'] ?? []);
|
||||
$ntfUnread = (int)($cardData['notif']['unread'] ?? 0);
|
||||
?>
|
||||
<div class="hc-body">
|
||||
<?php if (!$ntfRows): ?>
|
||||
<p class="empty-hint">还没有通知。别人在观影、旅程里把你加进去时,这里就会有消息。</p>
|
||||
<?php else: ?>
|
||||
<?php if ($ntfUnread > 0): ?>
|
||||
<p class="hc-ntf-note"><?= (int)$ntfUnread ?> 条未读</p>
|
||||
<?php endif; ?>
|
||||
<ul class="ntf-list hc-ntf">
|
||||
<?php foreach ($ntfRows as $n): ?>
|
||||
<?php
|
||||
// 谁发起的:优先用"我叫他什么"(与全站称呼口径一致)
|
||||
$ntfActor = \App\Nickname::display(
|
||||
(int)$meId,
|
||||
['name' => $n['actor_name'] ?? '', 'my_nickname' => $n['actor_nick'] ?? '']
|
||||
);
|
||||
if (trim((string)$ntfActor) === '') { $ntfActor = '有人'; }
|
||||
$ntfKind = (string)($n['kind'] ?? '');
|
||||
?>
|
||||
<li class="ntf-row ntf-row-<?= e($ntfKind) ?><?= empty($n['is_read']) ? ' is-unread' : '' ?>">
|
||||
<img class="ntf-av" src="<?= e(avatar_url($n['actor_avatar'] ?? null)) ?>" alt="">
|
||||
<a class="ntf-main" href="<?= e(\App\Notification::href($n)) ?>">
|
||||
<span class="ntf-title">
|
||||
<b><?= e((string)$ntfActor) ?></b>
|
||||
<?= e(\App\Notification::bodyWithoutActor((string)$n['title'])) ?>
|
||||
</span>
|
||||
<span class="ntf-time"><?= e(fb_time_ago((string)$n['created_at'])) ?></span>
|
||||
</a>
|
||||
<span class="ntf-kind ntf-kind-<?= e($ntfKind) ?>" aria-hidden="true">
|
||||
<?= \App\Notification::icon($ntfKind) ?>
|
||||
</span>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
Reference in New Issue
Block a user