Skip to content

Commit c0fe9f5

Browse files
authored
Merge pull request #1191 from cmu-delphi/release/v3.2.3
Release v3.2.3
2 parents 6e8dac5 + bcc811c commit c0fe9f5

31 files changed

+15382
-14327
lines changed

package-lock.json

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

package.json

Lines changed: 56 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "www-covidcast",
3-
"version": "3.2.2",
3+
"version": "3.2.3",
44
"private": true,
55
"license": "MIT",
66
"description": "",
@@ -40,89 +40,90 @@
4040
"prepack": "npm run build"
4141
},
4242
"devDependencies": {
43-
"@babel/core": "^7.16.0",
44-
"@babel/preset-env": "^7.16.4",
45-
"@fortawesome/fontawesome-free": "^5.15.4",
46-
"@octokit/request": "^5.6.2",
47-
"@popperjs/core": "^2.10.2",
48-
"@testing-library/jest-dom": "^5.15.0",
49-
"@testing-library/svelte": "^3.0.3",
50-
"@tsconfig/svelte": "^2.0.1",
51-
"@types/d3-color": "^3.0.2",
43+
"@babel/core": "^7.18.6",
44+
"@babel/preset-env": "^7.18.6",
45+
"@fortawesome/fontawesome-free": "^5",
46+
"@octokit/request": "^5.6.3",
47+
"@popperjs/core": "^2.11.5",
48+
"@testing-library/jest-dom": "^5.16.4",
49+
"@testing-library/svelte": "^3.1.3",
50+
"@tsconfig/svelte": "^3.0.0",
51+
"@types/d3-color": "^3.1.0",
5252
"@types/d3-dsv": "^3.0.0",
5353
"@types/d3-format": "^3.0.1",
5454
"@types/d3-geo": "^3.0.2",
5555
"@types/d3-scale": "^4.0.2",
5656
"@types/d3-scale-chromatic": "^3.0.0",
5757
"@types/d3-time": "^3.0.0",
5858
"@types/d3-time-format": "^4.0.0",
59-
"@types/jest": "^27.0.3",
60-
"@types/lodash-es": "^4.17.5",
59+
"@types/jest": "^28.1.3",
60+
"@types/lodash-es": "^4.17.6",
6161
"@types/lz-string": "^1.3.34",
62-
"@types/marked": "^4.0.1",
63-
"@types/node": "^16.11.9",
64-
"@typescript-eslint/eslint-plugin": "^5.4.0",
65-
"@typescript-eslint/parser": "^5.4.0",
66-
"babel-jest": "^27.3.1",
67-
"babel-loader": "^8.2.3",
62+
"@types/marked": "^4.0.3",
63+
"@types/node": "^18.0.0",
64+
"@typescript-eslint/eslint-plugin": "^5.30.0",
65+
"@typescript-eslint/parser": "^5.30.0",
66+
"babel-jest": "^28.1.1",
67+
"babel-loader": "^8.2.5",
6868
"clean-webpack-plugin": "^4.0.0",
69-
"concurrently": "^6.4.0",
70-
"copy-webpack-plugin": "^10.0.0",
71-
"core-js": "^3.19.1",
69+
"concurrently": "^7.2.2",
70+
"copy-webpack-plugin": "^11.0.0",
71+
"core-js": "^3.23.3",
7272
"cross-env": "^7.0.3",
73-
"css-loader": "^6.5.1",
74-
"css-minimizer-webpack-plugin": "^3.1.4",
75-
"d3-color": "^3.0.1",
73+
"css-loader": "^6.7.1",
74+
"css-minimizer-webpack-plugin": "^4.0.0",
75+
"d3-color": "^3.1.0",
7676
"d3-dsv": "^3.0.1",
77-
"d3-format": "^3.0.1",
77+
"d3-format": "^3.1.0",
7878
"d3-scale": "^4.0.2",
7979
"d3-scale-chromatic": "^3.0.0",
8080
"d3-time": "^3.0.0",
81-
"d3-time-format": "^4.0.0",
82-
"eslint": "^8.3.0",
83-
"eslint-plugin-svelte3": "^3.2.1",
81+
"d3-time-format": "^4.1.0",
82+
"eslint": "^8.18.0",
83+
"eslint-plugin-svelte3": "^4.0.0",
8484
"file-loader": "^6.2.0",
8585
"geo-albers-usa-territories": "^0.1.0",
8686
"html-webpack-plugin": "^5.5.0",
87-
"http-server": "^14.0.0",
88-
"husky": "^7.0.4",
87+
"http-server": "^14.1.1",
88+
"husky": "^8.0.1",
8989
"identity-obj-proxy": "^3.0.0",
90-
"jest": "^27.3.1",
90+
"jest": "^28.1.1",
91+
"jest-environment-jsdom": "^28.1.1",
9192
"js-cookie": "^3.0.1",
9293
"js-yaml": "^4.1.0",
93-
"lint-staged": "^12.1.2",
94+
"lint-staged": "^13.0.3",
9495
"lodash-es": "^4.17.21",
95-
"marked": "^4.0.10",
96-
"mini-css-extract-plugin": "^2.4.5",
97-
"node-fetch": "^2.6.7",
98-
"prettier": "^2.4.1",
99-
"prettier-plugin-svelte": "^2.5.0",
96+
"marked": "^4.0.17",
97+
"mini-css-extract-plugin": "^2.6.1",
98+
"node-fetch": "^2",
99+
"prettier": "^2.7.1",
100+
"prettier-plugin-svelte": "^2.7.0",
100101
"raw-loader": "^4.0.2",
101102
"regenerator-runtime": "^0.13.9",
102103
"resize-observer-polyfill": "^1.5.1",
103-
"sass": "^1.43.4",
104-
"sass-loader": "^12.3.0",
104+
"sass": "^1.53.0",
105+
"sass-loader": "^13.0.2",
105106
"style-loader": "^3.3.1",
106-
"svelte": "^3.44.2",
107-
"svelte-check": "^2.2.10",
107+
"svelte": "^3.49.0",
108+
"svelte-check": "^2.8.0",
108109
"svelte-icons": "^2.1.0",
109-
"svelte-jester": "^2.1.5",
110-
"svelte-loader": "^3.1.2",
111-
"svelte-preprocess": "^4.9.8",
112-
"ts-jest": "^27.0.7",
113-
"ts-loader": "^9.2.6",
114-
"tslib": "^2.3.1",
115-
"typescript": "^4.5.2",
110+
"svelte-jester": "^2.3.2",
111+
"svelte-loader": "^3.1.3",
112+
"svelte-preprocess": "^4.10.7",
113+
"ts-jest": "^28.0.5",
114+
"ts-loader": "^9.3.1",
115+
"tslib": "^2.4.0",
116+
"typescript": "^4.7.4",
116117
"url-loader": "^4.1.1",
117-
"vega": "^5.21.0",
118-
"vega-embed": "6.20.0",
119-
"vega-lite": "^5.1.1",
120-
"webpack": "^5.64.2",
121-
"webpack-cli": "^4.9.1",
122-
"webpack-dev-server": "^4.5.0"
118+
"vega": "^5.22.1",
119+
"vega-embed": "6.21.0",
120+
"vega-lite": "^5.2.0",
121+
"webpack": "^5.73.0",
122+
"webpack-cli": "^4.10.0",
123+
"webpack-dev-server": "^4.9.2"
123124
},
124125
"dependencies": {
125-
"uikit": "^3.9.3"
126+
"uikit": "^3.14.3"
126127
},
127128
"lint-staged": {
128129
"*.{ts,js,svelte}": "eslint --cache --fix",

src/blocks/HistoryLineChart.svelte

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,6 @@
383383
filterLine = signals.filter((_, i) => filterLineManaged[i]);
384384
}
385385
$: {
386-
console.log(filterLineManaged);
387386
updateFilteredLine(sensor, ageStratifictions, filterLineManaged);
388387
}
389388
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<script>
2+
import { formatDateYearDayOfWeekAbbr } from '../formats';
3+
import { getLevelInfo } from '../stores';
4+
5+
/**
6+
* @type {import("../data/sensor").Sensor}
7+
*/
8+
export let sensor;
9+
/**
10+
* @type {Date}
11+
*/
12+
export let date;
13+
/**
14+
* @type {import("../data/regions").RegionLevel}
15+
*/
16+
export let level;
17+
18+
/**
19+
* @type {import("../data/trend").SensorTrend }
20+
*/
21+
export let trend;
22+
23+
/**
24+
* two way binding
25+
*/
26+
export let suffix = '';
27+
28+
export let prefix = '*';
29+
30+
$: showWarning = trend.then((d) => {
31+
if (
32+
(d != null && (d.value == null || (d.date != null && d.date < date))) ||
33+
(d.date_value != null && d.date_value < date)
34+
) {
35+
suffix = '*';
36+
return d;
37+
}
38+
suffix = '';
39+
return null;
40+
});
41+
</script>
42+
43+
{#await showWarning then d}
44+
{#if d != null}
45+
<p>
46+
{prefix} The indicator "{sensor.name}" is not available for {formatDateYearDayOfWeekAbbr(date)} at the geographic level
47+
"{getLevelInfo(level).label}", yet. The data from {formatDateYearDayOfWeekAbbr(d.date ?? d.date_value)} is displayed
48+
instead.
49+
</p>
50+
{/if}
51+
{/await}

src/blocks/IndicatorWarning.svelte

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script>
2+
import { formatAPITime } from '../data';
23
import { formatDateYearDayOfWeekAbbr } from '../formats';
34
import { getLevelInfo } from '../stores';
45
@@ -22,6 +23,9 @@
2223
function checkSensorData(sensor, date, region) {
2324
return fetcher.fetch1Sensor1Region1DateDetails(sensor, region, date);
2425
}
26+
function switchDate() {
27+
date.set(sensor.timeFrame.max);
28+
}
2529
</script>
2630

2731
{#if !sensor.value.levels.includes(region.level)}
@@ -32,7 +36,11 @@
3236
{#await checkSensorData(sensor, date, region) then hasData}
3337
{#if !hasData}
3438
<div data-uk-alert class="uk-alert-warning">
35-
The indicator "{sensor.name}" is not available for {formatDateYearDayOfWeekAbbr(date.value)}, yet.
39+
The indicator "{sensor.name}" is not available for {formatDateYearDayOfWeekAbbr(date.value)}, yet. The latest
40+
known data is available on
41+
<a href="?date={formatAPITime(sensor.timeFrame.max)}" on:click={switchDate}
42+
>{formatDateYearDayOfWeekAbbr(sensor.timeFrame.max)}</a
43+
>.
3644
</div>
3745
{/if}
3846
{/await}

src/blocks/RegionCountyMap.svelte

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import DownloadMenu from '../components/DownloadMenu.svelte';
88
import RegionMapTooltip from './RegionMapTooltip.svelte';
99
import FullWidthWrapper from '../components/FullWidthWrapper.svelte';
10+
import IndicatorFallbackWarning from './IndicatorFallbackWarning.svelte';
1011
1112
/**
1213
* @type {import("../../stores/params").DateParam}
@@ -25,10 +26,15 @@
2526
*/
2627
export let fetcher;
2728
29+
/**
30+
* two way binding
31+
*/
32+
export let suffix = '';
33+
2834
$: spec = generateStateMapWithCountyDataSpec({
2935
...sensor.vegaSchemeDomain('county'),
3036
});
31-
$: data = fetcher.fetch1SensorNRegions1Date(sensor, 'county', date);
37+
$: data = fetcher.fetch1SensorNRegions1DateWithFallback(sensor, 'county', date);
3238
3339
function onClickHandler(evt) {
3440
const item = evt.detail.item;
@@ -61,3 +67,11 @@
6167
/>
6268
</div>
6369
</FullWidthWrapper>
70+
71+
<IndicatorFallbackWarning
72+
sensor={sensor.value}
73+
level="county"
74+
date={date.value}
75+
trend={data.then((rows) => rows[0])}
76+
bind:suffix
77+
/>

src/blocks/RegionMap.svelte

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import DownloadMenu from '../components/DownloadMenu.svelte';
88
import FullWidthWrapper from '../components/FullWidthWrapper.svelte';
99
import RegionMapTooltip from './RegionMapTooltip.svelte';
10+
import IndicatorFallbackWarning from './IndicatorFallbackWarning.svelte';
1011
1112
/**
1213
* @type {import("../../stores/params").DateParam}
@@ -59,20 +60,25 @@
5960
const hasCounty = sensor.value.levels.includes('county');
6061
if (region.level === 'state' && hasCounty) {
6162
const counties = getCountiesOfState(region.value);
62-
const countyData = fetcher.fetch1SensorNRegions1Date(
63+
const countyData = fetcher.fetch1SensorNRegions1DateWithFallback(
6364
sensor,
6465
[...counties, getInfoByName(`${region.id}000`)],
6566
date,
6667
);
67-
const stateData = fetcher.fetch1SensorNRegions1Date(sensor, 'state', date);
68+
const stateData = fetcher.fetch1SensorNRegions1DateWithFallback(sensor, 'state', date);
6869
return Promise.all([countyData, stateData]).then((r) => r.flat());
6970
}
7071
if (region.level === 'county' && hasCounty) {
7172
return fetcher.fetch1SensorNRegions1Date(sensor, 'county', date);
7273
}
73-
return fetcher.fetch1SensorNRegions1Date(sensor, 'state', date);
74+
return fetcher.fetch1SensorNRegions1DateWithFallback(sensor, 'state', date);
7475
}
7576
77+
$: fallbackLevel =
78+
region.level === 'county' || (region.level === 'state' && sensor.value.levels.includes('county'))
79+
? 'county'
80+
: 'state';
81+
7682
function generateFileName(sensor, date, region) {
7783
const hasCounty = sensor.value.levels.includes('county');
7884
let regionName = region.level === 'nation' || !hasCounty ? 'US States' : 'US Counties';
@@ -115,3 +121,19 @@
115121
<DownloadMenu {vegaRef} {data} {sensor} absolutePos {fileName} />
116122
</div>
117123
</FullWidthWrapper>
124+
125+
<IndicatorFallbackWarning
126+
sensor={sensor.value}
127+
level={fallbackLevel}
128+
date={date.value}
129+
trend={data.then((rows) => rows[0])}
130+
/>
131+
{#if fallbackLevel === 'county'}
132+
<IndicatorFallbackWarning
133+
prefix=""
134+
sensor={sensor.value}
135+
level={'state'}
136+
date={date.value}
137+
trend={data.then((rows) => rows.find((d) => d.level === 'state'))}
138+
/>
139+
{/if}

src/blocks/RegionMapWrapper.svelte

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
*/
2323
export let fetcher;
2424
25+
let suffix = '';
26+
2527
$: hasCounties = sensor.value.levels.includes('county');
2628
let showChoropleth = false;
2729
</script>
@@ -34,11 +36,16 @@
3436
Click on a state to explore further
3537
</p>
3638
<div class="toggle-center-wrapper">
37-
<Toggle bind:checked={showChoropleth} before="Beehive Grid"><span>Choropleth Map</span></Toggle>
39+
<Toggle bind:checked={showChoropleth} before="Beehive Grid"
40+
><span>
41+
Choropleth Map
42+
{#if showChoropleth && hasCounties}{suffix}{/if}</span
43+
></Toggle
44+
>
3845
</div>
3946
{#if showChoropleth}
4047
{#if hasCounties}
41-
<RegionCountyMap {region} {date} {sensor} {fetcher} />
48+
<RegionCountyMap {region} {date} {sensor} {fetcher} bind:suffix />
4249
{:else}
4350
<RegionMap {region} {date} {sensor} {fetcher} />
4451
{/if}
@@ -64,7 +71,7 @@
6471
}
6572
6673
.toggle-center-wrapper :global(span) {
67-
width: 8em;
74+
width: 9em;
6875
}
6976
7077
.ux-hint {

src/components/KPI.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
export let sub = null;
1010
1111
export let loading = false;
12+
13+
export let asterisk = false;
1214
</script>
1315

1416
<span class="text" class:loading>{text || 'N/A'}</span>
1517
{#if sub}<span class="fraction">{sub}</span>{/if}
18+
{#if asterisk}<span class="text">*</span>{/if}
1619

1720
<style>
1821
.text {

0 commit comments

Comments
 (0)