Aller au contenu

Champs conditionnels depuis les propriétés

Lors de la définition des propriétés d’une collection, vous pouvez choisir d’utiliser un constructeur PropertyBuilder, au lieu d’assigner la configuration de propriété directement.

Ceci est utile pour changer les configurations de propriétés comme les valeurs disponibles à la volée, en fonction d’autres valeurs.

Exemple d’un champ qui est activé ou désactivé en fonction d’autres valeurs :

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: "Product",
properties: {
available: {
dataType: "boolean",
name: "Available"
},
price: ({ values }) => ({
dataType: "number",
name: "Price",
validation: {
requiredMessage: "You must set a price between 0 and 1000",
min: 0,
max: 1000
},
disabled: !values.available && {
clearOnDisabled: true,
disabledMessage: "You can only set the price on available items"
},
description: "Price with range validation"
})
}
});

Un type User qui a un champ source qui peut être de type facebook ou apple, et ses champs changent en conséquence

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: "User",
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: "Source",
properties: properties
});
}
}
});