v0.8.4 简要卡观感 / 分享 / 名册搜索 / 全局返回手势(v59e)
八条需求的落地与真因: 1. 浮层与白底"糊在一起"、看不清 —— 根因不是配色,是**遮罩从来没画出来过**: ArkUI 的八位色值是 #AARRGGBB(alpha 在前),而全应用写的是 '#00000066' (本意"黑 40%")⇒ alpha = 0x00 ⇒ 全透明。同型还有 brand + '1A'(拼到了蓝通道) 与 shadow('#00000033')。⇒ 17 个文件统一改走 fbAlpha() / FB_MASK / FB_SHADOW / FB_HAIRLINE;真机像素采样复验:遮罩 (148,146,140)、卡片白、浅底 (237,242,243)。 2. 简要卡外圈加**主题色描边环**(外层铺色 + padding,不是 border —— border 会被 内层圆角切出白缝)。 3. 简要卡**去掉删除按钮**,删除挪到完整详情卡最下面(Divider + 红字块)。 顺手修一处静默失败:confirmDelete() 原来只取 quickSource(), 从家谱直接开详情时 quickPerson 为 null ⇒ 点删除毫无反应。 4. 信息行间距 10 → 16(每行再各加 3vp 上下内边距,实测行距 134/118px)。 5. 主电话整行可点**直接拨号**(call.makeCall,落到系统拨号盘)。 6. 按钮改为 详情 / 编辑 / 分享 / 关闭;分享走系统分享面板, 内容为纯文本「姓名 / 电话 / 邮箱」三项(用户点名的就是这三项, 不多带单位),面板拉不起来时兜底复制到剪贴板并提示。 7. 名册搜索"完全不能用"有两个独立真因: ① 搜索框是 List 的第一个 item,无结果时整个 List 被空态替换 ⇒ 输入框被卸载、 焦点丢失 ⇒ 输不进第二个字。改:List 无条件渲染,空态自身做成 ListItem。 ② rowToPerson 把 initials 写死成空串,服务端下发的拼音首字母从未落库 ⇒ 拼音搜索恒 0 结果。改:FB_DB_VERSION 6→7 + PRAGMA 探测补列 + 同步时落库; 匹配同时遍历全部电话(原来只比主号)。 另加搜索框「清空」(24×24 命中区)。 8. 全局返回手势:应用是单页 + 模块分发、没有路由栈 ⇒ 自建 FB_BACK 登记表 (倒序询问)+ moduleHistory + applyModule()(不记历史,否则 A/B 两页来回弹)。 9 个页面登记/注销;Index.onBackPress 先关浮层 → 回上一模块 → 才 return false 交给系统退桌面(onBackPress 必须声明 boolean,返回 void 会被当成没接管)。 验证: - 静态守卫 417 / 0(新增 ⑤阴影·描边·色环 ⑥透明度色 ⑦返回手势 ⑧搜索 ⑨分享) - 反向验证 10 / 0(9 条注入全部能让守卫变红;其中"遮罩换纯黑"那条暴露了 一条存在型假绿,已改成数个数 + 禁止 Color.Black) - 建表/迁移列一致性守卫 12 / 0 - 真机全模块遍历 14 / 14;真机逐项复核 12 / 0 与 7 / 0 工具侧顺带修好两个过期的探针: - 遍历探针仍用"应用内横滑"打开抽屉,而该手势早已按用户要求去掉、入口改为顶栏图标 ⇒ 一次全量遍历里 12 个模块全报"抽屉里没找到"(像应用坏了,其实是探针过期)。 - 资源/笔记两页写死了早已不存在的条目(户口本/房产证/阳台改造清单)⇒ 改成 结构性文案(副标题 + 常驻筛选胶囊),不随用户数据变化而恒红。
This commit is contained in:
@@ -24,7 +24,7 @@
|
||||
* 只是缺那几项详情专属字段,界面不会空。
|
||||
*/
|
||||
|
||||
import { FbColors, FbMetric, fbTint, FbTint } from '../common/Theme';
|
||||
import { FbColors, FbMetric, fbTint, FbTint, FB_HAIRLINE, FB_SHADOW, fbAlpha } from '../common/Theme';
|
||||
import { FbRosterPerson, FbJobRow, FbContactRow } from '../data/FbPersonRepo';
|
||||
import { FbAvatar, FbTag } from './Widgets';
|
||||
import { FB_TOKEN_STORE } from '../data/FbTokenStore';
|
||||
@@ -39,6 +39,15 @@ import { fbImageSrc } from '../data/FbAttachQueue';
|
||||
*/
|
||||
const FB_SHEET_BOTTOM_GAP: number = 16;
|
||||
|
||||
/**
|
||||
* 「删除」用的红 —— 与 `resources/base/element/color.json` 的 `red` **同值**。
|
||||
*
|
||||
* ⚠️ 不能直接用 `FbColors.red`(那是 `Resource`):本文件要拿它拼
|
||||
* `fbAlpha(RED, 0.08)`(透明度后缀)做底色,`Resource` 拼不了字符串。
|
||||
* ⚠️ color.json 改色时这里要同步改(只有这一个值,风险可控)。
|
||||
*/
|
||||
const RED: string = '#C0533F';
|
||||
|
||||
|
||||
@ComponentV2
|
||||
export struct FbPersonSheet {
|
||||
@@ -56,6 +65,33 @@ export struct FbPersonSheet {
|
||||
*/
|
||||
@Event onEdit: () => void = (): void => {
|
||||
};
|
||||
|
||||
/**
|
||||
* 「删除」回调。
|
||||
*
|
||||
* 🔴🔴 用户 2026-10-18 原话:
|
||||
* 「点击按钮后弹出这个简单框,不要加删除按钮了,删除按钮太容易误触。
|
||||
* 应该在**详情页面的最下面**加一个删除按钮。」
|
||||
*
|
||||
* ⇒ 「删除」从"简要卡"(`FbPersonQuickSheet`)挪到了这里,并且放在
|
||||
* **整张卡的最下面**、与编辑/关闭之间隔一条分隔线 ——
|
||||
* 这是"危险区"的通用做法:多一层遮挡、手指不会顺手扫到。
|
||||
*
|
||||
* ⚠️ 与别的事件一样:**只发事件**。二次确认与调接口都在页面侧
|
||||
* (那里才知道"删完怎么刷新列表")。
|
||||
*/
|
||||
@Event onDelete: () => void = (): void => {
|
||||
};
|
||||
|
||||
/**
|
||||
* 是否显示「删除」按钮。
|
||||
*
|
||||
* ⚠️ 顶栏那个「我的详情」(`TopBar.myDetailPanel`)要传 `false`:
|
||||
* 删除自己既没意义、又很危险(服务端是物理删除,删完连账号都进不去)。
|
||||
* 默认 `true` = 名册里的详情卡(那里的删除是正常的)。
|
||||
*/
|
||||
@Param canDelete: boolean = true;
|
||||
|
||||
/**
|
||||
* 嵌入模式:宿主**自己已经是浮层**(如 `bindSheet`)时为 true。
|
||||
*
|
||||
@@ -481,6 +517,41 @@ export struct FbPersonSheet {
|
||||
}
|
||||
.width('100%')
|
||||
.margin({ top: 18 })
|
||||
|
||||
/* ---- 危险区:删除联系人 ----
|
||||
*
|
||||
* 🔴 用户 2026-10-18:「应该在详情页面的最下面加一个删除按钮。」
|
||||
* ⇒ 位置在**编辑/关闭之下**、并且与它们之间隔一条分隔线:
|
||||
* 手指从上往下扫时不会顺手点到;想删必须**再往下够**一次。
|
||||
* ⚠️ 视觉上只给文字 + 图标(不做成大红块):
|
||||
* 它是"偶尔用一次"的操作,大红按钮会抢走"编辑"的注意力。
|
||||
* ⚠️ 确认框在页面侧(`FbPeoplePage.confirmDelete`)—— 见 `onDelete` 的说明。 */
|
||||
if (this.canDelete) {
|
||||
Divider()
|
||||
.color(FbColors.line)
|
||||
.margin({ top: 14 })
|
||||
|
||||
Row({ space: 6 }) {
|
||||
Image($r('app.media.fb_ic_trash'))
|
||||
.width(14)
|
||||
.height(14)
|
||||
/* ⚠️ PNG 图标必须 colorFilter(fillColor 只对 SVG 生效) */
|
||||
.colorFilter(fbTint(RED))
|
||||
Text('删除联系人')
|
||||
.fontSize(FbMetric.fontSmall)
|
||||
.fontColor(RED)
|
||||
.fontWeight(FontWeight.Medium)
|
||||
}
|
||||
.width('100%')
|
||||
.height(42)
|
||||
.justifyContent(FlexAlign.Center)
|
||||
.backgroundColor(fbAlpha(RED, 0.08))
|
||||
.borderRadius(FbMetric.radiusS)
|
||||
.margin({ top: 10 })
|
||||
.onClick((): void => {
|
||||
this.onDelete();
|
||||
})
|
||||
}
|
||||
}
|
||||
// 🔴 用户 2026-10-16:「它应该弹出一个**圆角的、浮在上面的卡片**……
|
||||
// **不要让它左右充满整个屏幕,下面也不要挨着屏幕**,
|
||||
@@ -512,8 +583,8 @@ export struct FbPersonSheet {
|
||||
* ⚠️ 只加阴影是不够的:浅色底上的投影很淡,真机上常常看不出来;
|
||||
* 描边才是"稳"的那一手(它不依赖光照假设)。
|
||||
*/
|
||||
.shadow({ radius: 24, color: '#00000033', offsetX: 0, offsetY: 6 })
|
||||
.border({ width: 1, color: '#00000014' })
|
||||
.shadow({ radius: 24, color: FB_SHADOW, offsetX: 0, offsetY: 6 })
|
||||
.border({ width: 1, color: FB_HAIRLINE })
|
||||
.alignItems(HorizontalAlign.Start)
|
||||
}
|
||||
/* 🔴 embedded(宿主自己就是 sheet)时**不能再铺满 + 居中**:
|
||||
|
||||
Reference in New Issue
Block a user