Skip to content

Commit b123c3c

Browse files
committed
Resolved conflicts
2 parents b16d179 + 127aacd commit b123c3c

File tree

9 files changed

+359
-222
lines changed

9 files changed

+359
-222
lines changed

src/assets/floating-scrollbar/jquery.floatingscroll.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/assets/floating-scrollbar/jquery.floatingscroll.min.js

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/signals/filters.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class SignalFilter(django_filters.FilterSet):
4343
format_type = django_filters.MultipleChoiceFilter(choices=FormatChoices.choices)
4444
source = django_filters.ModelMultipleChoiceFilter(queryset=SourceSubdivision.objects.all())
4545
time_type = django_filters.MultipleChoiceFilter(choices=TimeTypeChoices.choices)
46+
base_signal = django_filters.BooleanFilter(lookup_expr='isnull', field_name='base_for')
4647

4748
class Meta:
4849
model = Signal
@@ -57,6 +58,7 @@ class Meta:
5758
'format_type',
5859
'source',
5960
'time_type',
61+
'base_signal',
6062
]
6163

6264
def filter_search(self, queryset, name, value) -> Any:

src/signals/forms.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class SignalFilterForm(forms.ModelForm):
3030
format_type = forms.ChoiceField(choices=FormatChoices.choices, widget=forms.CheckboxSelectMultiple())
3131
source = forms.ModelMultipleChoiceField(queryset=SourceSubdivision.objects.all(), widget=forms.CheckboxSelectMultiple())
3232
time_type = forms.ChoiceField(choices=TimeTypeChoices.choices, widget=forms.CheckboxSelectMultiple())
33+
base_signal = forms.ChoiceField(choices=[('', _('All')), (True, _('Yes')), (False, _('No'))], required=False, widget=forms.RadioSelect())
3334

3435
class Meta:
3536
model = Signal
@@ -79,6 +80,7 @@ class Meta:
7980
'data-bs-toggle': 'tooltip',
8081
'data-bs-placement': 'bottom',
8182
}),
83+
8284
}
8385

8486
def __init__(self, *args, **kwargs) -> None:

src/signals/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ def get_url_params(self):
5353
else None,
5454
"format_type": [el for el in self.request.GET.getlist("format_type")],
5555
"source": [int(el) for el in self.request.GET.getlist("source")],
56-
"time_type": [el for el in self.request.GET.getlist("time_type")]
56+
"time_type": [el for el in self.request.GET.getlist("time_type")],
57+
"base_signal": self.request.GET.get("base_signal"),
5758
}
5859
url_params_str = ""
5960
for param_name, param_value in url_params_dict.items():

src/templates/index.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
<link href="{% static 'css/style.css' %}" rel="stylesheet" />
3535
<link href="{% static 'css/custom.css' %}" rel="stylesheet" />
3636

37+
<!-- Floating Scrollbar -->
38+
<link rel="stylesheet" href="{% static 'floating-scrollbar/jquery.floatingscroll.css' %}">
39+
3740
<!-- Select2 css -->
3841
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel="stylesheet" />
3942

@@ -138,6 +141,10 @@
138141

139142
<script src="{% static 'js/main.js' %}"></script>
140143

144+
<!-- Floating Scrollbar -->
145+
<script src="{% static 'floating-scrollbar/jquery.floatingscroll.min.js' %}"></script>
146+
147+
141148

142149
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
143150
</body>

src/templates/signals/epivis_export_data_block.html renamed to src/templates/signals/data_visualization_export.html

Lines changed: 86 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ <h5>Plot / Export data</h5>
33
<div class="row">
44
<div class="card">
55
<div class="card-body">
6-
<form class="margin-top-1rem" onsubmit="submitMode(event)" id="epivis-form">
6+
<form class="margin-top-1rem" onsubmit="submitMode(event)" id="dataForm">
77

8-
<div class="alert alert-warning alert-dismissible fade show" role="alert" id="warning-alert">
9-
<strong>Holy guacamole!</strong> You should check in on some of those fields below.
10-
</div>
8+
<div class="alert alert-warning alert-dismissible fade show" role="alert" id="warning-alert"></div>
119

