Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
79a7e1b
refactor: new meta data handling strategy
sgratzl May 10, 2021
7021793
fix: export data meta data use
sgratzl May 12, 2021
eb779f7
feat: cumulative support for history line charts
sgratzl May 12, 2021
c9811d4
feat: cumulated also for dashboard
sgratzl May 12, 2021
40d967d
refactore: rename cumulated to cumulative
sgratzl May 12, 2021
e6c9036
feat: add new meta information
sgratzl May 13, 2021
5f8387c
refactor: split constants file into multiple
sgratzl May 13, 2021
67fffa0
refactor: move model definition to data
sgratzl May 13, 2021
9b5c67e
refactor: rextract DataFetcher
sgratzl May 13, 2021
3345ed6
fix: remove old attribute
sgratzl May 13, 2021
dd88c0a
refactor: unify meta types
sgratzl May 13, 2021
b4d8bf9
feat: add related sensors to meta data manager
sgratzl May 13, 2021
923b536
feat: derive sensors from meta data
sgratzl May 13, 2021
ed05aaa
Merge branch 'sgratzl/cumulated_incidence' into sgratzl/meta2.0
sgratzl May 13, 2021
7a799cb
feat: show dashboard after meta data is loaded
sgratzl May 13, 2021
7486b94
fix: wrong endpoint for trend series
sgratzl May 13, 2021
82bc89b
feat: use meta data sensors in dashboard
sgratzl May 13, 2021
3e211c2
feat: guess raw signal for meta signal
sgratzl May 13, 2021
52c6123
feat: add geo type badges and colors
sgratzl May 13, 2021
9328909
feat: improved sensor search
sgratzl May 13, 2021
c50ee35
style: tune sensor badges
sgratzl May 13, 2021
fdefa00
refactor: side panel to custom implementation
sgratzl May 13, 2021
cba2183
feat: widget picker also with tags
sgratzl May 13, 2021
b051782
style: small style tuning of overlay
sgratzl May 13, 2021
767498c
style: show more results by default
sgratzl May 13, 2021
2137dd0
style: select all on search click
sgratzl May 13, 2021
fc6e378
feat: don't update params with magic start date
sgratzl May 13, 2021
d1c115b
Merge branch 'sgratzl/search_improvments' into sgratzl/meta2.0
sgratzl May 13, 2021
34810bc
fix: apply changes
sgratzl May 13, 2021
1f81653
refactor: move more metadata to TypeScript
sgratzl May 14, 2021
fa71bca
feat: track dashboard interactions
sgratzl May 14, 2021
f21de62
Merge pull request #940 from cmu-delphi/sgratzl/track_dashboard
sgratzl May 14, 2021
ff50daa
Merge branch 'sgratzl/asyncvega' into sgratzl/meta2.0
sgratzl May 20, 2021
e9903f9
fix: formatting
sgratzl May 20, 2021
7d60e04
fix: duplicate key error in search
sgratzl May 21, 2021
df354fd
fix: format specifier for scales
sgratzl May 21, 2021
b307e3c
fix: use new format where possible
sgratzl May 21, 2021
c66bdff
fix: fetch post data
sgratzl May 21, 2021
4b41cd1
Merge remote-tracking branch 'origin/dev' into sgratzl/meta2.0
sgratzl May 24, 2021
55e42a2
build: small script improvements
sgratzl Jun 8, 2021
02a27b6
Merge remote-tracking branch 'origin/dev' into sgratzl/meta2.0
sgratzl Jun 8, 2021
4e27aa5
feat: show params by default
sgratzl Jun 8, 2021
a5f7a23
Merge remote-tracking branch 'origin/dev' into sgratzl/meta2.0
sgratzl Jun 9, 2021
8f90711
fix: not unique id not resolved
sgratzl Jun 9, 2021
a27873b
feat: add data anomalies widget
sgratzl Jun 9, 2021
9fc3279
Merge remote-tracking branch 'origin/dev' into sgratzl/meta2.0
sgratzl Jun 11, 2021
0a3bdc3
feat: group sensors by source
sgratzl Jun 11, 2021
3017f78
build: update dependencies
sgratzl Jun 14, 2021
a5abb84
fix: fix build dependency changes
sgratzl Jun 14, 2021
bc9880f
feat: export data use new meta data
sgratzl Jun 14, 2021
534b675
Merge branch 'sgratzl/deps' into sgratzl/meta2.0
sgratzl Jun 14, 2021
c2203c3
fix: disable lab mode
sgratzl Jun 14, 2021
d4ab2fb
Merge remote-tracking branch 'origin/dev' into sgratzl/meta2.0
sgratzl Jun 15, 2021
fb8da37
feat: switch to /anomalies endpoint
sgratzl Jun 15, 2021
4e6d6dd
Merge pull request #954 from cmu-delphi/sgratzl/anomalies_endpoint
sgratzl Jun 15, 2021
c6d6074
fix: remove old code
sgratzl Jun 15, 2021
988f341
fix(dashboard): wrong map highlight
sgratzl Jun 15, 2021
5bf336e
fix(dahboard): rename to Dashboard Builder
sgratzl Jun 15, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/create_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Reset main branch
run: |
git fetch origin dev:dev
git reset --hard dev
git reset --hard origin/dev
- name: Change version number
id: version
run: |
Expand Down
7 changes: 2 additions & 5 deletions netlify.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,10 @@

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

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

