Saltearse al contenido

Campos condicionales a partir de propiedades

Al definir las propiedades de una colección, puedes elegir utilizar un constructor (builder) PropertyBuilder, en lugar de asignar la configuración de la propiedad directamente.

Esto es útil para cambiar configuraciones de propiedades como valores disponibles sobre la marcha (on the fly), basándose en otros valores.

Ejemplo de campo que se habilita o deshabilita según otros valores:

import {
buildCollection,
EntityCollection,
EntityReference
} from "@firecms/core";
type Product = {
name: string;
main_image: string;
available: boolean;
price: number;
related_products: EntityReference[];
publisher: {
name: string;
external_id: string;
}
}
export const productCollection: EntityCollection = buildCollection<Partial<Product>>({
name: "Producto",
properties: {
available: {
dataType: "boolean",
name: "Disponible"
},
price: ({ values }) => ({
dataType: "number",
name: "Precio",
validation: {
requiredMessage: "Debes establecer un precio entre 0 y 1000",
min: 0,
max: 1000
},
disabled: !values.available && {
clearOnDisabled: true,
disabledMessage: "Solo puedes establecer el precio en artículos disponibles"
},
description: "Precio con validación de rango"
})
}
});

Un tipo User (Usuario) que tiene un campo source (fuente) que puede ser del tipo facebook o apple, y sus campos cambian en consecuencia

import {
buildCollection,
EntityCollection,
buildProperty,
buildProperties
} from "@firecms/core";
type User = {
source: {
type: "facebook",
facebookId: string
} | {
type: "apple",
appleId: number
}
}
export const userSchema: EntityCollection = buildCollection<User>({
name: "Usuario",
properties: {
source: ({ values }) => {
const properties = buildProperties<any>({
type: {
dataType: "string",
enumValues: {
"facebook": "FacebookId",
"apple": "Apple"
}
}
});
if (values.source) {
if ((values.source as any).type === "facebook") {
properties["facebookId"] = buildProperty({
dataType: "string"
});
} else if ((values.source as any).type === "apple") {
properties["appleId"] = buildProperty({
dataType: "number"
});
}
}
return ({
dataType: "map",
name: "Fuente",
properties: properties
});
}
}
});