feat(types): Type Editor panel — CRUD de tipos en vivo (issue 0007)

- views_type_editor: panel "Types" con tabs Entities/Relations.
  Entities: name, color picker, shape combo, icon (ti-* + cp preview),
  principal_field combo, tabla de Fields (string/int/float/bool/date/url/enum)
  con required y enum values CSV; up/down/X por fila.
  Relations: name, color, style.
  Footer Save / Reload from disk + indicador dirty + error inline.
- views_type_editor_delete_modal: confirm con conteo de entidades en uso.
- types_registry: shape_name() + shape: emit en types_save_yaml para
  round-trip estable de la cosmetica editada en UI.
- main.cpp: panel "Types" en g_panels; init types_draft tras load_input;
  want_types_save -> save + apply_types_yaml + rebuild atlas + bind +
  refresh inspector caches; want_types_reload simetrico; conteo de
  uso desde operations.db cuando se abre el modal de delete.
This commit is contained in:
2026-05-01 00:42:30 +02:00
parent 69f1afcf9e
commit f80348d604
5 changed files with 549 additions and 1 deletions
@@ -0,0 +1,45 @@
---
id: 0007
title: Type Editor panel — CRUD de tipos desde la app
status: completed
priority: medium
created: 2026-04-30
completed: 2026-05-01
depends_on: [0005, 0006]
---
## Objetivo
Panel "Types" dockeable que permita editar el `types.yaml` del proyecto
activo desde dentro de la app. Cosmetica (color/shape/icon) y schema de
campos (lista de fields con tipo). Save reescribe el yaml y dispara
`apply_types_yaml` + reload del grafo.
## UI
- Tabs: "Entities" / "Relations".
- Lista a la izquierda con los tipos. Botones `+` (anadir), `-` (borrar), drag para reordenar.
- Panel derecho con la edicion del tipo seleccionado:
- Entities: name, color (color picker), shape (combo), icon (input + preview), principal_field (combo entre los fields).
- Relations: name, color, style.
- Sub-seccion **Fields** (solo entities): tabla con name / type / required / values (para enum). Botones para anadir/quitar/reordenar fila.
- Footer: `Save to types.yaml` (deshabilitado si no hay cambios) + `Reload from disk` (descarta cambios).
## Cambios en codigo
- `views.{h,cpp}`: nueva fn `views_type_editor(AppState&)` + entrada en panels menu.
- `app_state`: anade `ParsedTypes types_draft;` y `bool types_dirty;`.
- Usa `types_save_yaml` de 0005 para persistir.
- Tras Save: `apply_types_yaml(graph, types_draft)` + rebuild del IconAtlas.
## Notas
- Borrar un tipo NO toca las entidades existentes con ese `type_ref` — se quedan con un tipo "huerfano" hasta que el usuario las cambie. Mostrar warning antes del delete con conteo de entidades afectadas.
- Cambiar `principal_field` de un tipo regenera los labels visibles.
## Definicion de hecho
- Crear, editar y borrar entity/relation types desde la UI.
- Editar fields (anadir, cambiar type, marcar required, definir enum values).
- Save persiste a `projects/<activo>/types.yaml` y aplica al grafo en vivo.
- Reload from disk descarta cambios.