feat(ivr): persiste posição dos nós do editor visual entre recargas
Pedido do usuário: "faz a posição dos nós persistir entre recargas" — o editor visual da PHASE 60 recalculava o layout do zero a cada carga da página, perdendo qualquer arrasto manual assim que a tela recarregava. `IvrMenu.entryPositionX/Y` + `IvrMenuOption.positionX/Y` (nullable, puramente de apresentação — nunca entram no dialplan compilado, só no layout do canvas). Salvos no banco, nunca localStorage: mesma convenção do resto do app, estado compartilhado entre quem quer que edite o tenant, não por navegador/dispositivo. "Salvar alterações" agora lê a posição de verdade do estado de nós do @xyflow/react (reflete arrastos feitos na sessão), não do estado de conteúdo das opções — os dois tinham ficado dessincronizados desde a PHASE 60. Sem posição salva ainda (menu novo, opção recém-adicionada), continua caindo num layout automático em coluna. Testado ponta a ponta: PATCH com coordenadas específicas (incluindo o nó "Entrada"), GET de volta confirma os mesmos valores, e a página carregada de novo com uma sessão real (cookie de login, não só a API crua) já embute essas coordenadas nos props iniciais do componente. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
@@ -506,6 +506,12 @@ model IvrMenu {
|
||||
|
||||
enabled Boolean @default(true)
|
||||
|
||||
// Posição do nó "Entrada" no editor visual (PHASE 61, secao "Editor
|
||||
// visual" em docs/INBOUND_ROUTES.md) — null até o primeiro "Salvar";
|
||||
// puramente de apresentação, nunca afeta o dialplan compilado.
|
||||
entryPositionX Float? @map("entry_position_x")
|
||||
entryPositionY Float? @map("entry_position_y")
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
deletedAt DateTime? @map("deleted_at")
|
||||
@@ -530,6 +536,11 @@ model IvrMenuOption {
|
||||
|
||||
label String?
|
||||
|
||||
// Posição do nó desta opção no editor visual (PHASE 61) — mesma
|
||||
// ressalva do IvrMenu.entryPosition* acima: só apresentação.
|
||||
positionX Float? @map("position_x")
|
||||
positionY Float? @map("position_y")
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id])
|
||||
|
||||
Reference in New Issue
Block a user