Salta ai contenuti

Campi Personalizzati

Rebase genera campi modulo automaticamente in base ai tipi di proprietà. Per un comportamento personalizzato, puoi costruire i tuoi campi.

Un campo personalizzato è un componente React che riceve FieldProps:

import { FieldProps } from "@rebasepro/core";
function ColorPickerField({ value, setValue, error, showError }: FieldProps<string>) {
return (
<div>
<input
type="color"
value={value ?? "#000000"}
onChange={(e) => setValue(e.target.value)}
/>
{showError && error && <span className="text-red-500">{error}</span>}
</div>
);
}
PropTypeDescription
valueTValore attuale del campo
setValue(value: T) => voidAggiorna il valore del campo
errorstringMessaggio di errore di validazione
showErrorbooleanSe visualizzare l’errore
isSubmittingbooleanIl modulo è in fase di salvataggio
propertyPropertyLa configurazione della proprietà
contextFormContextContesto completo del modulo con tutti i valori dell’entità
disabledbooleanIl campo è di sola lettura
tableModebooleanRendering all’interno del foglio di calcolo (modalità compatta)

Registra su una singola proprietà:

properties: {
brand_color: {
type: "string",
name: "Brand Color",
Field: ColorPickerField
}
}

Registra un tipo di campo riutilizzabile:

const colorPropertyConfig: PropertyConfig = {
key: "color_picker",
name: "Color Picker",
Field: ColorPickerField,
property: {
type: "string"
}
};
// Register globally
<Rebase propertyConfigs={[colorPropertyConfig]} ... />

Quindi usalo in qualsiasi collezione:

properties: {
color: {
type: "string",
name: "Color",
propertyConfig: "color_picker"
}
}

I campi personalizzati possono accedere a tutti i valori dell’entità:

function PriceWithTaxField({ value, setValue, context }: FieldProps<number>) {
const taxRate = context.values.tax_rate ?? 0.1;
const priceWithTax = value ? value * (1 + taxRate) : 0;
return (
<div>
<input
type="number"
value={value ?? 0}
onChange={(e) => setValue(Number(e.target.value))}
/>
<p>With tax: ${priceWithTax.toFixed(2)}</p>
</div>
);
}

Quando si effettua il rendering all’interno della vista foglio di calcolo, i campi dovrebbero essere compatti. Controlla tableMode:

function MyField({ value, setValue, tableMode }: FieldProps<string>) {
if (tableMode) {
return <span onClick={() => { /* open editor */ }}>{value}</span>;
}
return (
<div>
<label>Full Editor</label>
<textarea value={value ?? ""} onChange={(e) => setValue(e.target.value)} />
</div>
);
}

Per il rendering personalizzato nella tabella (modalità non di modifica), usa il componente Preview:

function ColorPreview({ value }: { value: string }) {
return (
<div style={{ display: "flex", alignItems: "center", gap: 8 }}>
<div style={{
width: 24, height: 24,
borderRadius: 4,
backgroundColor: value
}} />
<span>{value}</span>
</div>
);
}
// Register it
properties: {
color: {
type: "string",
name: "Color",
Field: ColorPickerField,
Preview: ColorPreview
}
}