Files
Genarrative/apps/ai-game-creator-shell/src/view/project-development/ResourceAssetDeleteDialog.tsx
T
suzmii d1581892d7 修复 PR #316 review(前端 TS/TSX):资源工作台与资源画布
- 素材重命名(跨范围契约):`rename_local_project_asset` 现在要求 `expectedProjectId` + `expectedProjectRevision`,前端按删除 / 分类保存同一套 CAS 口径补齐——先 `get_local_game_project_revision` 读当前 revision 再连同项目身份提交,不用可能过期的本地缓存值
- 失败文案统一:新增 `projectAssetCommandErrorMessage`,把 `project-identity-conflict` / `project-revision-conflict` 翻成用户可读中文,重命名 / 删除 / 分类保存三条链路共用一份映射,其余错误原样透出
- index.tsx:资源面板下载按 `resolveDownloadablePanelEntries` 过滤,版本卡这类合成 path 的条目不再进入落盘链路
- index.tsx:`characterAnimationPanel` 纳入画布浮层开关判据(抽 `resolveResourceCanvasFloatingPanelOpen`),「生成动画」面板与快速编辑 / 信息浮层共用同一条「点外部 / Esc 关闭」规则
- index.tsx:去掉 `ResourceBookScene` 上重复的 `onWheel`,滚轮只由 manager 上的原生 `passive:false` 监听处理,平移 / 缩放不再被翻倍
- index.tsx:快速编辑的源资源在层 id 命中不到时回落到已正规化的 `asset:<id>`,重试不再静默什么都不做;取不到时给出可见失败
- ResourceCanvasPanelView.tsx:下载按钮按可下载条数判可用、不再在上传中显示下载转圈;上传中禁掉 × / Esc / 遮罩三条关闭路径;预览占位文案抽 helper
- GameRunVersionPicker.tsx:portal 菜单在滚动 / 缩放后重算位置;外部点击判定沿用共享 `useImageCanvasFloatingOptionDismiss` + `menuRef` 边界(review 该条已修,保留现状并补位置用例)
- ResourceCanvasGenerationPanelView.tsx:`submitting` 改 `finally` 收回,成功路径不再永久锁住面板
- ResourceAssetDeleteDialog.tsx / ResourceRenameDialog.tsx / ResourceClassificationPanel.tsx:在飞时 `closeOnEscape` / `closeOnBackdrop` 与头部 × 一起挡住
- resourceEditModel.ts / resourceCanvasToolbarModel.ts / useProjectResourceCardPreviews.ts / projectResourceLiveUpdateModel.ts:抽 `resourceBaseName`、`canonicalProjectedResourceMediaType` 参数收窄去掉强转、删未使用参数、补「IO 失败会 reject」的签名说明
- resourceCanvasHistoryModel.ts:`resourceCanvasSnapshotsEqual` 不再比较不可恢复的 `manuallyPlaced`,消除「压进历史但撤销是空操作」
- resourceCanvasSectionMapping.ts:删掉从未接线、且注释与实现相矛盾的 `LEGACY_RESOURCE_CANVAS_SECTION_FALLBACK`
- resourceCanvasChrome.css:`.game-resource-panel-grid` 补 `flex: 1 1 auto; min-height: 0`,卡片网格成为真正的滚动区
- 用例:重命名 CAS 载荷与读序、CAS 拒绝文案、版本卡下载门禁、上传中关闭路径、浮层判据、菜单跟随滚动、分区映射
2026-09-12 20:49:03 +08:00

116 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { PlatformActionButton } from '../../../../../packages/shared/src/components/PlatformActionButton';
import { ThemedModal } from '../../components/modal/ThemedModal';
export type ResourceAssetReferenceVersion = {
versionId: string;
projectRevision: number;
createdAt: number;
};
function referenceVersionTimeLabel(createdAt: number) {
if (!Number.isSafeInteger(createdAt) || createdAt < 0) return '时间未知';
return new Intl.DateTimeFormat('zh-CN', {
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
}).format(new Date(createdAt * 1000));
}
type ResourceAssetDeleteDialogProps = {
open: boolean;
localPath: string;
referencedVersions: readonly ResourceAssetReferenceVersion[];
deleteReferencedVersions: boolean;
deleting: boolean;
onChangeDeleteReferencedVersions: (value: boolean) => void;
onClose: () => void;
onConfirm: () => void;
};
/**
* 素材删除确认面板。被版本引用时列出引用它的版本,并给出「把相关游戏版本一并删除」勾选,
* 默认不勾:只删素材,版本保留悬空绑定。
*/
export function ResourceAssetDeleteDialog({
open,
localPath,
referencedVersions,
deleteReferencedVersions,
deleting,
onChangeDeleteReferencedVersions,
onClose,
onConfirm,
}: ResourceAssetDeleteDialogProps) {
return (
<ThemedModal
open={open}
ariaLabel="确认删除资源"
onClose={onClose}
// 删除在飞时头部 × / 取消 / 删除都已禁用,Escape 与遮罩也必须一起挡住,
// 否则面板看着像"取消了",后台的删除其实还在跑。
closeOnBackdrop={!deleting}
closeOnEscape={!deleting}
panelClassName="game-approval-dialog game-resource-delete-dialog"
>
<header>
<div>
<h2>删除资源</h2>
<p>{localPath}</p>
</div>
<button
type="button"
aria-label="关闭删除资源确认"
onClick={onClose}
disabled={deleting}
>
×
</button>
</header>
{referencedVersions.length > 0 ? (
<div className="game-resource-delete-body">
<p className="game-resource-delete-summary">
{`被 ${referencedVersions.length} 个游戏版本使用`}
</p>
<ul className="game-resource-delete-versions">
{referencedVersions.map((version) => (
<li key={version.versionId}>
<span>{version.versionId}</span>
<small>{referenceVersionTimeLabel(version.createdAt)}</small>
</li>
))}
</ul>
<label className="game-resource-delete-option">
<input
type="checkbox"
checked={deleteReferencedVersions}
disabled={deleting}
onChange={(event) =>
onChangeDeleteReferencedVersions(event.currentTarget.checked)
}
/>
<span>把相关游戏版本一并删除</span>
</label>
</div>
) : null}
<footer>
<PlatformActionButton
tone="secondary"
onClick={onClose}
disabled={deleting}
>
取消
</PlatformActionButton>
<PlatformActionButton
tone="danger"
onClick={onConfirm}
disabled={deleting}
aria-label="确认删除资源"
>
删除
</PlatformActionButton>
</footer>
</ThemedModal>
);
}