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:
+55
-1
@@ -56,6 +56,13 @@ final class HomeCards
|
||||
* 那张白名单放在模板里 —— 新加一张带按钮的卡片就忘了加,按钮默默变灰。
|
||||
* 现在登记在这里:**有 route 就该有 mod**,两件事一次改完。
|
||||
* ⚠️ `mod` 只影响按钮配色,不参与权限/路由;认不出的 key 走 `Module::color` 的兜底。
|
||||
* 🔴 v71c 补一条硬规矩(拿 v63 的 A1 换来的):
|
||||
* **`route` 非空就必须有 `mod`**,而且 `mod` 必须是 `Module::LIST` 里的键
|
||||
* (认不出归哪个模块就归 `home`)。
|
||||
* 反例:通知卡片当初 `route='notifications'` 却把 `mod` 留成空串,
|
||||
* 于是它成了整排按钮里**唯一白底 ghost** 的那个 ——
|
||||
* 而 "通知" 本来就不在 `Module::LIST`,空串看着"很合理"。
|
||||
* 判据不能靠自觉,A1 那条断言(带按钮的卡片都得有色)就是它的守卫。
|
||||
*/
|
||||
public const TYPES = [
|
||||
'brief' => [
|
||||
@@ -72,6 +79,20 @@ final class HomeCards
|
||||
'w' => 4, 'h' => 8, 'route' => 'tasks', 'more' => '全部任务', 'n' => 0,
|
||||
'mod' => 'tasks',
|
||||
],
|
||||
/* 🔴 v71c(用户 2026-10-21):「通知消息这个,也是首页的卡片,可以调整顺序和大小。」
|
||||
⇒ 它从"网格外的写死区块"变成**正规卡片**:可拖顺序、可调宽高、可关掉。
|
||||
🔴 `mod` 给 **`home`**,不是空串:
|
||||
通知**不是** `Module::LIST` 里的模块(见 Notification 头部第 ①条),
|
||||
但它是**首页自己**的一张卡片 ⇒ 右上角「全部通知」按钮用**首页的主题色**。
|
||||
早先留空串(想让它走 `btn-ghost`)被 v63 的 A1 当场抓住:
|
||||
「带按钮的卡片都得有模块色」—— 空串会让它变成白底 ghost,
|
||||
在一排同色的模块按钮里**唯独它不一样**,那正是 v63 要消灭的形态。
|
||||
⇒ 规矩落地成:**`route` 非空就必须有 `mod`**,认不出归哪个模块就归 `home`。 */
|
||||
'notif' => [
|
||||
'name' => '通知消息', 'desc' => '谁把你加进了哪件事(与通知页同一套样子)',
|
||||
'w' => 4, 'h' => 4, 'route' => 'notifications', 'more' => '全部通知', 'n' => 0,
|
||||
'mod' => 'home',
|
||||
],
|
||||
'memories' => [
|
||||
'name' => '往年的今天', 'desc' => '往年同一天的观影与旅程',
|
||||
'w' => 4, 'h' => 4, 'route' => '', 'more' => '', 'n' => 0, 'mod' => '',
|
||||
@@ -116,9 +137,17 @@ final class HomeCards
|
||||
*/
|
||||
public const DEFAULT_LAYOUT = [
|
||||
['k' => 'brief', 'w' => 8, 'h' => 2],
|
||||
/* v71c(用户 2026-10-21):通知卡片钉在**概述下面第一张**。两个约束同时满足:
|
||||
① v30 第 5 条"通知出现在首页,往年的今天前面" —— 默认摆位就满足;
|
||||
② 日程与任务必须**并排**(都是 w4/h8,是"今天要做什么"的一对)——
|
||||
所以通知占 4 宽、与另一张 4 宽的(纪念日)并成一行,**不插在它们中间**。
|
||||
早先直接写在 brief 与 agenda 之间、宽 4,则 agenda/tasks 被挤成
|
||||
一上一下(实测 C13:顶边 407 vs 751)—— 那是纯视觉回归,必须在默认值里避免。
|
||||
⚠️ 用户把它拖到别处、改成别的尺寸都允许,这里只是"第一次打开看到的样子"。 */
|
||||
['k' => 'notif', 'w' => 4, 'h' => 4],
|
||||
['k' => 'days', 'w' => 4, 'h' => 4],
|
||||
['k' => 'agenda', 'w' => 4, 'h' => 8],
|
||||
['k' => 'tasks', 'w' => 4, 'h' => 8],
|
||||
['k' => 'days', 'w' => 4, 'h' => 4],
|
||||
['k' => 'memories', 'w' => 4, 'h' => 4],
|
||||
['k' => 'movies', 'w' => 4, 'h' => 4],
|
||||
['k' => 'books', 'w' => 4, 'h' => 4],
|
||||
@@ -261,6 +290,9 @@ final class HomeCards
|
||||
foreach ($layout as $c) {
|
||||
$k = (string)$c['k'];
|
||||
switch ($k) {
|
||||
case 'notif':
|
||||
$out['notif'] = self::notifData($me);
|
||||
break;
|
||||
case 'days':
|
||||
$out['days'] = self::daysData($familyId, $me);
|
||||
break;
|
||||
@@ -280,6 +312,28 @@ final class HomeCards
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通知卡片(v71c 用户 2026-10-21)。
|
||||
*
|
||||
* 用户原话:「通知消息这个,也是首页的卡片,可以调整顺序和大小。」
|
||||
* ⇒ 它原来在 `templates/home.php` 里是一块**网格外的写死区块**(v30 第 5 条那会儿
|
||||
* 首页还没有卡片概念),只有"摆不摆"没有"摆哪儿"。现在是卡片:位置与尺寸
|
||||
* 都由 `home_cards` 决定。
|
||||
*
|
||||
* ⚠️ 取数的口径与原来**一字不差**:最新 10 条 + 未读数。首页是"瞥一眼"的地方,
|
||||
* 真正的消息中心在 `?r=notifications`(那一页才 markAllRead)。
|
||||
* ⚠️ 关掉卡片 = 不查这两条 SQL(`data()` 只对用到的 key 取数)。
|
||||
*
|
||||
* @return array{rows:array,unread:int}
|
||||
*/
|
||||
public static function notifData(int $me, int $limit = 10): array
|
||||
{
|
||||
return [
|
||||
'rows' => Notification::mine($me, max(1, min(self::N_MAX, $limit))),
|
||||
'unread' => Notification::unreadCount($me),
|
||||
];
|
||||
}
|
||||
|
||||
/** 接下来 60 天的纪念日(按"还有几天"升序,最多 12 条 —— 卡片就那么大) */
|
||||
public static function daysData(int $familyId, int $me): array
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user