forms: allow dynamic prefill of autocomplete fields (#60412) #792

Open
fpeters wants to merge 1 commits from wip/60412-dynamic-prefill-select2-card into main
3 changed files with 59 additions and 0 deletions

View File

@ -814,6 +814,54 @@ def test_field_live_select(pub, http_requests):
assert len(live_resp.json['result']['3']['items']) == 1
def test_field_live_select_autocomplete_card_prefill(pub, http_requests):
CardDef.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.digest_templates = {'default': 'value: {{ form_var_foo }}'}
carddef.fields = [fields.StringField(id='1', label='string', varname='foo')]
carddef.store()
carddef.data_class().wipe()
for value in ('foo', 'bar', 'bar'):
carddata = carddef.data_class()()
carddata.data = {'1': value}
carddata.just_created()
carddata.store()
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [
fields.StringField(id='1', label='Text', varname='text'),
fields.ItemField(
id='2',
label='foo',
varname='foo',
data_source={'type': 'carddef:foo'},
display_mode='autocomplete',
prefill={'type': 'string', 'value': '{{ form_var_text }}'},
),
]
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/foo/')
resp.form['f1'] = '2'
# prefilled with id
live_resp = app.post('/foo/live?modified_field_id=1&prefilled_2=on', params=resp.form.submit_fields())
assert live_resp.json['result']['2']['content'] == '2'
assert live_resp.json['result']['2']['display_value'] == 'value: bar'
# prefilled with text
resp.form['f1'] = 'value: foo'
live_resp = app.post('/foo/live?modified_field_id=1&prefilled_2=on', params=resp.form.submit_fields())
assert live_resp.json['result']['2']['content'] == '1'
assert live_resp.json['result']['2']['display_value'] == 'value: foo'
def test_field_live_items_checkboxes(pub, http_requests):
FormDef.wipe()
formdef = FormDef()

View File

@ -965,6 +965,8 @@ class FormStatusPage(Directory, FormTemplateMixin):
id_value = field.get_id_by_option_text(value)
if id_value:
value = id_value
if field.display_mode == 'autocomplete':
entry['display_value'] = field.get_display_value(value)
elif field.key == 'file' and value:
file_storage = field.storage
try:

View File

@ -724,8 +724,17 @@ $(function() {
// replace checkbox input value
$widget.find('input[type=checkbox]').prop('checked', value.content);
}
if ($widget.is('.JsonpSingleSelectWidget') && value.display_value) {
$(widget).find('select').empty();
var option = $('<option></option>', {value: value.content, text: value.display_value});
option.appendTo($(widget).find('select'));
}
// replace select value
$(widget).find('select').val(value.content);
if ($widget.is('.SingleSelectHintWidget') && $widget.find('select[data-autocomplete]').length) {
// autocomplete, select2 must be notifed to update its part
$widget.find('select[data-autocomplete]').trigger('change.select2');
}
if ($.type(value.content) == 'string' && value.content.indexOf('"') == -1) {
// replace radio value
$(widget).find('input[type=radio]').prop('checked', false);