WoodyLabBuild with UIMS

Documentazione · src/engine/mapper · src/engine/utils

Mapper e slot

Sette file che fanno una cosa sola: portare dei dati dentro le aperture di una forma, e trasformarli in nodi React senza che il resolver debba sapere come.

Che cos’è uno slot

Uno slot è un’apertura nominata dentro un viewMode: header, content, footer, e qualunque altro nome il viewMode decida di dichiarare. Un figlio dice in quale apertura vuole andare con il proprio campo slot; il mapper li raggruppa per nome e il componente li riceve già divisi.

Sbagliare il nome di uno slot non dà nessun errore: dà un elemento che non appare. È il tipo di guasto peggiore, perché non lascia traccia — e la ragione per cui esiste dal/slotsByViewMode.ts, che calcola i nomi veri per proporli in interfaccia invece di lasciarli scrivere a mano.

engine/utils/slot.tsx

raggruppa i figli per apertura e produce la mappa degli slot

engine/utils/projectSlotToReact.tsx

trasforma il contenuto di uno slot in nodi React pronti

engine/utils/extractUIProps.ts

separa le props strutturali dal resto

Mappare i figli

Il caso normale: un blocco ha dei figli, ognuno dichiara il proprio slot, e vanno risolti a loro volta prima di poter essere proiettati. È ricorsivo, e ogni figlio passa dal contesto come il genitore — un figlio può essere a sua volta un contenitore, o un riferimento a un documento.

mapper/mapChildrenToSlots.ts

distribuisce i figli nelle aperture che il viewMode dichiara (la risoluzione avviene dopo, nella proiezione)

La firma

mapChildrenToSlots(
  slots: SlotDefinition[],
  children: ChildInstance[],
  context: UIMSContext,
): Promise<ResolvedSlots>

Cosa restituisce

{ header:  { nodes: [...], className: 'border-b pb-2',        tag: 'div' },
  content: { nodes: [...], className: 'flex flex-col gap-2', tag: 'div' } }

Mappare i record

Il caso delle viste: i figli ci sono, ma sono un modello. Prima della risoluzione il passo di binding fa N copie del figlio che dichiara repeatFor, una per elemento della riga, e ogni copia legge i suoi valori con dataPathValue; poi le copie passano dal mapping dei figli come tutto il resto. Il guscio resta uno: la forma della griglia appartiene al container, non alla riga.

getValueByPath è quello che rende scrivibile la mappatura: il campo si indica con un percorso (autore.nome, meta.image.url) e non serve una funzione per ogni caso.

data/bindData.ts

il passo di binding condiviso da ogni blocco: copie, percorsi, prop puntate

mapper/getValueByPath.ts

legge un valore annidato da un percorso in stringa