When creating a new action form with some fields that require be filled in, is it currently possible to show any sort of suggested values read from a collection? For example, if the form has a field “product_id”, I would like to see the suggestions for all the possible products and select one of them to submit the form action.
I think you should be able to achieve this using the fields options of the smart actions definition, described here. You should then be able to display a list of product to choose from by specifying the field you want with this syntax.
I had a look at handling-input-values and I’ve tried to define it as product.id as suggested by the documentation. Still when I look at the interface I see a gray field (not editable) with the following message underneath it: “The search on the referenced collection is not authorized.”
Also, I don’t want all the products, I need to scope them with something like Product.available. Is this possible?
After a bit of debugging I was able to determine why it was not allowing me to edit it: I had to make sure that the Product settings in ForestAdmin had the Reference field configured. I’m now able to see a text field that I can search for a specific Product.
I still have two issues with it though:
The first one was the one I mentioned above, which is that I don’t want all the Products, but just a subset of it based on a filter/scope
I’ve tried to configure the default values for the form action following these docs but with the reference field I’m not able to pre-filled with a default value.
# collection
module ForestLiana
module Collections
class Item
include ForestLiana::Collection
collection :Item
action(
'Clone item',
type: 'single',
endpoint: '/forest/items/clone',
fields: [
{
field: 'product_id',
type: 'String',
reference: 'Product.available.id', # <<< the `available scope seems to be ignore all together
description:
is_required: true
}
]
)
end
end
end
# controller
class ItemsController < ForestLiana::ApplicationController
def clone_values
context = get_smart_action_context
item = Item.find(context[:id])
preset_values = {
product_id: item.product.id,
}
render serializer: nil, json: preset_values, status: :ok
end
end
# routes
forest_items_clone_values POST /forest/items/clone/values(.:format)
forest_items_clone POST /forest/items/clone(.:format)
If it helps, I’ve managed to pre-fill the values when I’m not using the reference.
The Product.available.id seems to ignore the available scope and just fetch all the Products when I’m typing in the field. Is there any way I can use this scope to limit the results I get?
As for your first issue, ForestAdmin does not support default values for reference fields in their smart actions forms. If that’s really something you need, I can make an entry in our board for future priorization.
Same goes for filtered references. The reference field only state the target collection’s primary key, no scopes are taken into account in the process. I can also make an entry for that.
However, if you really need to scope this reference field select, I may have two workarounds (both having drawbacks):
The first one consist of making the comparison after the validation on the forest_items_clone function. That way you could send back a message stating that this entry isn’t a valid one. But as stated the drawback here is that you check it after pressing the Clone item button, which isn’t a great flow.
The second one would be to define your own smart collection which would be a scoped copy of the targeted table (by filtering directly in the get). That way, making the reference points to this newly created smart collection, you would ensure a scoped list.
However, let’s be transparent, this last workaround will not be easy to implement and probably hard to maintain too.
About the products subset, you might be able to override the products retrieval controller (that, by default, searches in all products) to search for available products only.
You can use Referer request header to distinguish a search from the main products list and a search from your Smart Action form.