forms: allow dynamic prefill of autocomplete fields (#60412) #792
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue