Filtres dinàmics en restriccions d'instància
Quan una propietat fa referència a una instància d'un altre model (per exemple, una Order que apunta a un Customer), pots aplicar-hi una restricció InstanceReferenceConstraint per limitar quines instàncies es poden seleccionar. Aquesta restricció té un camp Filter que pot ser un valor literal o, més potent, una referència dinàmica a una altra propietat de la mateixa instància que s'està editant.
Vocabulari
Tres conceptes per tenir clars abans de continuar:
- Model contenidor — el model que conté la propietat restringida. Si poses la restricció a
Order.customer, el model contenidor ésOrder. - Target Model — el model de les instàncies que es poden seleccionar. En l'exemple,
Customer. - Property — la propietat concreta restringida. En l'exemple,
Order.customer.
Filtre estàtic vs dinàmic
Un filtre estàtic compara una propietat del Target Model amb un valor literal:
Mostra només els
Customeronregion == "Catalunya".
Un filtre dinàmic compara una propietat del Target Model amb el valor d'una altra propietat del model contenidor, valor que es resol en el moment d'editar la instància:
Mostra només els
Customeronregion == $ref(Order.region).
Quan obres l'Order #42 (regió = Catalunya), el desplegable de customer mostrarà únicament clients catalans. Quan obris l'Order #43 (regió = Aragó), mostrarà aragonesos. El filtre és el mateix; el valor referenciat canvia segons la instància que estàs editant.
Com construir un filtre dinàmic
- Crea o edita la
InstanceReferenceConstraint. - Tria el Model (contenidor) i la Property que vols restringir.
- Tria el TargetModel.
- Obre el camp Filter amb el botó d'edició. S'obre el constructor de filtres sobre el TargetModel.
- Tria una propietat del TargetModel i un operador (per exemple,
=). - S'obre el diàleg "Valor per a X" amb les opcions de quin valor utilitzar.
El diàleg "Valor per a X"
Cada vegada que crees un filtre dins d'una restricció, el sistema et mostra aquest diàleg perquè triïs d'on surt el valor de la comparació:
- Propietats del model contenidor del mateix tipus — apareixen com a entrades clicables. Triar-ne una desa una referència dinàmica (
$ref), que es resoldrà en temps d'edició. - Usa un valor estàtic — sempre disponible; permet introduir un literal.
- Si el model contenidor no té cap propietat compatible, el diàleg ho indica explícitament amb un missatge ("No hi ha cap propietat compatible per referenciar") i només pots triar l'opció estàtica. Això no és un error: simplement no hi ha cap camp adequat per referenciar.
Perquè una propietat del model contenidor aparegui com a opció de referència, ha de ser del mateix tipus que la propietat del TargetModel que estàs filtrant. Per exemple, filtrant una String del TargetModel, només veuràs les Strings del model contenidor.
Tipus admesos
Pots filtrar i referenciar propietats d'aquests tipus:
- String, Integer, Float, Decimal
- Boolean
- DateTime, Date
- ModelReference, InstanceReference, ModelPropertyReference
Les propietats de tipus Col·lecció no es poden filtrar (ni amb valors literals ni amb referències dinàmiques).
Resolució en temps d'execució
Quan un usuari obre la instància restringida, Yellow recorre els filtres i, per a cada $ref, llegeix el valor actual de la propietat referenciada en la instància que s'està editant i el substitueix dins del filtre. Si la propietat referenciada està buida, aquell filtre concret se salta — no es bloqueja la selecció, simplement no s'aplica aquesta condició.
Per això un filtre dinàmic és tan útil quan vols mantenir relacions consistents entre instàncies: pots forçar que el Customer d'una Order sigui de la mateixa regió que l'Order, sense haver de duplicar el filtre per a cada combinació possible de valors.