fields: fix live prefill for date fields (#52064)
gitea-wip/wcs/pipeline/head There was a failure building this commit Details

This commit is contained in:
Lauréline Guérin 2021-10-15 09:18:17 +02:00
parent ff771c9ded
commit a2a7f073f8
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 73 additions and 1 deletions

View File

@ -1,3 +1,4 @@
import datetime
import io
import json
from unittest import mock
@ -861,6 +862,70 @@ def test_field_live_bool_prefill(pub, http_requests):
assert live_resp.json['result']['2'] == {'visible': True}
def test_field_live_date_prefill(pub, http_requests):
pub.cfg['language'] = {'language': 'fr'}
pub.write_cfg()
CardDef.wipe()
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.DateField(
type='date',
id='2',
varname='date',
),
]
carddef.store()
carddef.data_class().wipe()
carddata1 = carddef.data_class()()
carddata1.data = {
'1': 'bar',
'2': datetime.date(2021, 10, 1).timetuple(),
}
carddata1.just_created()
carddata1.store()
carddata2 = carddef.data_class()()
carddata2.data = {
'1': 'baz',
'2': datetime.date(2021, 10, 30).timetuple(),
}
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.DateField(
type='date',
id='2',
label='date',
varname='date',
prefill={'type': 'string', 'value': '{{ form_var_foo_live_var_date }}'},
),
]
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_date.widget-prefilled') # second field is marked as prefilled
assert resp.form['f2'].value == ''
resp.form['f1'] = str(carddata1.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': '2021-10-01'}
resp.form['f2'] = '2021-10-30' # manually changed -> widget-prefilled class will be removed
resp.form['f1'] = str(carddata2.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()

View File

@ -800,6 +800,13 @@ class FormStatusPage(Directory, FormTemplateMixin):
value = field.get_prefill_value()[0]
if field.key == 'bool':
value = field.convert_value_from_str(value)
elif field.key == 'date' and value:
try:
value = field.convert_value_from_anything(value)
# convert date to Y-m-d as expected by the <input type=date> field
value = field.get_json_value(value)
except ValueError:
pass
entry['content'] = value
elif field.prefill and field.prefill.get('type') == 'user':
update_prefill = bool(get_request().form.get('modified_field_id') == 'user')

View File

@ -479,7 +479,7 @@ $(function() {
} else {
if ($(widget).is('.widget-prefilled') || $(widget).is('.widget-readonly') || data.modified_field == 'user') {
// replace text input value
$(widget).find('input[type=text], input[type=tel], input[type=numeric], input[type=email], textarea').val(value.content);
$(widget).find('input[type=text], input[type=tel], input[type=numeric], input[type=email], input[type=date], textarea').val(value.content);
// replace checkbox input value
$(widget).find('input[type=checkbox]').prop('checked', value.content);
}