[context.staging.environment]
COVIDCAST_ENDPOINT_URL = "https://api-staging.delphi.cmu.edu/epidata"
COVIDCAST_SIGNAL_DOC = "https://docs.google.com/document/d/1llv6xh8jMlmVv7WpyDSv4VgUpFAZQ6QjFUeRxxOinmk,https://docs.google.com/document/d/17GQFgJDHF_ckkn-BE72QaHtyL2Dh09S8-4xk0r6G47w"
COVIDCAST_ANNOTATION_DRAFTS = "true"
COVIDCAST_ENDPOINT_URL = "https://staging.delphi.cmu.edu/epidata"
# COVIDCAST_SIGNAL_DOC = "https://docs.google.com/document/d/1llv6xh8jMlmVv7WpyDSv4VgUpFAZQ6QjFUeRxxOinmk,https://docs.google.com/document/d/17GQFgJDHF_ckkn-BE72QaHtyL2Dh09S8-4xk0r6G47w"
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"main": "public/bundle.js",
"files": [
"public/**.js",
"public/**.map",
"public/**.txt",
"public/**.css",
"!public/wrapper.*"
Expand Down
20 changes: 16 additions & 4 deletions src/App.svelte
Original file line number Diff line number Diff line change
@@ -1,20 +1,32 @@
<script>
import { onMount } from 'svelte';
import { currentMode, appReady, sensorList, loadAnnotations } from './stores';
import { currentMode, appReady, loadMetaData, loadAnnotations } from './stores';
import './stores/urlHandler';
import './stores/ga';
import './stores/websiteInjector';
import { loadMetaData } from './data/meta';
import Disclaimer from './components/Disclaimer.svelte';

let markReady = () => false;
const appReadyPromise = new Promise((resolve) => {
markReady = resolve;
});

onMount(() => {
Promise.all([loadMetaData(sensorList), loadAnnotations()]).then(() => {
Promise.all([loadMetaData(), loadAnnotations()]).then(() => {
appReady.set(true);
markReady();
document.body.dataset.ready = 'ready';
});
});

$: currentComponent = $currentMode.component();
async function loadComponent(mode) {
if (mode.waitForReady) {
await appReadyPromise;
}
return mode.component();
}

$: currentComponent = loadComponent($currentMode);
</script>

{#await currentComponent}
Expand Down
86 changes: 66 additions & 20 deletions src/blocks/HistoryLineChart.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
MULTI_COLORS,
genDateHighlight,
genAnnotationLayer,
generateCumulativeBarSpec,
} from '../specs/lineSpec';
import { toTimeValue } from '../data/utils';
import Toggle from '../components/Toggle.svelte';
Expand Down Expand Up @@ -41,7 +42,7 @@
*/
export let sensor;
/**
* @type {import("../../stores/params").DataFetcher}
* @type {import("../../stores/DataFetcher").DataFetcher}
*/
export let fetcher;

Expand Down Expand Up @@ -86,28 +87,40 @@
};

$: highlightDate = date.value;
$: timeFrame = showFull && expandableWindow ? date.sensorTimeFrame : date.windowTimeFrame;
$: timeFrame = showFull && expandableWindow ? sensor.timeFrame : date.windowTimeFrame;

/**
* @param {import('../../stores/params').SensorParam} sensor
* @param {import('../../stores/params').RegionParam} region
* @param {import('../../stores/params').DateParam} date
* @param {import('../../stores/params').TimeFrame} timeFrame
* @param {{height: number, zero: boolean, singleRaw: boolean, isMobile: boolean, singleRegionOnly: boolean}} options
* @param {{height: number, zero: boolean, raw: boolean, isMobile: boolean, singleRegionOnly: boolean, cumulative: boolean}} options
*/
function genSpec(sensor, region, date, timeFrame, { height, zero, singleRaw, isMobile, singleRegionOnly, domain }) {
function genSpec(
sensor,
region,
date,
timeFrame,
{ height, zero, raw, isMobile, singleRegionOnly, domain, cumulative },
) {
const options = {
initialDate: highlightDate || date.value,
height,
color,
domain: domain || timeFrame.domain,
zero,
xTitle: sensor.xAxis,
title: joinTitle([sensor.name, `in ${region.displayName}`], isMobile),
title: joinTitle([(cumulative ? 'Cumulative ' : '') + sensor.name, `in ${region.displayName}`], isMobile),
subTitle: sensor.unit,
highlightRegion: true,
};
if (singleRaw) {
if (cumulative) {
options.paddingLeft = 52; // more space for larger numbers
}
if (raw) {
if (cumulative) {
return generateCumulativeBarSpec(options);
}
return generateLineAndBarSpec(options);
}
if (singleRegionOnly) {
Expand Down Expand Up @@ -167,16 +180,33 @@
* @param {import("../../stores/params").DateParam} date
* @param {import("../../stores/params").RegionParam} region
*/
function loadSingleData(sensor, region, timeFrame) {
function loadSingleData(sensor, region, timeFrame, { cumulative }) {
if (!region.value) {
return null;
}
const selfData = fetcher.fetch1Sensor1RegionNDates(sensor, region, timeFrame);

const selfData = fetcher.fetch1Sensor1RegionNDates(sensor.value, region, timeFrame);
const rawData = fetcher.fetch1Sensor1RegionNDates(sensor.rawValue, region, timeFrame);

return Promise.all([selfData, rawData]).then((data) => {
return combineSignals(data, data[0], ['smoothed', 'raw']);
});
if (cumulative) {
// raw and cumulative
const cumulativeData = fetcher.fetch1Sensor1RegionNDates(sensor.rawCumulativeValue, region, timeFrame);
return Promise.all([selfData, rawData, cumulativeData]).then((data) => {
return combineSignals(
data,
data[0].map((d) => ({ ...d })),
['smoothed', 'raw', 'cumulative'],
);
});
} else {
return Promise.all([selfData, rawData]).then((data) => {
return combineSignals(
data,
data[0].map((d) => ({ ...d })),
['smoothed', 'raw'],
);
});
}
}

function onSignal(event) {
Expand Down Expand Up @@ -207,12 +237,15 @@
* @param {import("../../stores/params").SensorParam} sensor
* @param {import("../../stores/params").Region[]} region
*/
function generateFileName(sensor, regions, timeFrame, raw) {
function generateFileName(sensor, regions, timeFrame, raw, cumulative) {
const regionName = regions.map((region) => `${region.propertyId}-${region.displayName}`).join(',');
let suffix = '';
if (raw) {
suffix = '_RawVsSmoothed';
}
if (cumulative) {
suffix += '_Cumulative';
}
return `${sensor.name}_${regionName}_${formatDateISO(timeFrame.min)}-${formatDateISO(timeFrame.max)}${suffix}`;
}

Expand All @@ -231,24 +264,29 @@

let zoom = false;
let singleRaw = false;
let singleCumulative = false;

$: raw = singleRaw && sensor.rawValue != null;
$: cumulative = raw && singleCumulative && sensor.rawCumulativeValue != null;
$: regions = raw ? [region.value] : resolveRegions(region.value, singleRegionOnly);
$: annotations = $annotationManager.getWindowAnnotations(sensor.value, regions, timeFrame.min, timeFrame.max);
$: raw = singleRaw && sensor.rawValue != null;
$: spec = injectRanges(
genSpec(sensor, region, date, timeFrame, {
height,
zero: !zoom,
singleRaw: raw,
raw,
isMobile: $isMobileDevice,
singleRegionOnly,
domain,
cumulative,
}),
timeFrame,
annotations,
);
$: data = raw ? loadSingleData(sensor, region, timeFrame) : loadData(sensor, region, timeFrame, singleRegionOnly);
$: fileName = generateFileName(sensor, regions, timeFrame, raw);
$: data = raw
? loadSingleData(sensor, region, timeFrame, { cumulative })
: loadData(sensor, region, timeFrame, singleRegionOnly);
$: fileName = generateFileName(sensor, regions, timeFrame, raw, cumulative);

function findValue(region, data, date, prop = 'value') {
if (!date) {
Expand Down Expand Up @@ -292,15 +330,18 @@
<Toggle bind:checked={zoom}>Rescale Y-axis</Toggle>
{#if sensor.rawValue != null}
<Toggle bind:checked={singleRaw}>Raw Data</Toggle>
{#if raw && sensor.rawCumulativeValue != null}
<Toggle bind:checked={singleCumulative}>Cumulative Data</Toggle>
{/if}
{/if}
{#if expandableWindow}
<Toggle bind:checked={showFull}>Show All Dates</Toggle>
{/if}
<div class="spacer" />
<DownloadMenu {fileName} {vegaRef} {data} {sensor} {raw} />
<DownloadMenu {fileName} {vegaRef} {data} {sensor} {raw} {cumulative} />
</div>

<div class="{!(singleRaw && sensor.rawValue != null) && regions.length > 1 ? 'mobile-two-col' : ''} legend">
<div class="{!raw && regions.length > 1 ? 'mobile-two-col' : ''} legend">
{#each regions as r, i}
<div
class="legend-elem"
Expand All @@ -324,9 +365,14 @@
{#await data then d}
<span class="legend-value">
<SensorValue {sensor} value={findValue(r, d, highlightDate)} medium />
{#if singleRaw && sensor.rawValue != null}
{#if raw}
(raw:
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'raw')} medium />)
{#if cumulative}
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'raw')} medium />, cumulative:
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'cumulative')} medium />)
{:else}
<SensorValue {sensor} value={findValue(r, d, highlightDate, 'raw')} medium />)
{/if}
{/if}
</span>
{/await}
Expand Down
2 changes: 1 addition & 1 deletion src/blocks/IndicatorOverview.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
*/
export let region;
/**
* @type {import("../../stores/params").DataFetcher}
* @type {import("../../stores/DataFetcher").DataFetcher}
*/
export let fetcher;

Expand Down
2 changes: 1 addition & 1 deletion src/blocks/IndicatorStatsLine.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
export let region;
/**
* @type {import("../../stores/params").DataFetcher}
* @type {import("../../stores/DataFetcher").DataFetcher}
*/
export let fetcher;

Expand Down
2 changes: 1 addition & 1 deletion src/blocks/IndicatorWarning.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<div data-uk-alert class="uk-alert-warning">
The indicator "{sensor.name}" does not support the geographic level: {getLevelInfo(region.level).labelPlural}.
</div>
{:else if date.sensorTimeFrame.max < date.value}
{:else if sensor.timeFrame.max < date.value}
<div data-uk-alert class="uk-alert-warning">
The indicator "{sensor.name}" is not available for {formatDateYearDayOfWeekAbbr(date.value)}, yet.
</div>
Expand Down
10 changes: 2 additions & 8 deletions src/blocks/MaxDateHint.svelte
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
<script>
import UIKitHint from '../components/UIKitHint.svelte';
import { formatDateYearDayOfWeekAbbr } from '../formats';
import { stats } from '../stores';
import { determineStatsInfo } from '../stores/stats';
import { metaDataManager } from '../stores';
/**
* @type {import('../stores/params').Sensor}
*/
export let sensor;

/**
* @type {import('../stores/params').RegionLevel}
*/
export let level = 'nation';

export let suffix = '';

$: info = determineStatsInfo($stats, sensor, level);
$: info = $metaDataManager.getMetaData(sensor);
</script>

{#if info}
Expand Down
6 changes: 3 additions & 3 deletions src/blocks/RegionCountyMap.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { formatDateISO } from '../formats';
import { getStateOfCounty } from '../data/regions';
import { generateStateMapWithCountyDataSpec } from '../specs/mapSpec';
import { isMobileDevice, stats } from '../stores';
import { isMobileDevice } from '../stores';
import DownloadMenu from '../components/DownloadMenu.svelte';
import RegionMapTooltip from './RegionMapTooltip.svelte';

Expand All @@ -20,12 +20,12 @@
*/
export let sensor;
/**
* @type {import("../../stores/params").DataFetcher}
* @type {import("../../stores/DataFetcher").DataFetcher}
*/
export let fetcher;

$: spec = generateStateMapWithCountyDataSpec({
domain: sensor.domain($stats, 'county'),
domain: sensor.domain('county'),
scheme: sensor.value.vegaColorScale,
});
$: data = fetcher.fetch1SensorNRegions1Date(sensor, 'county', date);
Expand Down
6 changes: 3 additions & 3 deletions src/blocks/RegionHexMap.svelte
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script>
import { isMobileDevice, stats } from '../stores';
import { isMobileDevice } from '../stores';
import { state2TileCell } from '../specs/matrixSpec';
import { generateSparkLine } from '../specs/lineSpec';
import HexGrid from '../components/HexGrid/HexGrid.svelte';
Expand Down Expand Up @@ -29,7 +29,7 @@
*/
export let sensor;
/**
* @type {import("../../stores/params").DataFetcher}
* @type {import("../../stores/DataFetcher").DataFetcher}
*/
export let fetcher;

Expand Down Expand Up @@ -83,7 +83,7 @@
interactive: false,
domain: date.sparkLineTimeFrame.domain,
});
$: colorScale = sensor.createColorScale($stats, region.level);
$: colorScale = sensor.createColorScale(region.level);
$: dumpData = Promise.all(tileData.map((d) => d.dump)).then((rows) => rows.flat());

const maxColumn = state2TileCell.reduce((acc, v) => Math.max(acc, v.x), 0) + 1;
Expand Down
10 changes: 5 additions & 5 deletions src/blocks/RegionMap.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { formatDateISO } from '../formats';
import { getCountiesOfState, getInfoByName } from '../data/regions';
import { generateCountiesOfStateSpec, generateRelatedCountySpec, generateStateSpec } from '../specs/mapSpec';
import { stats, isMobileDevice } from '../stores';
import { isMobileDevice } from '../stores';
import DownloadMenu from '../components/DownloadMenu.svelte';
import RegionMapTooltip from './RegionMapTooltip.svelte';

Expand All @@ -20,17 +20,17 @@
*/
export let sensor;
/**
* @type {import("../../stores/params").DataFetcher}
* @type {import("../../stores/DataFetcher").DataFetcher}
*/
export let fetcher;

/**
* @param {import("../../stores/params").SensorParam} sensor
* @param {import("../../stores/params").RegionParam} region
*/
function genSpec(stats, sensor, region) {
function genSpec(sensor, region) {
const options = {
domain: sensor.domain(stats, region.level === 'state' || region.level === 'county' ? 'county' : 'state'),
domain: sensor.domain(region.level === 'state' || region.level === 'county' ? 'county' : 'state'),
withStates: true,
scheme: sensor.value.vegaColorScale,
};
Expand Down Expand Up @@ -74,7 +74,7 @@
return `${sensor.name}_${regionName}_${formatDateISO(date.value)}`;
}

$: spec = genSpec($stats, sensor, region);
$: spec = genSpec(sensor, region);
$: data = loadData(sensor, date);

$: showsUS = region.level === 'nation';
Expand Down
Loading