Skip to content

Commit d9871f4

Browse files
authored
Merge pull request #937 from cmu-delphi/sgratzl/meta2.0
use new metadata and show all signals in dashboard
2 parents 4410ba8 + 5bf336e commit d9871f4

File tree

94 files changed

+2464
-2403
lines changed

Some content is hidden

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

94 files changed

+2464
-2403
lines changed

.github/workflows/create_release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
- name: Reset main branch
1919
run: |
2020
git fetch origin dev:dev
21-
git reset --hard dev
21+
git reset --hard origin/dev
2222
- name: Change version number
2323
id: version
2424
run: |

netlify.toml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@
33

44
[context.branch-deploy.environment]
55
COVIDCAST_ENDPOINT_URL = "https://api.covidcast.cmu.edu/epidata"
6-
COVIDCAST_ANNOTATION_DRAFTS = "true"
76

87
[context.deploy-preview.environment]
98
COVIDCAST_ENDPOINT_URL = "https://api.covidcast.cmu.edu/epidata"
10-
COVIDCAST_ANNOTATION_DRAFTS = "true"
119

1210
[context.staging.environment]
13-
COVIDCAST_ENDPOINT_URL = "https://api-staging.delphi.cmu.edu/epidata"
14-
COVIDCAST_SIGNAL_DOC = "https://docs.google.com/document/d/1llv6xh8jMlmVv7WpyDSv4VgUpFAZQ6QjFUeRxxOinmk,https://docs.google.com/document/d/17GQFgJDHF_ckkn-BE72QaHtyL2Dh09S8-4xk0r6G47w"
15-
COVIDCAST_ANNOTATION_DRAFTS = "true"
11+
COVIDCAST_ENDPOINT_URL = "https://staging.delphi.cmu.edu/epidata"
12+
# COVIDCAST_SIGNAL_DOC = "https://docs.google.com/document/d/1llv6xh8jMlmVv7WpyDSv4VgUpFAZQ6QjFUeRxxOinmk,https://docs.google.com/document/d/17GQFgJDHF_ckkn-BE72QaHtyL2Dh09S8-4xk0r6G47w"

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"main": "public/bundle.js",
1616
"files": [
1717
"public/**.js",
18+
"public/**.map",
1819
"public/**.txt",
1920
"public/**.css",
2021
"!public/wrapper.*"

src/App.svelte

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
<script>
22
import { onMount } from 'svelte';
3-
import { currentMode, appReady, sensorList, loadAnnotations } from './stores';
3+
import { currentMode, appReady, loadMetaData, loadAnnotations } from './stores';
44
import './stores/urlHandler';
55
import './stores/ga';
66
import './stores/websiteInjector';
7-
import { loadMetaData } from './data/meta';
87
import Disclaimer from './components/Disclaimer.svelte';
98
9+
let markReady = () => false;
10+
const appReadyPromise = new Promise((resolve) => {
11+
markReady = resolve;
12+
});
13+
1014
onMount(() => {
11-
Promise.all([loadMetaData(sensorList), loadAnnotations()]).then(() => {
15+
Promise.all([loadMetaData(), loadAnnotations()]).then(() => {
1216
appReady.set(true);
17+
markReady();
1318
document.body.dataset.ready = 'ready';
1419
});
1520
});
1621
17-
$: currentComponent = $currentMode.component();
22+
async function loadComponent(mode) {
23+
if (mode.waitForReady) {
24+
await appReadyPromise;
25+
}
26+
return mode.component();
27+
}
28+
29+
$: currentComponent = loadComponent($currentMode);
1830
</script>
1931

2032
{#await currentComponent}

src/blocks/HistoryLineChart.svelte

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
MULTI_COLORS,
1414
genDateHighlight,
1515
genAnnotationLayer,
16+
generateCumulativeBarSpec,
1617
} from '../specs/lineSpec';
1718
import { toTimeValue } from '../data/utils';
1819
import Toggle from '../components/Toggle.svelte';
@@ -41,7 +42,7 @@
4142
*/
4243
export let sensor;
4344
/**
44-
* @type {import("../../stores/params").DataFetcher}
45+
* @type {import("../../stores/DataFetcher").DataFetcher}
4546
*/
4647
export let fetcher;
4748
@@ -86,28 +87,40 @@
8687
};
8788
8889
$: highlightDate = date.value;
89-
$: timeFrame = showFull && expandableWindow ? date.sensorTimeFrame : date.windowTimeFrame;
90+
$: timeFrame = showFull && expandableWindow ? sensor.timeFrame : date.windowTimeFrame;
9091
9192
/**
9293
* @param {import('../../stores/params').SensorParam} sensor
9394
* @param {import('../../stores/params').RegionParam} region
9495
* @param {import('../../stores/params').DateParam} date
9596
* @param {import('../../stores/params').TimeFrame} timeFrame
96-
* @param {{height: number, zero: boolean, singleRaw: boolean, isMobile: boolean, singleRegionOnly: boolean}} options
97+
* @param {{height: number, zero: boolean, raw: boolean, isMobile: boolean, singleRegionOnly: boolean, cumulative: boolean}} options
9798
*/
98-
function genSpec(sensor, region, date, timeFrame, { height, zero, singleRaw, isMobile, singleRegionOnly, domain }) {
99+
function genSpec(
100+
sensor,
101+
region,
102+
date,
103+
timeFrame,
104+
{ height, zero, raw, isMobile, singleRegionOnly, domain, cumulative },
105+
) {
99106
const options = {
100107
initialDate: highlightDate || date.value,
101108
height,
102109
color,
103110
domain: domain || timeFrame.domain,
104111
zero,
105112
xTitle: sensor.xAxis,
106-
title: joinTitle([sensor.name, `in ${region.displayName}`], isMobile),
113+
title: joinTitle([(cumulative ? 'Cumulative ' : '') + sensor.name, `in ${region.displayName}`], isMobile),
107114
subTitle: sensor.unit,
108115
highlightRegion: true,
109116
};
110-
if (singleRaw) {
117+
if (cumulative) {
118+
options.paddingLeft = 52; // more space for larger numbers
119+
}
120+
if (raw) {
121+
if (cumulative) {
122+
return generateCumulativeBarSpec(options);
123+
}
111124
return generateLineAndBarSpec(options);
112125
}
113126
if (singleRegionOnly) {
@@ -167,16 +180,33 @@
167180
* @param {import("../../stores/params").DateParam} date
168181
* @param {import("../../stores/params").RegionParam} region
169182
*/
170-
function loadSingleData(sensor, region, timeFrame) {
183+
function loadSingleData(sensor, region, timeFrame, { cumulative }) {
171184
if (!region.value) {
172185
return null;
173186
}
174-
const selfData = fetcher.fetch1Sensor1RegionNDates(sensor, region, timeFrame);
187+
188+
const selfData = fetcher.fetch1Sensor1RegionNDates(sensor.value, region, timeFrame);
175189
const rawData = fetcher.fetch1Sensor1RegionNDates(sensor.rawValue, region, timeFrame);
176190
177-
return Promise.all([selfData, rawData]).then((data) => {
178-
return combineSignals(data, data[0], ['smoothed', 'raw']);
179-
});
191+
if (cumulative) {
192+
// raw and cumulative
193+
const cumulativeData = fetcher.fetch1Sensor1RegionNDates(sensor.rawCumulativeValue, region, timeFrame);
194+
return Promise.all([selfData, rawData, cumulativeData]).then((data) => {
195+
return combineSignals(
196+
data,
197+
data[0].map((d) => ({ ...d })),
198+
['smoothed', 'raw', 'cumulative'],
199+
);
200+
});
201+
} else {
202+
return Promise.all([selfData, rawData]).then((data) => {
203+
return combineSignals(
204+
data,
205+
data[0].map((d) => ({ ...d })),
206+
['smoothed', 'raw'],
207+
);
208+
});
209+
}
180210
}
181211
182212
function onSignal(event) {
@@ -207,12 +237,15 @@
207237
* @param {import("../../stores/params").SensorParam} sensor
208238
* @param {import("../../stores/params").Region[]} region
209239
*/
210-
function generateFileName(sensor, regions, timeFrame, raw) {
240+
function generateFileName(sensor, regions, timeFrame, raw, cumulative) {
211241
const regionName = regions.map((region) => `${region.propertyId}-${region.displayName}`).join(',');
212242
let suffix = '';
213243
if (raw) {
214244
suffix = '_RawVsSmoothed';
215245
}
246+
if (cumulative) {
247+
suffix += '_Cumulative';
248+
}
216249
return `${sensor.name}_${regionName}_${formatDateISO(timeFrame.min)}-${formatDateISO(timeFrame.max)}${suffix}`;
217250
}
218251
@@ -231,24 +264,29 @@
231264
232265
let zoom = false;
233266
let singleRaw = false;
267+
let singleCumulative = false;
234268
269+
$: raw = singleRaw && sensor.rawValue != null;
270+
$: cumulative = raw && singleCumulative && sensor.rawCumulativeValue != null;
235271
$: regions = raw ? [region.value] : resolveRegions(region.value, singleRegionOnly);
236272
$: annotations = $annotationManager.getWindowAnnotations(sensor.value, regions, timeFrame.min, timeFrame.max);
237-
$: raw = singleRaw && sensor.rawValue != null;
238273
$: spec = injectRanges(
239274
genSpec(sensor, region, date, timeFrame, {
240275
height,
241276
zero: !zoom,
242-
singleRaw: raw,
277+
raw,
243278
isMobile: $isMobileDevice,
244279
singleRegionOnly,
245280
domain,
281+
cumulative,
246282
}),
247283
timeFrame,
248284
annotations,
249285
);
250-
$: data = raw ? loadSingleData(sensor, region, timeFrame) : loadData(sensor, region, timeFrame, singleRegionOnly);
251-
$: fileName = generateFileName(sensor, regions, timeFrame, raw);
286+
$: data = raw
287+
? loadSingleData(sensor, region, timeFrame, { cumulative })
288+
: loadData(sensor, region, timeFrame, singleRegionOnly);
289+
$: fileName = generateFileName(sensor, regions, timeFrame, raw, cumulative);
252290
253291
function findValue(region, data, date, prop = 'value') {
254292
if (!date) {
@@ -292,15 +330,18 @@
292330
<Toggle bind:checked={zoom}>Rescale Y-axis</Toggle>
293331
{#if sensor.rawValue != null}
294332
<Toggle bind:checked={singleRaw}>Raw Data</Toggle>
333+
{#if raw && sensor.rawCumulativeValue != null}
334+
<Toggle bind:checked={singleCumulative}>Cumulative Data</Toggle>
335+
{/if}
295336
{/if}
296337
{#if expandableWindow}
297338
<Toggle bind:checked={showFull}>Show All Dates</Toggle>
298339
{/if}
299340
<div class="spacer" />
300-
<DownloadMenu {fileName} {vegaRef} {data} {sensor} {raw} />
341+
<DownloadMenu {fileName} {vegaRef} {data} {sensor} {raw} {cumulative} />
301342
</div>
302343

303-
<div class="{!(singleRaw && sensor.rawValue != null) && regions.length > 1 ? 'mobile-two-col' : ''} legend">
344+
<div class="{!raw && regions.length > 1 ? 'mobile-two-col' : ''} legend">
304345
{#each regions as r, i}
305346
<div
306347
class="legend-elem"
@@ -324,9 +365,14 @@
324365
{#await data then d}
325366
<span class="legend-value">
326367
<SensorValue {sensor} value={findValue(r, d, highlightDate)} medium />
327-
{#if singleRaw && sensor.rawValue != null}
368+
{#if raw}
328369
(raw:
329-
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'raw')} medium />)
370+
{#if cumulative}
371+
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'raw')} medium />, cumulative:
372+
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'cumulative')} medium />)
373+
{:else}
374+
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'raw')} medium />)
375+
{/if}
330376
{/if}
331377
</span>
332378
{/await}

src/blocks/IndicatorOverview.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
*/
2424
export let region;
2525
/**
26-
* @type {import("../../stores/params").DataFetcher}
26+
* @type {import("../../stores/DataFetcher").DataFetcher}
2727
*/
2828
export let fetcher;
2929

src/blocks/IndicatorStatsLine.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
export let region;
1717
/**
18-
* @type {import("../../stores/params").DataFetcher}
18+
* @type {import("../../stores/DataFetcher").DataFetcher}
1919
*/
2020
export let fetcher;
2121

src/blocks/IndicatorWarning.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<div data-uk-alert class="uk-alert-warning">
2121
The indicator "{sensor.name}" does not support the geographic level: {getLevelInfo(region.level).labelPlural}.
2222
</div>
23-
{:else if date.sensorTimeFrame.max < date.value}
23+
{:else if sensor.timeFrame.max < date.value}
2424
<div data-uk-alert class="uk-alert-warning">
2525
The indicator "{sensor.name}" is not available for {formatDateYearDayOfWeekAbbr(date.value)}, yet.
2626
</div>

src/blocks/MaxDateHint.svelte

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
11
<script>
22
import UIKitHint from '../components/UIKitHint.svelte';
33
import { formatDateYearDayOfWeekAbbr } from '../formats';
4-
import { stats } from '../stores';
5-
import { determineStatsInfo } from '../stores/stats';
4+
import { metaDataManager } from '../stores';
65
/**
76
* @type {import('../stores/params').Sensor}
87
*/
98
export let sensor;
109
11-
/**
12-
* @type {import('../stores/params').RegionLevel}
13-
*/
14-
export let level = 'nation';
15-
1610
export let suffix = '';
1711
18-
$: info = determineStatsInfo($stats, sensor, level);
12+
$: info = $metaDataManager.getMetaData(sensor);
1913
</script>
2014

2115
{#if info}

src/blocks/RegionCountyMap.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { formatDateISO } from '../formats';
44
import { getStateOfCounty } from '../data/regions';
55
import { generateStateMapWithCountyDataSpec } from '../specs/mapSpec';
6-
import { isMobileDevice, stats } from '../stores';
6+
import { isMobileDevice } from '../stores';
77
import DownloadMenu from '../components/DownloadMenu.svelte';
88
import RegionMapTooltip from './RegionMapTooltip.svelte';
99
@@ -20,12 +20,12 @@
2020
*/
2121
export let sensor;
2222
/**
23-
* @type {import("../../stores/params").DataFetcher}
23+
* @type {import("../../stores/DataFetcher").DataFetcher}
2424
*/
2525
export let fetcher;
2626
2727
$: spec = generateStateMapWithCountyDataSpec({
28-
domain: sensor.domain($stats, 'county'),
28+
domain: sensor.domain('county'),
2929
scheme: sensor.value.vegaColorScale,
3030
});
3131
$: data = fetcher.fetch1SensorNRegions1Date(sensor, 'county', date);

0 commit comments

Comments
 (0)