0001-forms-trigger-content-evaluation-as-option-gets-auto.patch
tests/test_form_pages.py | ||
---|---|---|
6966 | 6966 |
assert 'f2' in resp.form.fields |
6967 | 6967 | |
6968 | 6968 | |
6969 |
def test_field_live_select_content_on_other_default_select_option(pub, http_requests): |
|
6970 |
create_user(pub) |
|
6971 | ||
6972 |
FormDef.wipe() |
|
6973 |
formdef = FormDef() |
|
6974 |
formdef.name = 'Foo' |
|
6975 |
formdef.fields = [ |
|
6976 |
fields.ItemField(type='item', id='2', label='Foo', varname='bar2', |
|
6977 |
data_source={ |
|
6978 |
'type': 'json', |
|
6979 |
'value': 'http://remote.example.net/json-list' |
|
6980 |
}), |
|
6981 |
fields.ItemField(type='item', id='3', label='Foo', |
|
6982 |
data_source={ |
|
6983 |
'type': 'json', |
|
6984 |
'value': '{% if form_var_bar2 %}http://remote.example.net/json-list?plop={{form_var_bar2}}{% endif %}' |
|
6985 |
}), |
|
6986 |
] |
|
6987 |
formdef.store() |
|
6988 |
formdef.data_class().wipe() |
|
6989 | ||
6990 |
app = get_app(pub) |
|
6991 |
resp = app.get('/foo/') |
|
6992 |
assert 'f2' in resp.form.fields |
|
6993 |
assert 'f3' in resp.form.fields |
|
6994 |
assert resp.html.find('div', {'data-field-id': '2'}).attrs['data-live-source'] == 'true' |
|
6995 |
assert resp.html.find('div', {'data-field-id': '3'}).find('select') |
|
6996 |
# javascript will make an initial call with ?modified_dield_id=init, |
|
6997 |
# simulate. |
|
6998 |
live_resp = app.post('/foo/live?modified_field_id=init', params=resp.form.submit_fields()) |
|
6999 |
assert 'items' in live_resp.json['result']['3'] |
|
7000 |
resp.form['f3'].options = [] |
|
7001 |
for item in live_resp.json['result']['3']['items']: |
|
7002 |
# simulate javascript filling the <select> |
|
7003 |
resp.form['f3'].options.append((item['id'], False, item['text'])) |
|
7004 |
resp.form['f3'] = 'a' |
|
7005 |
resp = resp.form.submit('submit') |
|
7006 |
assert 'Check values then click submit.' in resp.text |
|
7007 |
assert 'name="f2"' in resp.text |
|
7008 |
assert 'name="f3"' in resp.text |
|
7009 |
resp = resp.form.submit('submit') |
|
7010 |
resp = resp.follow() |
|
7011 |
formdata = formdef.data_class().select()[0] |
|
7012 |
assert formdata.data['2'] == 'a' |
|
7013 |
assert formdata.data['3'] == 'a' |
|
7014 | ||
7015 | ||
6969 | 7016 |
def test_field_live_comment_content(pub, http_requests): |
6970 | 7017 |
FormDef.wipe() |
6971 | 7018 |
formdef = FormDef() |
wcs/forms/common.py | ||
---|---|---|
667 | 667 |
for field in displayed_fields: |
668 | 668 |
result[field.id] = {'visible': field.is_visible(formdata.data, formdata.formdef)} |
669 | 669 | |
670 |
modified_field_varname = None |
|
671 |
for field in displayed_fields: |
|
672 |
if field.id == get_request().form.get('modified_field_id'): |
|
673 |
modified_field_varname = field.varname |
|
670 |
modified_field_varnames = set() |
|
671 |
if get_request().form.get('modified_field_id') == 'init': |
|
672 |
# when page is initialized, <select> will get their first option |
|
673 |
# automatically selected, so mark them all as modified. |
|
674 |
for field in displayed_fields: |
|
675 |
if field.key == 'item' and field.display_mode == 'list' and field.varname: |
|
676 |
modified_field_varnames.add(field.varname) |
|
677 |
elif get_request().form.get('modified_field_id'): |
|
678 |
for field in displayed_fields: |
|
679 |
if field.id == get_request().form.get('modified_field_id'): |
|
680 |
modified_field_varnames.add(field.varname) |
|
681 |
break |
|
674 | 682 | |
675 | 683 |
for field in displayed_fields: |
676 | 684 |
if field.key == 'item' and field.data_source: |
... | ... | |
680 | 688 |
varnames = field.get_referenced_varnames( |
681 | 689 |
formdef=field.formdef, |
682 | 690 |
value=data_source.data_source.get('value')) |
683 |
if (modified_field_varname is None or modified_field_varname in varnames) and (
|
|
691 |
if (not modified_field_varnames or modified_field_varnames.intersection(varnames)) and (
|
|
684 | 692 |
field.display_mode == 'autocomplete' and data_source.query_parameter): |
685 | 693 |
# computed earlier, in perform_more_widget_changes, when the field |
686 | 694 |
# was added to the form |
687 | 695 |
result[field.id]['source_url'] = field.url |
688 |
if modified_field_varname in varnames:
|
|
696 |
if modified_field_varnames.intersection(varnames):
|
|
689 | 697 |
result[field.id]['items'] = [ |
690 | 698 |
{'id': x[2], 'text': x[1]} for x in field.get_options(mode='lazy')] |
691 | 699 |
for widget in form.widgets: |
wcs/qommon/static/js/qommon.forms.js | ||
---|---|---|
141 | 141 |
var modified_field = $(this).parents('[data-field-id]').data('field-id'); |
142 | 142 |
$(this).parents('form').trigger('wcs:change', {modified_field: modified_field}); |
143 | 143 |
}); |
144 |
$('form div[data-live-source]').parents('form').trigger('wcs:change'); |
|
144 |
$('form div[data-live-source]').parents('form').trigger('wcs:change', {modified_field: 'init'});
|
|
145 | 145 | |
146 | 146 |
/* searchable select */ |
147 | 147 |
$('select[data-autocomplete]').each(function(i, elem) { |
148 |
- |