Projet

Général

Profil

0001-forms-pass-extended-options-to-custom-live-select-fi.patch

Frédéric Péters, 06 avril 2020 15:20

Télécharger (5,07 ko)

Voir les différences:

Subject: [PATCH] forms: pass extended options to custom live select fields
 (#41369)

 tests/test_form_pages.py             | 26 ++++++++++++++++++++++++++
 tests/utilities.py                   |  1 +
 wcs/fields.py                        |  7 +++++++
 wcs/forms/common.py                  |  8 ++++++--
 wcs/qommon/static/js/qommon.forms.js |  1 +
 5 files changed, 41 insertions(+), 2 deletions(-)
tests/test_form_pages.py
7013 7013
    assert formdata.data['3'] == 'a'
7014 7014

  
7015 7015

  
7016
def test_field_live_select_extended_content(pub, http_requests):
7017
    FormDef.wipe()
7018
    formdef = FormDef()
7019
    formdef.name = 'Foo'
7020
    formdef.fields = [
7021
        fields.StringField(type='string', id='2', label='Bar2', size='40',
7022
            required=True, varname='bar2'),
7023
        fields.ItemField(type='item', id='3', label='Foo',
7024
            extra_css_class='template-whatever',
7025
            data_source={
7026
                'type': 'json',
7027
                'value': '{% if form_var_bar2 %}http://remote.example.net/json-list-extra?plop={{form_var_bar2}}{% endif %}'
7028
            }),
7029
    ]
7030
    formdef.store()
7031
    formdef.data_class().wipe()
7032

  
7033
    app = get_app(pub)
7034
    resp = app.get('/foo/')
7035
    assert resp.html.find('div', {'data-field-id': '2'}).attrs['data-live-source'] == 'true'
7036
    assert resp.html.find('div', {'data-field-id': '3'}).find('select')
7037
    resp.form['f2'] = 'plop'
7038
    live_resp = app.post('/foo/live?modified_field_id=2', params=resp.form.submit_fields())
7039
    assert live_resp.json['result']['3']['items']['foo'] == 'bar'
7040

  
7041

  
7016 7042
def test_field_live_comment_content(pub, http_requests):
7017 7043
    FormDef.wipe()
7018 7044
    formdef = FormDef()
tests/utilities.py
327 327
            'http://remote.example.net/500': (500, 'internal server error', None),
328 328
            'http://remote.example.net/json': (200, '{"foo": "bar"}', None),
329 329
            'http://remote.example.net/json-list': (200, '{"data": [{"id": "a", "text": "b"}]}', None),
330
            'http://remote.example.net/json-list-extra': (200, '{"data": [{"id": "a", "text": "b", "foo": "bar"}]}', None),
330 331
            'http://remote.example.net/json-err0': (200, '{"data": "foo", "err": 0}', None),
331 332
            'http://remote.example.net/json-err1': (200, '{"data": "", "err": 1}', None),
332 333
            'http://remote.example.net/json-list-err1': (200, '{"data": [{"id": "a", "text": "b"}], "err": 1}', None),
wcs/fields.py
1425 1425
            return [(x, x) for x in self.items]
1426 1426
        return []
1427 1427

  
1428
    def get_extended_options(self):
1429
        if self.data_source:
1430
            return data_sources.get_structured_items(self.data_source, mode='lazy')
1431
        if self.items:
1432
            return [{'id': x, 'text': x} for x in self.items]
1433
        return []
1434

  
1428 1435
    def get_display_mode(self, data_source=None):
1429 1436
        if not data_source:
1430 1437
            data_source = data_sources.get_object(self.data_source)
wcs/forms/common.py
694 694
                    # was added to the form
695 695
                    result[field.id]['source_url'] = field.url
696 696
                if modified_field_varnames.intersection(varnames):
697
                    result[field.id]['items'] = [
698
                            {'id': x[2], 'text': x[1]} for x in field.get_options(mode='lazy')]
697
                    if 'template-' in (field.extra_css_class or ''):
698
                        # custom template, it may need all option attributes
699
                        result[field.id]['items'] = field.get_extended_options()
700
                    else:
701
                        result[field.id]['items'] = [
702
                                {'id': x[2], 'text': x[1]} for x in field.get_options(mode='lazy')]
699 703
        for widget in form.widgets:
700 704
            if not getattr(widget, 'field', None):
701 705
                continue
wcs/qommon/static/js/qommon.forms.js
118 118
              }
119 119
              $option.appendTo($select);
120 120
            }
121
            $select.trigger('wcs:options-change', {items: value.items});
121 122
          }
122 123
          if (value.content) {
123 124
            var $widget = $('[data-field-id="' + key + '"]');
124
-