Projet

Général

Profil

0001-forms-trigger-content-evaluation-as-option-gets-auto.patch

Frédéric Péters, 06 avril 2020 13:54

Télécharger (5,79 ko)

Voir les différences:

Subject: [PATCH] forms: trigger content evaluation as <option> gets
 autoselected (#41363)

 tests/test_form_pages.py             | 47 ++++++++++++++++++++++++++++
 wcs/forms/common.py                  | 20 ++++++++----
 wcs/qommon/static/js/qommon.forms.js |  2 +-
 3 files changed, 62 insertions(+), 7 deletions(-)
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
-