修复资源工作台合并回归
Project CI / Repository checks (pull_request) Successful in 4m30s
Project CI / Frontend tests (pull_request) Successful in 5m15s
Project CI / Backend tests (pull_request) Successful in 5m46s
Project CI / Native shell tests (pull_request) Successful in 15m59s

恢复 UI 编辑器钱包入口和创建资源语义

恢复资源详情关闭后的滚动位置

更新资源生成入口测试断言

锁定缺失登录时生成失败的公开投影
This commit is contained in:
2026-08-24 13:51:45 +08:00
parent 21b826503c
commit d707deef4e
4 changed files with 39 additions and 11 deletions
@@ -8803,6 +8803,12 @@ mod tests {
let public = serde_json::to_string(&public_draft).expect("serialize failed draft");
assert!(!public.contains(prompt));
assert!(!public.contains(&input.idempotency_key));
assert!(public_draft
.generations
.iter()
.any(|record| record.generation_id == input.generation_id
&& record.phase == AssetCanvasGenerationStatus::Failed
&& record.error_code.as_deref() == Some("configuration-missing")));
let ledger = read_generation_ledger(directory.path(), &input.generation_id)
.expect("read retryable generation ledger")
.expect("missing-login ledger exists");
@@ -199,6 +199,15 @@ type ResourceEditorRoute = {
generationMode: 'create' | 'derive';
};
function defaultCreatedResourceName(
editKind: ResourceEditorRoute['capability']['editKind'],
) {
if (editKind === 'video') return '新视频';
if (editKind === 'sound-effect') return '新音效';
if (editKind === 'background-music') return '新背景音乐';
return '新资源';
}
type UiEditorRoute = {
resourceId: string;
resourceLabel: string;
@@ -2002,7 +2011,7 @@ export default function ProjectDevelopmentView({
}
function closeOnEscape(event: KeyboardEvent) {
if (event.key === 'Escape') {
restoreResourceListScrollRef.current = false;
restoreResourceListScrollRef.current = true;
setFocusedResourceId(null);
}
}
@@ -3332,7 +3341,7 @@ export default function ProjectDevelopmentView({
function closeResourceFocus() {
advanceFocusGeneration();
restoreResourceListScrollRef.current = false;
restoreResourceListScrollRef.current = true;
setFocusedResourceId(null);
}
@@ -3516,12 +3525,13 @@ export default function ProjectDevelopmentView({
) : null}
{mode === 'resources' && uiEditorRoute ? (
<div className="h-full min-h-0 min-w-0 w-full overflow-hidden rounded-2xl border border-(--platform-desktop-panel-border) bg-(--platform-desktop-panel-fill) shadow-(--platform-panel-shadow)">
<div className="game-workbench-editor-shell h-full min-h-0 min-w-0 w-full overflow-hidden">
<UiEditorPage
projectPath={projectPath}
resourceId={uiEditorRoute.resourceId}
projectId={manifest.projectId}
resourceLabel={uiEditorRoute.resourceLabel}
walletEntry={walletEntry}
onBack={() => setUiEditorRoute(null)}
/>
</div>
@@ -3540,11 +3550,21 @@ export default function ProjectDevelopmentView({
/>
) : mode === 'resources' && resourceEditorRoute ? (
<ResourceEditSurface
resourceLabel={resourceEditorRoute.resource.label}
resourceLabel={
resourceEditorRoute.resource?.label ??
defaultCreatedResourceName(
resourceEditorRoute.capability.editKind,
)
}
editKind={resourceEditorRoute.capability.editKind}
initialAssetName={defaultDerivedResourceName(
resourceEditorRoute.resource,
)}
generationMode={resourceEditorRoute.generationMode}
initialAssetName={
resourceEditorRoute.resource
? defaultDerivedResourceName(resourceEditorRoute.resource)
: defaultCreatedResourceName(
resourceEditorRoute.capability.editKind,
)
}
semanticNotice={resourceEditorRoute.capability.semanticNotice}
onCancel={cancelResourceEditor}
onSubmit={submitResourceEdit}
@@ -1855,7 +1855,7 @@ export function registerProjectWorkbenchFoundationTests() {
'resources.focused.document',
);
expect(screen.getByLabelText('搜索项目资源')).not.toBeNull();
expect(screen.getByRole('button', { name: '新增资源' })).not.toBeNull();
expect(screen.getByRole('button', { name: '生成视频' })).not.toBeNull();
expect(screen.getByRole('button', { name: '按依赖' })).not.toBeNull();
expect(
screen
@@ -9409,7 +9409,8 @@ export function registerProjectSupervisorSurfaceTests() {
projectPath,
});
let directTurnUpdateHandler:
((event: { payload: Record<string, unknown> }) => void) | null = null;
| ((event: { payload: Record<string, unknown> }) => void)
| null = null;
const listen = vi.fn(
async (
eventName: string,
@@ -10367,7 +10368,8 @@ export function registerProjectAgentStatusTests() {
},
);
let runtimeUpdateHandler:
((event: { payload: Record<string, unknown> }) => void) | null = null;
| ((event: { payload: Record<string, unknown> }) => void)
| null = null;
const listen = vi.fn(
async (
eventName: string,
@@ -718,7 +718,7 @@ describe('project resource live canvas integration', () => {
);
expect(sourceDetails.hasAttribute('aria-modal')).toBe(false);
expect(document.querySelector('.game-resource-focus-backdrop')).toBeNull();
expect(screen.getByRole('button', { name: '新增资源' })).not.toBeNull();
expect(screen.getByRole('button', { name: '生成视频' })).not.toBeNull();
expect(
screen
.getByRole('button', { name: '按依赖' })