Skip to content

Commit 337b192

Browse files
authored
Merge pull request #995 from cmu-delphi/sgratzl/weekly
add week signal support
2 parents 33a0281 + 548eee3 commit 337b192

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1517
-738
lines changed

src/blocks/HistoryLineChart.svelte

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import SensorValue from '../components/SensorValue.svelte';
2121
import { combineSignals } from '../data/utils';
2222
import DownloadMenu from '../components/DownloadMenu.svelte';
23-
import { formatDateISO } from '../formats';
23+
import { formatDateISO, formatWeek } from '../formats';
2424
import { annotationManager, isMobileDevice } from '../stores';
2525
import IndicatorAnnotation from '../components/IndicatorAnnotation.svelte';
2626
import IndicatorAnnotations from '../components/IndicatorAnnotations.svelte';
@@ -30,19 +30,19 @@
3030
3131
export let className = '';
3232
/**
33-
* @type {import("../../stores/params").DateParam}
33+
* @type {import("../stores/params").DateParam}
3434
*/
3535
export let date;
3636
/**
37-
* @type {import("../../stores/params").RegionParam}
37+
* @type {import("../stores/params").RegionParam}
3838
*/
3939
export let region;
4040
/**
41-
* @type {import("../../stores/params").SensorParam}
41+
* @type {import("../stores/params").SensorParam}
4242
*/
4343
export let sensor;
4444
/**
45-
* @type {import("../../stores/DataFetcher").DataFetcher}
45+
* @type {import("../stores/DataFetcher").DataFetcher}
4646
*/
4747
export let fetcher;
4848
@@ -77,7 +77,7 @@
7777
export let domain = null;
7878
7979
/**
80-
* @type {import("../../stores/params").Region}
80+
* @type {import("../stores/params").Region}
8181
*/
8282
const neighboringInfo = {
8383
id: 'neighboring',
@@ -106,6 +106,7 @@
106106
timeFrame,
107107
{ height, zero, raw, isMobile, singleRegionOnly, domain, cumulative },
108108
) {
109+
const isWeekly = sensor.value.isWeeklySignal;
109110
const options = {
110111
initialDate: highlightDate || date.value,
111112
height,
@@ -116,6 +117,7 @@
116117
title: joinTitle([(cumulative ? 'Cumulative ' : '') + sensor.name, `in ${region.displayName}`], isMobile),
117118
subTitle: sensor.unit,
118119
highlightRegion: true,
120+
isWeeklySignal: isWeekly,
119121
};
120122
if (cumulative) {
121123
options.paddingLeft = 52; // more space for larger numbers
@@ -144,9 +146,9 @@
144146
}
145147
146148
/**
147-
* @param {import("../../stores/params").SensorParam} sensor
148-
* @param {import("../../stores/params").DateParam} date
149-
* @param {import("../../stores/params").RegionParam} region
149+
* @param {import("../stores/params").SensorParam} sensor
150+
* @param {import("../stores/params").DateParam} date
151+
* @param {import("../stores/params").RegionParam} region
150152
*/
151153
function loadData(sensor, region, timeFrame, singleRegionOnly) {
152154
if (!region.value) {
@@ -177,9 +179,9 @@
177179
}
178180
179181
/**
180-
* @param {import("../../stores/params").SensorParam} sensor
181-
* @param {import("../../stores/params").DateParam} date
182-
* @param {import("../../stores/params").RegionParam} region
182+
* @param {import("../stores/params").SensorParam} sensor
183+
* @param {import("../stores/params").DateParam} date
184+
* @param {import("../stores/params").RegionParam} region
183185
*/
184186
function loadSingleData(sensor, region, timeFrame, { cumulative }) {
185187
if (!region.value) {
@@ -235,8 +237,8 @@
235237
return [region];
236238
}
237239
/**
238-
* @param {import("../../stores/params").SensorParam} sensor
239-
* @param {import("../../stores/params").Region[]} region
240+
* @param {import("../stores/params").SensorParam} sensor
241+
* @param {import("../stores/params").Region[]} region
240242
*/
241243
function generateFileName(sensor, regions, timeFrame, raw, cumulative) {
242244
const regionName = regions.map((region) => `${region.propertyId}-${region.displayName}`).join(',');
@@ -247,7 +249,9 @@
247249
if (cumulative) {
248250
suffix += '_Cumulative';
249251
}
250-
return `${sensor.name}_${regionName}_${formatDateISO(timeFrame.min)}-${formatDateISO(timeFrame.max)}${suffix}`;
252+
return `${sensor.name}_${regionName}_${
253+
sensor.isWeeklySignal ? formatWeek(timeFrame.min_week) : formatDateISO(timeFrame.min)
254+
}-${sensor.isWeeklySignal ? formatWeek(timeFrame.max_week) : formatDateISO(timeFrame.max)}${suffix}`;
251255
}
252256
253257
function injectRanges(spec, timeFrame, annotations) {
@@ -296,7 +300,7 @@
296300
return null;
297301
}
298302
const time = toTimeValue(date);
299-
const row = data.find((d) => d.id === region.id && d.time_value === time);
303+
const row = data.find((d) => d.id === region.id && toTimeValue(d.date_value) === time);
300304
if (!row) {
301305
return null;
302306
}

src/blocks/RegionMapTooltip.svelte

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script>
2-
import { formatDateShortDayOfWeekAbbr } from '../formats';
2+
import { formatDateShortDayOfWeekAbbr, formatWeek } from '../formats';
33
import { levelMegaCounty } from '../stores/constants';
44
import { getStateOfCounty } from '../data/regions';
55
import SensorValue from '../components/SensorValue.svelte';
@@ -61,7 +61,11 @@
6161
</tr>
6262
{/if}
6363
<tr>
64-
<th>{formatDateShortDayOfWeekAbbr(item.date_value)}</th>
64+
<th
65+
>{sensor && sensor.isWeeklySignal
66+
? formatWeek(item.week_value)
67+
: formatDateShortDayOfWeekAbbr(item.date_value)}</th
68+
>
6569
<td>
6670
<SensorValue {sensor} value={item.value} medium />
6771
</td>

src/components/Calendar/Datepicker.svelte

Lines changed: 12 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import { getMonths } from './lib/helpers';
66
import { keyCodes, keyCodesArray } from './lib/keyCodes';
77
import { onMount, createEventDispatcher } from 'svelte';
8+
import WeekLegend from './WeekLegend.svelte';
89
910
const dispatch = createEventDispatcher();
1011
const today = new Date();
@@ -20,32 +21,11 @@
2021
export let trigger = null;
2122
export let selectableCallback = null;
2223
export let weekStart = 0;
23-
export let daysOfWeek = [
24-
['Sunday', 'Sun'],
25-
['Monday', 'Mon'],
26-
['Tuesday', 'Tue'],
27-
['Wednesday', 'Wed'],
28-
['Thursday', 'Thu'],
29-
['Friday', 'Fri'],
30-
['Saturday', 'Sat'],
31-
];
32-
export let monthsOfYear = [
33-
['January', 'Jan'],
34-
['February', 'Feb'],
35-
['March', 'Mar'],
36-
['April', 'Apr'],
37-
['May', 'May'],
38-
['June', 'Jun'],
39-
['July', 'Jul'],
40-
['August', 'Aug'],
41-
['September', 'Sep'],
42-
['October', 'Oct'],
43-
['November', 'Nov'],
44-
['December', 'Dec'],
45-
];
4624
4725
export let style = '';
4826
27+
export let pickWeek = false;
28+
4929
// theming variables:
5030
export let buttonBackgroundColor = '#fff';
5131
export let buttonBorderColor = '#eee';
@@ -56,15 +36,6 @@
5636
export let dayHighlightedBackgroundColor = '#efefef';
5737
export let dayHighlightedTextColor = '#4a4a4a';
5838
59-
let sortedDaysOfWeek =
60-
weekStart === 0
61-
? daysOfWeek
62-
: (() => {
63-
let dow = daysOfWeek.slice();
64-
dow.push(dow.shift());
65-
return dow;
66-
})();
67-
6839
let highlighted = today;
6940
let shouldShakeDate = false;
7041
let shakeHighlightTimeout;
@@ -205,13 +176,17 @@
205176
evt.preventDefault();
206177
switch (evt.keyCode) {
207178
case keyCodes.left:
208-
incrementDayHighlighted(-1);
179+
if (!pickWeek) {
180+
incrementDayHighlighted(-1);
181+
}
209182
break;
210183
case keyCodes.up:
211184
incrementDayHighlighted(-7);
212185
break;
213186
case keyCodes.right:
214-
incrementDayHighlighted(1);
187+
if (!pickWeek) {
188+
incrementDayHighlighted(1);
189+
}
215190
break;
216191
case keyCodes.down:
217192
incrementDayHighlighted(7);
@@ -268,19 +243,17 @@
268243
{canDecrementMonth}
269244
{start}
270245
{end}
271-
{monthsOfYear}
272246
on:monthSelected={(e) => changeMonth(e.detail)}
273247
on:incrementMonth={(e) => incrementMonth(e.detail)}
274248
/>
275-
<div class="legend">
276-
{#each sortedDaysOfWeek as day}<span>{day[1]}</span>{/each}
277-
</div>
249+
<WeekLegend {weekStart} />
278250
<Month
279251
{visibleMonth}
280252
{selected}
281253
{highlighted}
282254
{shouldShakeDate}
283255
id={visibleMonthId}
256+
{pickWeek}
284257
on:dateSelected={(e) => registerSelection(e.detail)}
285258
/>
286259
</div>
@@ -328,20 +301,8 @@
328301
329302
@media (min-width: 480px) {
330303
.calendar {
331-
width: 280px;
304+
width: 300px;
332305
max-width: 100%;
333306
}
334307
}
335-
336-
.legend {
337-
color: #4a4a4a;
338-
padding: 10px 0;
339-
margin-bottom: 5px;
340-
}
341-
342-
.legend span {
343-
width: 14.285714%;
344-
display: inline-block;
345-
text-align: center;
346-
}
347308
</style>

src/components/Calendar/Month.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22
import Week from './Week.svelte';
33
44
export let id;
5+
/**
6+
* @type {import('./lib/helpers').CalendarMonth}
7+
*/
58
export let visibleMonth;
69
export let selected;
710
export let highlighted;
811
export let shouldShakeDate;
12+
export let pickWeek = false;
913
1014
let lastId = id;
1115
let direction;
@@ -18,7 +22,7 @@
1822

1923
<div class="month-container">
2024
{#each visibleMonth.weeks as week (week.id)}
21-
<Week days={week.days} {selected} {highlighted} {shouldShakeDate} {direction} on:dateSelected />
25+
<Week {week} {selected} {highlighted} {shouldShakeDate} {direction} on:dateSelected {pickWeek} />
2226
{/each}
2327
</div>
2428

src/components/Calendar/NavBar.svelte

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,21 @@
99
export let end;
1010
export let canIncrementMonth;
1111
export let canDecrementMonth;
12-
export let monthsOfYear;
12+
13+
export let monthsOfYear = [
14+
['January', 'Jan'],
15+
['February', 'Feb'],
16+
['March', 'Mar'],
17+
['April', 'Apr'],
18+
['May', 'May'],
19+
['June', 'Jun'],
20+
['July', 'Jul'],
21+
['August', 'Aug'],
22+
['September', 'Sep'],
23+
['October', 'Oct'],
24+
['November', 'Nov'],
25+
['December', 'Dec'],
26+
];
1327
1428
let monthSelectorOpen = false;
1529
let availableMonths;

0 commit comments

Comments
 (0)