@@ -48,6 +48,17 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
|
||||
- [ ] 复验画布、创作、短剧真实路由中的模型切换、保存后重开、默认档位与比例组合、明暗主题和键盘交互;管理员真实保存由用户确认后执行。
|
||||
- [ ] 用真实模型确认新增尺寸是否受上游支持、实际输出与计费档位是否一致;本次未修改已保存模型配置或执行收费生成。
|
||||
|
||||
## Issue #432 多角度编辑器
|
||||
|
||||
- 多角度编辑器改为居中 Modal,复用遮罩点击、Escape 和关闭按钮的取消行为,不再定位到节点底部或随节点拖拽卸载。
|
||||
- #428、#429、#432 的定向源码回归检查与前端生产构建通过;浏览器访问现有服务停在登录页,未完成真实登录态交互验收。构建保留现有大分包和混合静动态导入警告。
|
||||
- [ ] 人工复验不同缩放和明暗主题下的位置、遮罩与 Escape 关闭、重新打开重置参数、预设与角度拖动;本轮不执行收费生成。
|
||||
|
||||
## Issue #429 文本节点选中
|
||||
|
||||
- 普通文本和富文本预览恢复鼠标事件冒泡,单击进入节点选中和编辑面板流程;编辑中的输入框仍隔离拖拽和滚轮。
|
||||
- [ ] 人工复验正文单击、标题拖拽、富文本、组合键多选、双击编辑和正文滚动。
|
||||
|
||||
## Issue #428 插件协议分类
|
||||
|
||||
- 分类筛选同时限制展示分区,避免音视频协议在音频筛选结果中重复展示;全部分类仍展示各自支持的能力分区。
|
||||
|
||||
@@ -2463,15 +2463,15 @@ function InfiniteCanvasPage() {
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
{angleNode?.metadata?.content && !isCanvasNodeMoving ? (
|
||||
<CanvasNodePanelOverlay
|
||||
node={angleNode}
|
||||
viewport={viewport}
|
||||
containerRef={containerRef}
|
||||
panelWidth={580}
|
||||
panelHeight={350}
|
||||
dragOffset={dragPreview?.nodeIds.has(angleNode.id) ? { x: dragPreview.x, y: dragPreview.y } : null}
|
||||
isDragging={isNodeDragging && Boolean(dragPreview?.nodeIds.has(angleNode.id))}
|
||||
{angleNode?.metadata?.content ? (
|
||||
<Modal
|
||||
open
|
||||
centered
|
||||
title="多角度编辑器"
|
||||
footer={null}
|
||||
width={620}
|
||||
destroyOnHidden
|
||||
onCancel={() => setAngleNodeId(null)}
|
||||
>
|
||||
<CanvasNodeAnglePanel
|
||||
dataUrl={angleNode.metadata.content}
|
||||
@@ -2480,7 +2480,7 @@ function InfiniteCanvasPage() {
|
||||
void generateAngleNode(angleNode, params);
|
||||
}}
|
||||
/>
|
||||
</CanvasNodePanelOverlay>
|
||||
</Modal>
|
||||
) : null}
|
||||
|
||||
{emotionNode?.metadata?.content && !isCanvasNodeMoving ? (
|
||||
|
||||
18
web/test/canvas-angle-dialog.test.ts
Normal file
18
web/test/canvas-angle-dialog.test.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { readFileSync } from "node:fs";
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
const source = readFileSync(new URL("../src/pages/canvas/project.tsx", import.meta.url), "utf8");
|
||||
|
||||
describe("image angle editor (#432)", () => {
|
||||
test("uses a centered dismissible modal instead of a node-anchored overlay", () => {
|
||||
const dialog = source.slice(source.indexOf("{angleNode?.metadata?.content"), source.indexOf("{emotionNode?.metadata?.content"));
|
||||
expect(dialog).toContain("<Modal");
|
||||
expect(dialog).toContain("centered");
|
||||
expect(dialog).toContain("onCancel={() => setAngleNodeId(null)}");
|
||||
expect(dialog).toContain("onClose={() => setAngleNodeId(null)}");
|
||||
expect(dialog).toContain("destroyOnHidden");
|
||||
expect(dialog).not.toContain("CanvasNodePanelOverlay");
|
||||
expect(dialog).not.toContain("isCanvasNodeMoving");
|
||||
expect(dialog).toContain("generateAngleNode(angleNode, params)");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user