d1581892d7
- 素材重命名(跨范围契约):`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 拒绝文案、版本卡下载门禁、上传中关闭路径、浮层判据、菜单跟随滚动、分区映射
116 lines
3.5 KiB
TypeScript
116 lines
3.5 KiB
TypeScript
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>
|
||
);
|
||
}
|