diff --git a/tests/form_pages/test_live.py b/tests/form_pages/test_live.py index ed692409f..3c1c5438c 100644 --- a/tests/form_pages/test_live.py +++ b/tests/form_pages/test_live.py @@ -926,6 +926,90 @@ def test_field_live_date_prefill(pub, http_requests): assert live_resp.json['result']['2'] == {'visible': True} +def test_field_live_item_datasource_carddef_prefill(pub, http_requests): + CardDef.wipe() + + carddef_related = CardDef() + carddef_related.name = 'bar' + carddef_related.digest_templates = {'default': '{{ form_var_bar }}'} + carddef_related.fields = [ + fields.StringField(id='1', type='string', label='string', varname='bar'), + ] + carddef_related.store() + carddef_related.data_class().wipe() + for value in ['A', 'B', 'C']: + carddata = carddef_related.data_class()() + carddata.data = { + '1': value, + } + carddata.just_created() + carddata.store() + + carddef = CardDef() + carddef.name = 'foo' + carddef.digest_templates = {'default': '{{ form_var_foo }}'} + carddef.fields = [ + fields.StringField(id='1', type='string', label='string', varname='foo'), + fields.ItemField( + type='item', + id='2', + varname='item', + data_source={'type': 'carddef:bar'}, + ), + ] + carddef.store() + carddef.data_class().wipe() + carddata1 = carddef.data_class()() + carddata1.data = { + '1': 'bar', + '2': '1', + '2_display': 'A', + } + carddata1.just_created() + carddata1.store() + carddata2 = carddef.data_class()() + carddata2.data = { + '1': 'baz', + '2': '2', + '2_display': 'B', + } + carddata2.just_created() + carddata2.store() + + FormDef.wipe() + formdef = FormDef() + formdef.name = 'Foo' + formdef.fields = [ + fields.ItemField( + type='item', id='1', label='foo', varname='foo', data_source={'type': 'carddef:foo'} + ), + fields.ItemField( + type='item', + id='2', + label='item', + varname='item', + prefill={'type': 'string', 'value': '{{ form_var_foo_live_var_item }}'}, + data_source={'type': 'carddef:bar'}, + ), + ] + formdef.store() + formdef.data_class().wipe() + + app = get_app(pub) + resp = app.get('/foo/') + assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true' + assert resp.pyquery('#var_item.widget-prefilled') # second field is marked as prefilled + assert resp.form['f2'].value == '1' + resp.form['f1'] = str(carddata2.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'] == {'visible': True, 'content': '2'} + + resp.form['f2'] = '3' # manually changed -> widget-prefilled class will be removed + resp.form['f1'] = str(carddata1.id) + live_resp = app.post('/foo/live?modified_field_id=1', params=resp.form.submit_fields()) + assert live_resp.json['result']['2'] == {'visible': True} + + def test_field_live_block_string_prefill(pub, http_requests): FormDef.wipe() BlockDef.wipe() diff --git a/wcs/forms/common.py b/wcs/forms/common.py index 74281d66e..1071cafd0 100644 --- a/wcs/forms/common.py +++ b/wcs/forms/common.py @@ -807,6 +807,12 @@ class FormStatusPage(Directory, FormTemplateMixin): value = field.get_json_value(value) except ValueError: pass + elif field.key == 'item': + for option in field.get_options(): + # get raw value from display value + if option[1] == value: + value = option[0] + break entry['content'] = value elif field.prefill and field.prefill.get('type') == 'user': update_prefill = bool(get_request().form.get('modified_field_id') == 'user') diff --git a/wcs/qommon/static/js/qommon.forms.js b/wcs/qommon/static/js/qommon.forms.js index 991ff0d3b..4c3aad154 100644 --- a/wcs/qommon/static/js/qommon.forms.js +++ b/wcs/qommon/static/js/qommon.forms.js @@ -484,6 +484,11 @@ $(function() { // replace checkbox input value $widget.find('input[type=checkbox]').prop('checked', value.content); } + // replace select value + $(widget).find('select').val(value.content); + // replace radio value + $(widget).find('input[type=radio]').prop('checked', false); + $(widget).find('input[type=radio][value="'+value.content+'"]').prop('checked', true); } } });