dataviz: move time range fields display logic from js to form (#76044) #73

Merged
vdeniaud merged 1 commits from wip/76044-dataviz-eviter-le-clignotement-a into main 2023-04-03 10:15:34 +02:00
4 changed files with 55 additions and 41 deletions

View File

@ -219,6 +219,14 @@ class ChartNgForm(ChartFiltersMixin, forms.ModelForm):
'time_range_end_template',
):
del self.fields[field]
else:
if self.instance.time_range != 'range':
del self.fields['time_range_start']
del self.fields['time_range_end']
if self.instance.time_range != 'range-template':
del self.fields['time_range_start_template']
del self.fields['time_range_end_template']
def add_filter_fields(self):
new_fields = OrderedDict()
@ -357,6 +365,9 @@ class ChartFiltersForm(ChartFiltersMixin, forms.ModelForm):
self.fields.pop(field, None)
else:
self.update_time_range_choices(first_cell.statistic, exclude_template_choice=True)
if not self.is_bound and first_cell.time_range != 'range':
del self.fields['time_range_start']
del self.fields['time_range_end']
for cell in chart_cells[1:]:
cell_filter_fields = self.get_filter_fields(cell)
@ -422,6 +433,12 @@ class ChartFiltersForm(ChartFiltersMixin, forms.ModelForm):
filters_cell.save()
def clean(self):
super().clean()
if self.cleaned_data['time_range'] != 'range':
del self.fields['time_range_start']
del self.fields['time_range_end']
class ChartFiltersConfigForm(forms.ModelForm):
filters = forms.MultipleChoiceField(

View File

@ -44,18 +44,6 @@
});
}
start_field = $('#id_filter-time_range_start_p');
end_field = $('#id_filter-time_range_end_p');
$('#id_filter-time_range').change(function() {
if(this.value == 'range') {
start_field.show();
end_field.show();
} else {
start_field.hide();
end_field.hide();
}
}).change();
form.submit(function(e) {
e.preventDefault();
$(window).trigger('combo:refresh-graphs');

View File

@ -11,30 +11,8 @@
<script>
$(function () {
start_field = $('#id_cdataviz_chartngcell-{{ cell.pk }}-time_range_start_p');
end_field = $('#id_cdataviz_chartngcell-{{ cell.pk }}-time_range_end_p');
start_field_template = $('#id_cdataviz_chartngcell-{{ cell.pk }}-time_range_start_template_p');
end_field_template = $('#id_cdataviz_chartngcell-{{ cell.pk }}-time_range_end_template_p');
$('#id_cdataviz_chartngcell-{{ cell.pk }}-time_range').change(function() {
if(this.value == 'range') {
start_field.show();
end_field.show();
} else {
start_field.hide();
end_field.hide();
}
if(this.value == 'range-template') {
start_field_template.show();
end_field_template.show();
} else {
start_field_template.hide();
end_field_template.hide();
}
}).change();
$('div#panel-dataviz_chartngcell-{{ cell.pk }}-general div.content').change(function() {
$('div#cell-dataviz_chartngcell-{{ cell.pk }} button.save').click();
});
});
</script>

View File

@ -1721,6 +1721,10 @@ def test_chartng_cell_manager_new_api(app, admin_user, new_api_statistics):
assert cell.time_range == 'previous-year'
resp.form[field_prefix + 'time_range'] = 'range'
assert field_prefix + 'time_range_start' not in resp.form.fields
assert field_prefix + 'time_range_end' not in resp.form.fields
manager_submit_cell(resp.form)
resp.form[field_prefix + 'time_range_start'] = '2020-10-01'
resp.form[field_prefix + 'time_range_end'] = '2020-11-03'
manager_submit_cell(resp.form)
@ -1978,6 +1982,10 @@ def test_chartng_cell_manager_new_api_time_range_templates(app, admin_user, new_
field_prefix = 'cdataviz_chartngcell-%s-' % cell.id
resp.form[field_prefix + 'time_range'] = 'range-template'
assert field_prefix + 'time_range_start_template' not in resp.form.fields
assert field_prefix + 'time_range_end_template' not in resp.form.fields
manager_submit_cell(resp.form)
resp.form[field_prefix + 'time_range_start_template'] = 'today|add_days:"7"|adjust_to_week_monday'
resp.form[field_prefix + 'time_range_end_template'] = 'now|add_days:"14"|adjust_to_week_monday'
manager_submit_cell(resp.form)
@ -2732,9 +2740,9 @@ def test_chart_filters_cell(new_api_statistics, app, admin_user, nocache):
first_cell.statistic = Statistic.objects.get(slug='one-serie')
first_cell.save()
resp = app.get('/')
assert len(resp.form.fields) == 8
assert 'filter-time_range_start' in resp.form.fields
assert 'filter-time_range_end' in resp.form.fields
assert len(resp.form.fields) == 6
assert 'filter-time_range_start' not in resp.form.fields
assert 'filter-time_range_end' not in resp.form.fields
time_range_field = resp.form['filter-time_range']
assert time_range_field.value == ''
@ -2777,7 +2785,7 @@ def test_chart_filters_cell(new_api_statistics, app, admin_user, nocache):
assert (
resp.form['filter-overridden_filters'].value
== 'time_range,time_range_start,time_range_end,overridden_filters,time_interval,ou,service'
== 'time_range,overridden_filters,time_interval,ou,service'
)
# adding new cell with same statistics changes nothing
@ -2899,7 +2907,7 @@ def test_chart_filters_cell_future_data(app, admin_user, new_api_statistics):
@with_httmock(new_api_mock)
def test_chart_filters_cell_range_template(new_api_statistics, app, admin_user, nocache):
def test_chart_filters_cell_time_range(new_api_statistics, app, admin_user, nocache):
page = Page.objects.create(title='One', slug='index')
cell = ChartNgCell(page=page, order=1, placeholder='content')
cell.statistic = Statistic.objects.get(slug='one-serie')
@ -2907,6 +2915,29 @@ def test_chart_filters_cell_range_template(new_api_statistics, app, admin_user,
ChartFiltersCell.objects.create(page=page, order=2, placeholder='content')
app = login(app)
# time range start/end field are hidden by default on page load
resp = app.get('/')
assert 'filter-time_range' in resp.form.fields
assert 'filter-time_range_start' not in resp.form.fields
assert 'filter-time_range_end' not in resp.form.fields
# time range start/end field are hidden by default on ajax refresh
location = resp.pyquery('.chartfilterscell').attr('data-ajax-cell-url')
resp = app.get(location + '?filters_cell_id=xxx')
assert 'filter-time_range' in resp.form.fields
assert 'filter-time_range_start' not in resp.form.fields
assert 'filter-time_range_end' not in resp.form.fields
# if custom time range is set in filters cell, time range start/end fields are shown
resp = app.get(location + '?filter-time_range=range&filters_cell_id=xxx')
assert 'filter-time_range' in resp.form.fields
assert 'filter-time_range_start' in resp.form.fields
assert 'filter-time_range_end' in resp.form.fields
# if custom time range is set in chart cell, time range start/end fields are shown
cell.time_range = 'range'
cell.save()
resp = app.get('/')
assert 'filter-time_range' in resp.form.fields
assert 'filter-time_range_start' in resp.form.fields
@ -3029,7 +3060,7 @@ def test_chart_filters_cell_select_filters(new_api_statistics, app, admin_user,
cell.save()
resp = app.get('/')
assert len(resp.form.fields) == 8
assert len(resp.form.fields) == 6
assert 'filter-ou' in resp.form.fields
assert 'filter-service' in resp.form.fields
assert 'filter-time_range' in resp.form.fields
@ -3051,7 +3082,7 @@ def test_chart_filters_cell_select_filters(new_api_statistics, app, admin_user,
manager_submit_cell(resp.forms[0])
resp = app.get('/')
assert len(resp.form.fields) == 7
assert len(resp.form.fields) == 5
assert 'filter-ou' not in resp.form.fields
assert 'filter-service' in resp.form.fields
assert 'filter-time_range' in resp.form.fields