feat(nakui): Fase 7 del ERP — pulido (cierra el plan maestro)

Validación inline: al fallar un submit por campos required vacíos, el
form los marca (label destructivo + mensaje debajo), no sólo un toast.
MetaApp.form_errors + validate_required_fields. Secciones de formulario:
FieldSpec.section agrupa campos bajo encabezados; abrir_form del CRM las
usa. Campos condicionales y pulido puramente visual: scope-out conciente.

El plan docs/nakui-erp-masterplan.md queda completo (7/7 fases). Tests
verdes (meta-schema 16, meta-runtime 70, meta-form 8, nakui-ui 14);
clippy limpio en las libs.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 19:43:44 +00:00
parent b13486e240
commit c56ef25546
9 changed files with 168 additions and 12 deletions
+6 -6
View File
@@ -139,12 +139,12 @@
"title": "Abrir oportunidad (morphism)",
"entity": "Oportunidad",
"fields": [
{ "name": "cliente_ref", "label": "Cliente", "kind": "entity_ref", "ref_entity": "Cliente", "required": true, "help": "Click en un cliente de la lista para seleccionarlo." },
{ "name": "oportunidad_id", "label": "ID de la oportunidad", "kind": "auto_id" },
{ "name": "titulo", "label": "Título", "kind": "text", "required": true },
{ "name": "monto", "label": "Monto", "kind": "number", "required": true, "default": "0" },
{ "name": "currency", "label": "Moneda", "kind": "text", "default": "USD" },
{ "name": "timestamp", "label": "Fecha ISO", "kind": "text", "required": true, "default": "2026-05-21T12:00:00Z" }
{ "name": "cliente_ref", "label": "Cliente", "kind": "entity_ref", "ref_entity": "Cliente", "required": true, "section": "Oportunidad", "help": "Click en un cliente de la lista para seleccionarlo." },
{ "name": "oportunidad_id", "label": "ID de la oportunidad", "kind": "auto_id", "section": "Oportunidad" },
{ "name": "titulo", "label": "Título", "kind": "text", "required": true, "section": "Oportunidad" },
{ "name": "monto", "label": "Monto", "kind": "number", "required": true, "default": "0", "section": "Importe y fecha" },
{ "name": "currency", "label": "Moneda", "kind": "text", "default": "USD", "section": "Importe y fecha" },
{ "name": "timestamp", "label": "Fecha ISO", "kind": "text", "required": true, "default": "2026-05-21T12:00:00Z", "section": "Importe y fecha" }
],
"on_submit": {
"kind": "morphism",