1210
<div class="row">
1311
<div class="col-2">
@@ -17,14 +15,18 @@ <h5>Plot / Export data</h5>
1715
</div>
1816
<div class="col-10">
1917
<div class="form-check form-check-inline">
20-
<input class="form-check-input" type="radio" name="modes" id="epivis" value="epivis" checked>
21-
<label class="form-check-label" for="epivis">Plot data</label>
22-
</div>
23-
<div class="form-check form-check-inline">
24-
<input class="form-check-input" type="radio" name="modes" id="export" value="export">
25-
<label class="form-check-label" for="export">Export data</label>
26-
</div>
18+
<input class="form-check-input" type="radio" name="modes" id="preview" value="preview" checked>
19+
<label class="form-check-label" for="preview">Preview data</label>
20+
</div>
21+
<div class="form-check form-check-inline">
22+
<input class="form-check-input" type="radio" name="modes" id="epivis" value="epivis">
23+
<label class="form-check-label" for="epivis">Plot data</label>
2724
</div>
25+
<div class="form-check form-check-inline">
26+
<input class="form-check-input" type="radio" name="modes" id="export" value="export">
27+
<label class="form-check-label" for="export">Export data</label>
28+
</div>
29+
</div>
2830
</div>
2931
<div class="row margin-top-1rem">
3032
<div class="col-2">
@@ -73,7 +75,19 @@ <h5>Plot / Export data</h5>
7375
<select id="geographic_value" name="geographic_value" class="form-select" multiple="multiple"></select>
7476
</div>
7577
</div>
76-
<div class="row margin-top-1rem" name="choose_date" style="display: none;">
78+
<div class="row margin-top-1rem" id="timeTypeDiv">
79+
<div class="col-2">
80+
<label for="time_type" class="form-label">
81+
Time Type:
82+
</label>
83+
</div>
84+
<div class="col-10">
85+
<select id="time_type" name="time_type" class="form-select" disabled>
86+
<option selected>{{ signal.time_type }}</option>
87+
</select>
88+
</div>
89+
</div>
90+
<div class="row margin-top-1rem" name="choose_date">
7791
<div class="col-2">
7892
<label for="start_date" class="form-label">
7993
Start Date:
@@ -83,7 +97,7 @@ <h5>Plot / Export data</h5>
8397
<input type="date" class="form-control" id="start_date" name="start_date">
8498
</div>
8599
</div>
86-
<div class="row margin-top-1rem" name="choose_date" style="display: none;">
100+
<div class="row margin-top-1rem" name="choose_date">
87101
<div class="col-2">
88102
<label for="end_date" class="form-label">
89103
End Date:
@@ -98,14 +112,17 @@ <h5>Plot / Export data</h5>
98112
Submit
99113
</button>
100114
</div>
115+
<div class="row margin-top-1rem">
116+
<pre class="margin-top-1rem"><code id="modeSubmitResult"></code></pre>
117+
</div>
101118
</form>
102119
</div>
103120
</div>
104121
</div>
105122
</section>
106123
<script>
107124
var geoValues = [];
108-
var currentMode = 'epivis';
125+
var currentMode = 'preview';
109126

