JSON Values and Hidden Fields

I am using the following fields attached (statePath) to a JSON column:
Grid::make(2)->statePath('measure')->schema([
TextInput::make("min")->numeric()->reactive(),
TextInput::make("max")->numeric()->reactive(),
TextInput::make("rec-min")->numeric()->reactive()->visible(fn($get) => $get("min") != $get("max")),
TextInput::make("rec-max")->numeric()->reactive()->visible(fn($get) => $get("min") != $get("max")),
TextInput::make("default")->numeric()->visible(fn($get) => $get("rec-min") != $get("rec-max")),
])->visible(fn($get) => $get('type') == 1 ||$get('type') == 3 || $get('type') == 5),
Grid::make(2)->statePath('measure')->schema([
TextInput::make("min")->numeric()->reactive(),
TextInput::make("max")->numeric()->reactive(),
TextInput::make("rec-min")->numeric()->reactive()->visible(fn($get) => $get("min") != $get("max")),
TextInput::make("rec-max")->numeric()->reactive()->visible(fn($get) => $get("min") != $get("max")),
TextInput::make("default")->numeric()->visible(fn($get) => $get("rec-min") != $get("rec-max")),
])->visible(fn($get) => $get('type') == 1 ||$get('type') == 3 || $get('type') == 5),
The output of the repeater is a JSON object with the following keys: min, max, rec-min, rec-max, and default. If the values of the min and max fields are equal, the rec-min and rec-max fields are hidden and their values are null in the JSON object. I have two questions about this: 1- How do I keep the values of the min, max, rec-min, and rec-max fields as integers? 2- Is there an ability to not dehydrate the fields if they are hidden? All the fields were hidden:
{"min":null,"max":null,"rec-min":null,"rec-max":null,"default":null}
{"min":null,"max":null,"rec-min":null,"rec-max":null,"default":null}
The fields where partially visible with some values:
"min":"10","max":"30","rec-min":null,"rec-max":null,"default":null}
"min":"10","max":"30","rec-min":null,"rec-max":null,"default":null}
Field cast in Eloquent
protected $casts = [
'measure' => 'json'
];
protected $casts = [
'measure' => 'json'
];
3 Replies
Majid Al Zariey
Majid Al Zariey13mo ago
The casting to integer: I had to use the following (per each field)
->dehydrateStateUsing(fn($state) => $state != null? (int)$state: null)->formatStateUsing(fn($state) => $state != null? (int)$state: null)
->dehydrateStateUsing(fn($state) => $state != null? (int)$state: null)->formatStateUsing(fn($state) => $state != null? (int)$state: null)
and excluding the null values: I used the dehydrate on the Grid as follows:
->dehydrateStateUsing(function ($state){
$filtered_state = array_filter($state, function ($value) {
return $value !== null;
});
return $filtered_state;
})
->dehydrateStateUsing(function ($state){
$filtered_state = array_filter($state, function ($value) {
return $value !== null;
});
return $filtered_state;
})
If there is any better way to approach this?
Andrew Wallo
Andrew Wallo13mo ago
You can also mutate the form data before save and update: something like “$data[‘field’] = (int) $data[‘field’]” and something similar for null values.
Majid Al Zariey
Majid Al Zariey13mo ago
would've been great if filament would keep the field as a number instead of a string