Files
my-v0-server/app/actions/resize.py
T
2026-09-29 19:52:52 +08:00

53 lines
1.9 KiB
Python

"""在大屏 JSON 副本上设置组件尺寸,用于后端校验动作能否执行"""
from app.actions.base import BaseActionHandler
from app.schemas.actions import ResizeAction
from app.schemas.screen import Layout, Screen
class ResizeHandler(BaseActionHandler[ResizeAction]):
def apply(self, screen: Screen, action: ResizeAction) -> Screen:
# 确认目标存在,并取得大屏副本及副本中的目标节点
result, target = self.copy_target(screen, action.target_id)
# 将原布局转成字典,便于替换尺寸后重新校验
layout = target.layout.model_dump()
# 仅替换提供的尺寸,位置和其他布局字段保持不变
if action.width is not None:
layout["width"] = action.width
# 如果提供了高度,则替换为指定值,否则沿用原高度
if action.height is not None:
layout["height"] = action.height
# 重新校验完整布局,确保更新后的宽高等字段仍满足协议约束
target.layout = Layout.model_validate(layout)
# 返回调整尺寸后的大屏副本
return result
if __name__ == "__main__":
screen = Screen.model_validate(
{
"canvas": {"width": 1920, "height": 1080},
"nodes": [
{
"id": "sales-chart",
"type": "chart",
"layout": {"x": 100, "y": 200, "width": 400, "height": 300},
}
],
}
)
action = ResizeAction(target_id="sales-chart", width=500)
handler = ResizeHandler()
final_screen = handler.apply(screen, action)
print(final_screen.model_dump_json(indent=2))
print("原始尺寸:", screen.nodes[0].layout.width, screen.nodes[0].layout.height)
try:
handler.apply(screen, ResizeAction(target_id="missing", width=500))
except ValueError as error:
print("无效目标:", error)