观影详情卡:对齐、去「写评价」、补编辑入口与完整编辑 (#80)

用户:评价与评论和上面的观影照片对齐吗?下面的写评价不要了,三个字。
另外一个,是不是得有个地方放编辑按钮啊?观影其实可以编辑……后面会补几张照片。
但编辑这个功能应该还是有的。

① 对齐:FbSectionTitle 自带 padding left:4,简介/观影照片是裸 Text 无内边距,
   实测评价与评论起点 111 vs 观影照片 99(差 4vp)。用 margin left:-4 抵消。
   不改用裸 Text —— 那样会丢掉全站统一的字号/字重/字距/胶囊按钮口径。

② 去「写评价」:FbMovieReviewSheet 加 hideFormTitle;无评价时整行不画,
   但有评价时保留那一行(右边的修改/删除/收起按钮在那)。

③ 编辑入口 + 完整编辑(用户选定:按钮放卡片最底部、做完整编辑):
   - 服务端 PATCH /api/v1/movies/<id> 本来就有(movieData 支持缺省回退原值),
     这轮只补端上缺的那层;
   - FbMovieRepo 新增 updateMovie() → PATCH,成功后重拉列表回写本地库;
   - FbMovieNewSheet 加 editingId/editingDetail,aboutToAppear 走 prefill 回填,
     submit 按模式分派 POST/PATCH;标题/按钮文案随模式切换;
   - 宿主(首页 + 电影页)详情卡 onEdit → 关卡 + 同一张表单编辑;
   - 编辑时不发 poster_key(发空串会清掉已有海报);
     海报区显示「当前海报 / 不选新图就保持不变」,避免用户以为图丢了白传一次。

两个真坑:
 1) if/else if 条件里不能调方法:curPoster() 探针打出来是对的,
    界面却一直走 else —— ArkUI V2 只对字段/参数建依赖。改读 @Local 字段。
 2) Row { Text().width(100%); Row {...} } 会内层挤出:posterField 原来就是这个结构,
    标签吃满整行 ⇒ 内层塌成 0 高、完全不渲染(症状是图/字凭空消失)。
    按全局表单规范改两排。

验证(真机 5NC0225B27004718):评价与评论 x 起点 98 vs 观影照片 99 已对齐;
「写评价」不再出现;编辑按钮在 y=1987;点开标题为「编辑观影记录」,
片名/时间(10月9日 16:20)/简介全部回填;海报区三行文案齐全,
缩略图区域色数 13567(真图)。hvigorw assembleHap BUILD SUCCESSFUL。
This commit is contained in:
2026-11-06 08:44:36 +08:00
parent cd60aa7788
commit 6a8a97286a
6 changed files with 483 additions and 98 deletions
@@ -55,6 +55,18 @@ export struct FbMovieReviewSheet {
* 加一个开关,两条路径共用同一套逻辑与 DOM。
*/
@Param embedded: boolean = false;
/**
* 隐藏表单顶部的「写评价 / 我的评价」标题行(2026-11-06)。
*
* 🔴 用户:「下面的写评价不要了,三个字。」
* ⇒ 内嵌到详情卡后,上面已经有「评价与评论」这个区块标题,
* 再出现一行「写评价」是重复的。
*
* ⚠️ 只隐藏**标题文字那一段**,右边「修改 / 删除 / 收起」三颗动作按钮
* 仍然保留 —— 有评价时用户就是靠它们改和删,删掉整行会失去功能。
* 没有评价时那一行本来就只剩标题,于是整行自然消失。
*/
@Param hideFormTitle: boolean = false;
/** 保存/删除后通知宿主(列表的平均分可能要刷新) */
@Event onChanged: () => void = (): void => {};
@@ -492,32 +504,40 @@ export struct FbMovieReviewSheet {
@Builder
myReviewForm() {
Column({ space: 8 }) {
Row({ space: 8 }) {
Text(this.mine !== null ? '我的评价' : '写评价')
.fontSize(FbMetric.fontSmall)
.fontWeight(FontWeight.Bold)
.fontColor(this.accent)
.letterSpacing(0.6)
Blank()
if (this.mine !== null) {
Text('收起')
.fontSize(FbMetric.fontTiny)
.fontColor(FbColors.muted)
.padding({ left: 6, right: 4, top: 4, bottom: 4 })
.onClick((): void => {
this.myFormOpen = false;
})
Text('删除')
.fontSize(FbMetric.fontTiny)
.fontColor(FbColors.red)
.padding({ left: 8, right: 2, top: 4, bottom: 4 })
.onClick((): void => {
this.deleteReview();
})
/* 🔴 用户 2026-11-06:「下面的写评价不要了,三个字。」
⇒ 整行只在「有评价(要显示改/删/收起)」或「没要求隐藏标题」时才画。
内嵌 + 未评过 = 整行不存在,直接从「评分」开始,不浪费一行高度。
⚠️ 有评价时**不能**整行删掉:修改/删除/收起三颗按钮就在这行右边。 */
if (this.mine !== null || !this.hideFormTitle) {
Row({ space: 8 }) {
if (!this.hideFormTitle) {
Text(this.mine !== null ? '我的评价' : '写评价')
.fontSize(FbMetric.fontSmall)
.fontWeight(FontWeight.Bold)
.fontColor(this.accent)
.letterSpacing(0.6)
}
Blank()
if (this.mine !== null) {
Text('收起')
.fontSize(FbMetric.fontTiny)
.fontColor(FbColors.muted)
.padding({ left: 6, right: 4, top: 4, bottom: 4 })
.onClick((): void => {
this.myFormOpen = false;
})
Text('删除')
.fontSize(FbMetric.fontTiny)
.fontColor(FbColors.red)
.padding({ left: 8, right: 2, top: 4, bottom: 4 })
.onClick((): void => {
this.deleteReview();
})
}
}
.width('100%')
.alignItems(VerticalAlign.Center)
}
.width('100%')
.alignItems(VerticalAlign.Center)
// 打分(1-10 颗星)
Column({ space: 6 }) {