From 68829de346370318b8ccf5e2ebb8c5af7009a610 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Fri, 8 Jan 2016 21:00:56 +0100 Subject: [PATCH] admin: use new dynamic-display js possibility in prefill widgets (#9559) --- tests/test_admin_pages.py | 13 ++---- wcs/fields.py | 90 ++++++++++++++++++++++++------------------ wcs/qommon/static/js/qommon.js | 3 +- 3 files changed, 57 insertions(+), 49 deletions(-) diff --git a/tests/test_admin_pages.py b/tests/test_admin_pages.py index 1b18d4a..10edeb7 100644 --- a/tests/test_admin_pages.py +++ b/tests/test_admin_pages.py @@ -840,20 +840,13 @@ def test_form_edit_field_advanced(pub): assert resp.forms[0]['label'].value == '1st field' assert 'Additional parameters' in resp.body assert '' in resp.body - # hceck the "prefill" field is under additional parameters + # check the "prefill" field is under additional parameters assert resp.body.index('Additional parameters') < \ resp.body.index('') - # start filling the "prefill" field + # complete the "prefill" field resp.forms[0]['prefill$type'] = 'String' - resp = resp.forms[0].submit('prefill$apply') - - # it should now appear before the additional parameters section - assert resp.body.index('Additional parameters') > \ - resp.body.index('') - - # complete it - resp.forms[0]['prefill$value'] = 'test' + resp.forms[0]['prefill$value_string'] = 'test' resp = resp.forms[0].submit('submit') assert resp.location == 'http://example.net/backoffice/forms/1/fields/' resp = resp.follow() diff --git a/wcs/fields.py b/wcs/fields.py index 0a5f35b..17ca94f 100644 --- a/wcs/fields.py +++ b/wcs/fields.py @@ -20,6 +20,7 @@ import random import re import base64 import xml.etree.ElementTree as ET +import collections from quixote import get_request, get_publisher from quixote.html import htmltext, TemplateIO @@ -50,57 +51,70 @@ class PrefillSelectionWidget(CompositeWidget): if kwargs.get('map'): options = [('none', _('None')), ('geolocation', _('Geolocation')),] - self.add(SingleSelectWidget, 'type', options = options, value = value.get('type')) + self.add(SingleSelectWidget, 'type', options=options, value=value.get('type'), + attrs={'data-dynamic-display-parent': 'true'}) self.parse() if not self.value: self.value = {} - if self.value.get('type') in ('string', 'formula'): - self.add(StringWidget, 'value', value = value.get('value'), size=80) - elif self.value.get('type') == 'user': - formdef = get_publisher().user_class.get_formdef() - users_cfg = get_cfg('users', {}) - if formdef: - user_fields = [] - for field in formdef.fields: - if field.label in [x[1] for x in user_fields]: - # do not allow duplicated field names - continue - user_fields.append((field.id, field.label)) - if not users_cfg.get('field_email'): - user_fields.append(('email', _('Email (builtin)'))) - else: - user_fields = [('name', _('Name')), ('email', _('Email'))] + prefill_types = collections.OrderedDict(options) + self.add(StringWidget, 'value_string', size=80, + value=value.get('value') if value.get('type') == 'string' else None, + attrs={'data-dynamic-display-child-of': 'prefill$type', + 'data-dynamic-display-value': prefill_types.get('string')}) + self.add(StringWidget, 'value_formula', size=80, + value=value.get('value') if value.get('type') == 'formula' else None, + attrs={'data-dynamic-display-child-of': 'prefill$type', + 'data-dynamic-display-value': prefill_types.get('formula')}) + + formdef = get_publisher().user_class.get_formdef() + users_cfg = get_cfg('users', {}) + if formdef: + user_fields = [] + for field in formdef.fields: + if field.label in [x[1] for x in user_fields]: + # do not allow duplicated field names + continue + user_fields.append((field.id, field.label)) + if not users_cfg.get('field_email'): + user_fields.append(('email', _('Email (builtin)'))) + else: + user_fields = [('name', _('Name')), ('email', _('Email'))] + self.add(SingleSelectWidget, 'value_user', + value=value.get('value') if value.get('type') == 'user' else None, + options=user_fields, + attrs={'data-dynamic-display-child-of': 'prefill$type', + 'data-dynamic-display-value': prefill_types.get('user')}) - self.add(SingleSelectWidget, 'value', value = value.get('value'), - options = user_fields) - elif self.value.get('type') == 'geolocation': - if kwargs.get('map'): - geoloc_fields = [('position', _('Position'))] - else: - geoloc_fields = [ - ('house', _('Number')), - ('road', _('Street')), - ('number-and-street', _('Number and street')), - ('postcode', _('Post Code')), - ('city', _('City')), - ('country', _('Country')), - ] - self.add(SingleSelectWidget, 'value', value=value.get('value'), - options=geoloc_fields) - - self.add(SubmitWidget, 'apply', value = _('Apply')) + if kwargs.get('map'): + geoloc_fields = [('position', _('Position'))] + else: + geoloc_fields = [ + ('house', _('Number')), + ('road', _('Street')), + ('number-and-street', _('Number and street')), + ('postcode', _('Post Code')), + ('city', _('City')), + ('country', _('Country')), + ] + self.add(SingleSelectWidget, 'value_geolocation', + value=value.get('value') if value.get('type') == 'geolocation' else None, + options=geoloc_fields, + attrs={'data-dynamic-display-child-of': 'prefill$type', + 'data-dynamic-display-value': prefill_types.get('geolocation')}) self._parsed = False def _parse(self, request): values = {} - for name in ('type', 'value'): - value = self.get(name) + type_ = self.get('type') + if type_: + values['type'] = type_ + value = self.get('value_%s' % type_) if value: - values[name] = value + values['value'] = value self.value = values or None if values and values['type'] == 'formula' and values.get('value'): try: diff --git a/wcs/qommon/static/js/qommon.js b/wcs/qommon/static/js/qommon.js index a8e2a4c..3f6ea0f 100644 --- a/wcs/qommon/static/js/qommon.js +++ b/wcs/qommon/static/js/qommon.js @@ -9,12 +9,13 @@ $(function() { error: function(error) { windows.console && console.log('bouh', error); } }); }); - $('[data-dynamic-display-parent]').change(function() { + $('[data-dynamic-display-parent]').on('change keyup', function() { var sel1 = '[data-dynamic-display-child-of="' + $(this).attr('name') + '"]'; var sel2 = '[data-dynamic-display-value="' + $(this).val() + '"]'; $(sel1).hide(); $(sel1 + sel2).show(); }); $('[data-dynamic-display-child-of]').hide(); + $('select[data-dynamic-display-parent]').trigger('change'); $('[data-dynamic-display-parent]:checked').trigger('change'); }); -- 2.7.0