110127
function getFilteredGeographicValues(geographicType) {
111128
var data = geoValues.reduce((data, geoValue) => {
@@ -124,7 +141,6 @@ <h5>Plot / Export data</h5>
124141
} else {
125142
maximumSelectionLength = 10;
126143
}
127-
128144
if (geographicType) {
129145
var data = getFilteredGeographicValues(geographicType);
130146
} else {
@@ -141,23 +157,38 @@ <h5>Plot / Export data</h5>
141157

142158
document.getElementById('geographic_type').addEventListener("change", (event) => {
143159
$('#geographic_value').empty();
160+
$('#modeSubmitResult').html('');
144161
initGeographicValueSelect(currentMode, event.target.value);
145162
})
146163

147164
function handleModeChange(mode) {
148-
document.getElementById("epivis-form").reset();
165+
document.getElementById("dataForm").reset();
166+
$('#geographic_value').empty();
167+
$('#modeSubmitResult').html('');
149168

150169
var choose_dates = document.getElementsByName('choose_date');
170+
var time_type = document.getElementById('timeTypeDiv');
171+
151172
if (mode === 'epivis') {
152173
currentMode = 'epivis';
153174
choose_dates.forEach((el) => {
154175
el.style.display = 'none';
155176
});
156-
} else {
177+
$('#modeSubmitResult').html('');
178+
time_type.style.display = 'none';
179+
} else if (mode === 'export') {
157180
currentMode = 'export';
158181
choose_dates.forEach((el) => {
159182
el.style.display = 'flex';
160183
});
184+
$('#modeSubmitResult').html('');
185+
time_type.style.display = 'none';
186+
} else {
187+
currentMode = 'preview';
188+
choose_dates.forEach((el) => {
189+
el.style.display = 'flex';
190+
});
191+
time_type.style.display = 'flex';
161192
}
162193
document.getElementsByName("modes").forEach((el) => {
163194
if (currentMode === el.value) {
@@ -168,10 +199,9 @@ <h5>Plot / Export data</h5>
168199

169200
document.getElementsByName('modes').forEach((el) => {
170201
el.addEventListener('change', (event) => {
171-
$('#geographic_value').empty();
172202
currentMode = event.target.value;
173-
initGeographicValueSelect(event.target.value)
174-
handleModeChange(event.target.value);
203+
initGeographicValueSelect(currentMode)
204+
handleModeChange(currentMode);
175205
});
176206
});
177207

@@ -221,7 +251,7 @@ <h5>Plot / Export data</h5>
221251

222252
epiVisUrl += `#${urlParamsEncoded}`;
223253
window.open(epiVisUrl, '_blank').focus();
224-
} else {
254+
} else if (currentMode === 'export') {
225255
var startDate = document.getElementById('start_date').value;
226256
var endDate = document.getElementById('end_date').value;
227257

@@ -233,7 +263,42 @@ <h5>Plot / Export data</h5>
233263
}
234264

235265
dataExportUrl += `?signal=${dataSource}:${dataSignal}&start_day=${startDate}&end_day=${endDate}&geo_type=${geographicType}&geo_values=${geographicValue}`;
266+
$('#modeSubmitResult').html(`Manually fetch data: \n\nwget --content-disposition "${dataExportUrl}"`);
236267
window.open(dataExportUrl, '_blank').focus();
268+
} else {
269+
var timeType = document.getElementById('time_type').value;
270+
271+
var startDate = document.getElementById('start_date').value.replaceAll('-', '');
272+
var endDate = document.getElementById('end_date').value.replaceAll('-', '');
273+
274+
var requestSent = false;
275+
276+
if (!requestSent) {
277+
$.ajax({
278+
url: 'https://api.covidcast.cmu.edu/epidata/covidcast/',
279+
type: 'GET',
280+
data: {
281+
'time_type': timeType,
282+
'time_values': `${startDate}-${endDate}`,
283+
'data_source': dataSource,
284+
'signal': dataSignal,
285+
'geo_type': geographicType,
286+
'geo_values': geographicValue
287+
},
288+
success: function (result) {
289+
// Update the page with the response data.
290+
// This depends on the structure of your response data.
291+
// For example, if the response data is a string:
292+
if (result["epidata"].length > 1) {
293+
result = { epidata: result["epidata"].slice(0, 3), result: result["result"], message: result["message"] }
294+
} else {
295+
result = { epidata: result["epidata"], result: result["result"], message: result["message"] }
296+
}
297+
$('#modeSubmitResult').html(library.json.prettyPrint(result));
298+
}
299+
});
300+
requestSent = true;
301+
};
237302
}
238303
}
239304

src/templates/signals/signal_detail.html

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ <h5>Response Example</h5>
281281
</div>
282282
</section>
283283
{% endif %}
284-
{% include "signals/epivis_export_data_block.html"%}
284+
{% include "signals/data_visualization_export.html"%}
285285
<h5>Related links</h5>
286286
<section class="section">
287287
<div class="row">
@@ -343,30 +343,6 @@ <h5>Related links</h5>
343343
}
344344
};
345345

346-
var requestSent = false;
347-
348-
$(document).ready(function () {
349-
$("#show-response").click(function () {
350-
if (!requestSent) {
351-
$.ajax({
352-
url: '{{ signal.example_url|safe }}',
353-
type: 'GET',
354-
success: function (result) {
355-
// Update the page with the response data.
356-
// This depends on the structure of your response data.
357-
// For example, if the response data is a string:
358-
if (result["epidata"].length > 5) {
359-
result = { epidata: result["epidata"].slice(0, 5), result: result["result"], message: result["message"] }
360-
}
361-
$('#example-response').html(library.json.prettyPrint(result));
362-
}
363-
});
364-
requestSent = true;
365-
};
366-
$("#example-response").toggleClass("hidden");
367-
});
368-
});
369-
370346
function readMore(button) {
371347
var truncatedText = document.querySelector(".overview");
372348
var fullText = document.querySelector(".full-text");

0 commit comments

Comments
 (0)