When you wrap inputs in a RowLayout, calling parameter.setValue() before the layout is registered into the ConfiguratorEntry will silently fail.
The fix: register the layout first via .addToConfiguratorEntry(ce) or the equivalent ce.createParameter(layout), then call parameter.setValue().
This applies to every configurator logic — standalone configurators, dashboard inline configurators, Quote / Agreement / Promotion / Rebate header configurators, Model Class configurator tabs.
Sample code
Row 1 is user-editable (BaseValue, Multiplier). Row 2 is read-only (Product) and is driven by Row 1. The wrong vs right placements of setValue() are highlighted inline.
Groovy
def ibf = api.inputBuilderFactory()
def ce = api.createConfiguratorEntry()
// Row 1 — drivers
def baseValueInput = ibf.createIntegerUserEntry("BaseValue")
.setLabel("Base Value")
.setRequired(true)
.buildContextParameter()
def multiplierInput = ibf.createIntegerUserEntry("Multiplier")
.setLabel("Multiplier")
.setRequired(true)
.buildContextParameter()
// Row 2 — derived
def productInput = ibf.createIntegerUserEntry("Product")
.setLabel("Product (Base x Multiplier)")
.setReadOnly(true)
.buildContextParameter()
Integer base = input.BaseValue as Integer
Integer mult = input.Multiplier as Integer
// WRONG: setValue() here does nothing. The row layout has not yet
// been attached to the ConfiguratorEntry, so the value never propagates.
//
// if (base != null && mult != null) {
// productInput.setValue(base * mult)
// }
ibf.createRowLayout("InputsRow")
.addInput(baseValueInput)
.addInput(multiplierInput)
.addToConfiguratorEntry(ce)
ibf.createRowLayout("DerivedRow")
.addInput(productInput)
.addToConfiguratorEntry(ce)
// CORRECT: setValue() after .addToConfiguratorEntry(ce). The value
// propagates to the rendered Row 2 input.
if (base != null && mult != null) {
productInput.setValue(base * mult)
}
return ce