How to change the options of my Selectboxes component?

You can change the selectable options and their corresponding values of a Selectboxes component after initializing the form by following these steps:

  • In the initialization code:
    • Add a Hidden component. The Selectboxes component will obtain its options from it.
    • Optionally set the defaultValue property of the Hidden component as default options for the Selectboxes component.
    • Add a Selectboxes component and add a Logic object to make it reference the Hidden component for its options.
  • In the event handling code:
    • Update the value of the Hidden component to update the options of the Selectboxes.

These steps are illustrated in an example below. First, we give the initialization code:

# This hidden component holds information on the options of the Selectboxes.
hidden_key = "HiddenKey"
hid = component.Hidden(hidden_key, form)
hid.defaultValue = [
    {"label": "Option 1", value_field_name: "opt1"}, 
    {"label": "Option 2", "value": "opt2"}
]

# Create the Selectboxes component and make it reference the Hidden component.
sel = component.Selectboxes("s", form)
sel.label = "Make selection"
sel.redrawOn = hidden_key

# Add logic that always holds. The Selectboxes values shall come from the Hidden value.
logic = component_properties.Logic(sel)
logic.trigger = {
    "type": "javascript",
    "javascript": "result = true;"
}
logic.actions = {
    "name": "a",
    "type": "customAction",
    "customAction": "component.values = data." + hiddenKey
}
% This hidden component holds information on the options of the Selectboxes.
hiddenKey           = "HiddenKey";
hid                 = component.Hidden(hiddenKey, form);
hid.defaultValue    = struct( ...
    "label", {"Option 1", "Option 2"}, ...
    "value", {"opt1", "opt2"} ...
    );

% Create the Selectboxes component and make it reference the Hidden component.
sel             = component.Selectboxes("sel", form);
sel.label       = "Make selection";
sel.redrawOn    = hiddenKey;

% Add logic that always holds. The Selectboxes values shall come from the Hidden value.
logic           = componentProperties.Logic(sel);
logic.trigger   = struct( ...
    "type", "javascript", ...
    "javascript", "result = true;" ...
    );
logic.actions   = {struct( ...
    "name",         "a", ...
    "type",         "customAction", ...
    "customAction", "component.values = data." + hiddenKey ...
    )};

The event code becomes:

val = [
    {"label": "New option 1", "value": "value1"}, 
    {"label": "New option 2", "value": "value2"}
]
utils.setSubmissionData(payload, "HiddenKey", val)
val     = struct( ...
    "label", {"New option 1", "New option 2"}, ...
    "value", {"value1", "value2"} ...
    );
payload = utils.setSubmissionData(payload, "HiddenKey", val);

In a similar fashion, the options of a Select component can be changed after initialization as described here.